Julia Set - CUDA by example - help me set up a project

I read CUDA following the example of Jason Sanders and Edward Kandro, and I became acquainted with Chapter 4, where they solve the Julia Set using CUDA. In addition, the book page has source code; https://developer.nvidia.com/content/cuda-example-introduction-general-purpose-gpu-programming-0

When I try to include all the files needed for the project (all the header and .cu files), it will not compile. My regular CUDA projects, which I create from scratch, work without problems (VS 2010, CUDA 5.0).

Someone had the same problem, and can you point out each step to set this Julia kit as it should be?

PS Here is the code that will not work in the 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__ 

The line that produces the first error:

 PFNGLBINDBUFFERARBPROC glBindBuffer = NULL; 

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

Thank you very much

+4
source share
1 answer

to start it correctly, you must first download the source code from:

then remove 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 the path to include. also add the lib folder as the library path and bin as the executable path.

then you can add a new cu file to your project and copy the contents of the chapter 4 folder you will ever need, and paste it there and compile it.

if it has not been compiled yet, you should go to the project properties → linker and find "Additional dependency" and add cudart.lib, and you are all set.

also note that the included phrases in the book code look like this: /.../common/book.h , you must change them to the common/book.h .

+5
source

All Articles