4

I have been reading CUDA by Example by Jason Sanders and Edward Kandrot and have come across chapter 4 where they solve Julia Set using CUDA. Also, there is a source code available on a books page; https://developer.nvidia.com/content/cuda-example-introduction-general-purpose-gpu-programming-0

When I try to include all the files necessary for the project (all header files and .cu ones) it won't compile. My usual CUDA projects that I create from scratch work without problems (VS 2010, CUDA 5.0).

Did anyone had the same problem and can you please specify each step in order to make this Julia Set set up as it should be?

P.S. Here is a code that won't work in header file:

/*
 * Copyright 1993-2010 NVIDIA Corporation.  All rights reserved.
 *
 * NVIDIA Corporation and its licensors retain all intellectual property and
 * proprietary rights in and to this software and related documentation.
 * Any use, reproduction, disclosure, or distribution of this software
 * and related documentation without an express license agreement from
 * NVIDIA Corporation is strictly prohibited.
 *
 * Please refer to the applicable NVIDIA end user license agreement (EULA)
 * associated with this source code for terms and conditions that govern
 * your use of this NVIDIA software.
 *
 */


#ifndef __GPU_ANIM_H__
#define __GPU_ANIM_H__

#include "gl_helper.h"

#include "cuda.h"
#include "cuda_gl_interop.h"
#include <iostream>


PFNGLBINDBUFFERARBPROC    glBindBuffer     = NULL;
PFNGLDELETEBUFFERSARBPROC glDeleteBuffers  = NULL;
PFNGLGENBUFFERSARBPROC    glGenBuffers     = NULL;
PFNGLBUFFERDATAARBPROC    glBufferData     = NULL;


struct GPUAnimBitmap {
    GLuint  bufferObj;
    cudaGraphicsResource *resource;
    int     width, height;
    void    *dataBlock;
    void (*fAnim)(uchar4*,void*,int);
    void (*animExit)(void*);
    void (*clickDrag)(void*,int,int,int,int);
    int     dragStartX, dragStartY;

    GPUAnimBitmap( int w, int h, void *d = NULL ) {
        width = w;
        height = h;
        dataBlock = d;
        clickDrag = NULL;

        // first, find a CUDA device and set it to graphic interop
        cudaDeviceProp  prop;
        int dev;
        memset( &prop, 0, sizeof( cudaDeviceProp ) );
        prop.major = 1;
        prop.minor = 0;
        HANDLE_ERROR( cudaChooseDevice( &dev, &prop ) );
        cudaGLSetGLDevice( dev );

        // a bug in the Windows GLUT implementation prevents us from
        // passing zero arguments to glutInit()
        int c=1;
        char* dummy = "";
        glutInit( &c, &dummy );
        glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA );
        glutInitWindowSize( width, height );
        glutCreateWindow( "bitmap" );

        glBindBuffer    = (PFNGLBINDBUFFERARBPROC)GET_PROC_ADDRESS("glBindBuffer");
        glDeleteBuffers = (PFNGLDELETEBUFFERSARBPROC)GET_PROC_ADDRESS("glDeleteBuffers");
        glGenBuffers    = (PFNGLGENBUFFERSARBPROC)GET_PROC_ADDRESS("glGenBuffers");
        glBufferData    = (PFNGLBUFFERDATAARBPROC)GET_PROC_ADDRESS("glBufferData");

        glGenBuffers( 1, &bufferObj );
        glBindBuffer( GL_PIXEL_UNPACK_BUFFER_ARB, bufferObj );
        glBufferData( GL_PIXEL_UNPACK_BUFFER_ARB, width * height * 4,
                      NULL, GL_DYNAMIC_DRAW_ARB );

        HANDLE_ERROR( cudaGraphicsGLRegisterBuffer( &resource, bufferObj, cudaGraphicsMapFlagsNone ) );
    }

    ~GPUAnimBitmap() {
        free_resources();
    }

    void free_resources( void ) {
        HANDLE_ERROR( cudaGraphicsUnregisterResource( resource ) );

        glBindBuffer( GL_PIXEL_UNPACK_BUFFER_ARB, 0 );
        glDeleteBuffers( 1, &bufferObj );
    }


    long image_size( void ) const { return width * height * 4; }

    void click_drag( void (*f)(void*,int,int,int,int)) {
        clickDrag = f;
    }

    void anim_and_exit( void (*f)(uchar4*,void*,int), void(*e)(void*) ) {
        GPUAnimBitmap**   bitmap = get_bitmap_ptr();
        *bitmap = this;
        fAnim = f;
        animExit = e;

        glutKeyboardFunc( Key );
        glutDisplayFunc( Draw );
        if (clickDrag != NULL)
            glutMouseFunc( mouse_func );
        glutIdleFunc( idle_func );
        glutMainLoop();
    }

    // static method used for glut callbacks
    static GPUAnimBitmap** get_bitmap_ptr( void ) {
        static GPUAnimBitmap*   gBitmap;
        return &gBitmap;
    }

    // static method used for glut callbacks
    static void mouse_func( int button, int state,
                            int mx, int my ) {
        if (button == GLUT_LEFT_BUTTON) {
            GPUAnimBitmap*   bitmap = *(get_bitmap_ptr());
            if (state == GLUT_DOWN) {
                bitmap->dragStartX = mx;
                bitmap->dragStartY = my;
            } else if (state == GLUT_UP) {
                bitmap->clickDrag( bitmap->dataBlock,
                                   bitmap->dragStartX,
                                   bitmap->dragStartY,
                                   mx, my );
            }
        }
    }

    // static method used for glut callbacks
    static void idle_func( void ) {
        static int ticks = 1;
        GPUAnimBitmap*  bitmap = *(get_bitmap_ptr());
        uchar4*         devPtr;
        size_t  size;

        HANDLE_ERROR( cudaGraphicsMapResources( 1, &(bitmap->resource), NULL ) );
        HANDLE_ERROR( cudaGraphicsResourceGetMappedPointer( (void**)&devPtr, &size, bitmap->resource) );

        bitmap->fAnim( devPtr, bitmap->dataBlock, ticks++ );

        HANDLE_ERROR( cudaGraphicsUnmapResources( 1, &(bitmap->resource), NULL ) );

        glutPostRedisplay();
    }

    // static method used for glut callbacks
    static void Key(unsigned char key, int x, int y) {
        switch (key) {
            case 27:
                GPUAnimBitmap*   bitmap = *(get_bitmap_ptr());
                if (bitmap->animExit)
                    bitmap->animExit( bitmap->dataBlock );
                bitmap->free_resources();
                exit(0);
        }
    }

    // static method used for glut callbacks
    static void Draw( void ) {
        GPUAnimBitmap*   bitmap = *(get_bitmap_ptr());
        glClearColor( 0.0, 0.0, 0.0, 1.0 );
        glClear( GL_COLOR_BUFFER_BIT );
        glDrawPixels( bitmap->width, bitmap->height, GL_RGBA,
                      GL_UNSIGNED_BYTE, 0 );
        glutSwapBuffers();
    }
};


#endif  // __GPU_ANIM_H__

Line that is making a first error is :

PFNGLBINDBUFFERARBPROC    glBindBuffer     = NULL;

VS says: IntelliSense: PCH warning: header stop cannot be in a macro or #if block. An intellisense PCH file was not generated.

thank you very much

Antun Tun
  • 1,507
  • 5
  • 20
  • 38
  • 1
    Won't compile isn't a very specific description of a problem. What errors are you getting? Compilation or linkage? What is the errors message? The better description of the problem you can give, the more likely you are to get a useful answer. – talonmies Feb 07 '13 at 08:00
  • IF you are having Visual Studio and intellisense problems, I suggest reading [this question](http://stackoverflow.com/q/3778799/681865) if you have not already done so. – talonmies Feb 07 '13 at 08:53
  • Than kyou for your time but mine VS works without any problems – Antun Tun Feb 07 '13 at 09:01
  • Hey guys, I updated my problem, can you please look at it now, thanks – Antun Tun Feb 07 '13 at 14:49

1 Answers1

5

to run it properly you have to first download the source codes from :`CUDA by Example source code

then extract it. when you create your project in visual studio, if it is 2010 and newer you should go to the project properties and go to VC++ Directories and add the extracted folder as an include path. also add the lib folder as library path and the bin as the executable path.

then you can add a new cu file to your project and copy the content of the chapter 4 folder -which ever file you want from that- and paste it there and compile it.

if still it doesn't compile, you should go to project properties -> linker and find the "Additional Dependency" and add cudart.lib and you are all set.

also pay attention that the include phrases in the books code are like this: /.../common/book.h , you should change them to common/book.h format.

Soroosh Bateni
  • 897
  • 9
  • 20
  • Thanks, I will try and if it works give you a points, thanks once again – Antun Tun Feb 08 '13 at 17:04
  • Can you tell me where is cudart.lib? I get an error like this: Unable to create directory. The given path's format is not supported. So would like to add this cudart.lib to try with it – Antun Tun Feb 08 '13 at 17:17
  • OK, no luck, again the same error: Unable to create directory. The given path's format is not supported. – Antun Tun Feb 08 '13 at 17:22
  • it's already in the paths that Visual Studio knows them, you should just add it to additional dependencies under linker->general in the right pane in the project properties, also this error isn't because of that, some of the paths you entered are wrong or you don't have permission to write where you want to write. try running the vs as an administrator but be careful. – Soroosh Bateni Feb 08 '13 at 17:25
  • just double click on the error to bring the corresponding line and paste the line here. – Soroosh Bateni Feb 08 '13 at 17:37