static CUresult initCuda(CUcontext _cuContext, char* executablePath, CUfunction *mathop, int argc, char** argv, const char* cubin_name, const char* kernel_name) { CUdevice cuDevice; CUT_DEVICE_INIT_DRV(cuDevice, argc, argv); print_GetProperties(cuDevice); CUresult status = cuCtxCreate( &_cuContext, 0, cuDevice ); if ( CUDA_SUCCESS != status ) { Error(_cuContext, status); } else printf("(1) context creation successful\n"); char* module_path = cutFindFilePath(cubin_name, executablePath); printf ("\t cubin:%s, path:%s, mmp_ptr:%lu\n", cubin_name, executablePath, module_path); if(module_path != NULL) printf ("\t cubin:%s, path:%s, module_path:%c%c%c%c\n", cubin_name, executablePath, *module_path, *(module_path+1), *(module_path+2), *(module_path+3)); char* data_path = "./data/"; size_t len_path = strlen(data_path); size_t len_fn = strlen(cubin_name); // printf ("Sizes: data:%lu, cubinname:%lu\n", len_path, len_fn); char* module_path_new = (char*)malloc(sizeof(char) * (len_path + len_fn)); strcpy(module_path_new, data_path); strcat(module_path_new, cubin_name); strcat(module_path_new, "\0"); if (module_path_new == 0) { status = CUDA_ERROR_NOT_FOUND; Error(_cuContext, status); } FILE *fp = fopen(module_path_new,"r"); if( fp ) { printf("(2) cubin_File found in modulepath:%s\n", module_path_new); fclose(fp); } else { printf("(2) cubin file not exist: %s\n", module_path_new); } CUmodule cuModule; status = cuModuleLoad(&cuModule, module_path_new); cutFree(module_path_new); if ( CUDA_SUCCESS != status ) { Error(_cuContext, status); } else printf ("(3) module Load successful\n"); CUfunction cuFunction = 0; status = cuModuleGetFunction(&cuFunction, cuModule, kernel_name); if ( CUDA_SUCCESS != status) { Error(_cuContext, status); } else printf ("(4) getFunction successful w/cuFunction\n"); *mathop = cuFunction; return CUDA_SUCCESS; }
//////////////////////////////////////////////////////////////////////////////// //! Initialize GL //////////////////////////////////////////////////////////////////////////////// CUTBoolean initGL(int *argc, char **argv) { // Create GL context glutInit(argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(windowW, windowH); glutCreateWindow("CUDA FFT Ocean Simulation"); vertShaderPath = cutFindFilePath("ocean.vert", argv[0]); fragShaderPath = cutFindFilePath("ocean.frag", argv[0]); if (vertShaderPath == 0 || fragShaderPath == 0) { fprintf(stderr, "Error finding shader files!\n"); cudaThreadExit(); exit(EXIT_FAILURE); } // initialize necessary OpenGL extensions glewInit(); if (! glewIsSupported("GL_VERSION_2_0 " )) { fprintf(stderr, "ERROR: Support for necessary OpenGL extensions missing."); fflush(stderr); return CUTFalse; } if (!glewIsSupported( "GL_VERSION_1_5 GL_ARB_vertex_buffer_object GL_ARB_pixel_buffer_object" )) { fprintf(stderr, "Error: failed to get minimal extensions for demo\n"); fprintf(stderr, "This sample requires:\n"); fprintf(stderr, " OpenGL version 1.5\n"); fprintf(stderr, " GL_ARB_vertex_buffer_object\n"); fprintf(stderr, " GL_ARB_pixel_buffer_object\n"); cleanup(); exit(-1); } // default initialization glClearColor(0.0, 0.0, 0.0, 1.0); glEnable(GL_DEPTH_TEST); // load shader shaderProg = loadGLSLProgram(vertShaderPath, fragShaderPath); CUT_CHECK_ERROR_GL(); return CUTTrue; }
void loadDefaultImage( int argc, char ** argv ) { printf("Reading image: lena.pgm\n"); const char* image_filename = "lena.pgm"; char* image_path = cutFindFilePath(image_filename, argv[0] ); if (image_path == 0) { printf( "Reading image failed.\n"); exit(EXIT_FAILURE); } initializeData( image_path, argc, argv ); cutFree( image_path ); }
void loadDefaultImage( int argc, char ** argv ) { printf("Loading input image: lena.pgm\n"); const char* image_filename = "lena.pgm"; char* image_path = cutFindFilePath(image_filename, argv[0] ); if (image_path == NULL) { printf( "FunctionPointers unable to find and load image file <%s>.\nExiting...\n", image_filename); shrQAFinishExit(argc, (const char **)argv, QA_FAILED); } initializeData( image_path, argc, argv ); cutFree( image_path ); }
void runAutoTest(int argc, char **argv) { int devID = 0; printf("[%s] - (automated testing w/ readback)\n", sSDKsample); devID = cutilChooseCudaDevice(argc, argv); // First load the image, so we know what the size of the image (imageW and imageH) printf("Allocating host and CUDA memory and loading image file...\n"); const char *image_path = cutFindFilePath("portrait_noise.bmp", argv[0]); if (image_path == NULL) { printf( "imageDenoisingGL was unable to find and load image file <portrait_noise.bmp>.\nExiting...\n"); shrQAFinishExit(argc, (const char **)argv, QA_FAILED); } LoadBMPFile(&h_Src, &imageW, &imageH, image_path); printf("Data init done.\n"); cutilSafeCall( CUDA_MallocArray(&h_Src, imageW, imageH) ); g_CheckRender = new CheckBackBuffer(imageW, imageH, sizeof(TColor), false); g_CheckRender->setExecPath(argv[0]); TColor *d_dst = NULL; cutilSafeCall( cudaMalloc( (void **)&d_dst, imageW*imageH*sizeof(TColor)) ); while (g_Kernel <= 3) { printf("[AutoTest]: %s <%s>\n", sSDKsample, filterMode[g_Kernel]); cutilSafeCall( CUDA_Bind2TextureArray() ); runImageFilters(d_dst); cutilSafeCall( CUDA_UnbindTexture() ); cutilSafeCall( cutilDeviceSynchronize() ); cudaMemcpy(g_CheckRender->imageData(), d_dst, imageW*imageH*sizeof(TColor), cudaMemcpyDeviceToHost); g_CheckRender->savePPM(sOriginal[g_Kernel], true, NULL); if (!g_CheckRender->PPMvsPPM(sOriginal[g_Kernel], sReference[g_Kernel], MAX_EPSILON_ERROR, 0.15f)) { g_TotalErrors++; } g_Kernel++; } cutilSafeCall( CUDA_FreeArray() ); free(h_Src); cutilSafeCall( cudaFree( d_dst ) ); delete g_CheckRender; printf("\n[%s] -> Test Results: %d errors\n", sSDKsample, g_TotalErrors); cutilDeviceReset(); shrQAFinishExit(argc, (const char **)argv, (!g_TotalErrors ? QA_PASSED : QA_FAILED)); }
bool CheckRenderD3D10::PPMvsPPM( const char *src_file, const char *ref_file, const char *exec_path, const float epsilon, const float threshold ) { char *ref_file_path = cutFindFilePath(ref_file, exec_path); if (ref_file_path == NULL) { printf("CheckRenderD3D10::PPMvsPPM unable to find <%s> in <%s> Aborting comparison!\n", ref_file, exec_path); printf(">>> Check info.xml and [project//data] folder <%s> <<<\n", ref_file); printf("Aborting comparison!\n"); printf(" FAILURE!\n"); return false; } return cutComparePPM(src_file,ref_file_path,epsilon,threshold,true) == CUTTrue; }
void loadDefaultImage(char* loc_exec) { printf("Reading image: lena.pgm\n"); const char* image_filename = "lena.pgm"; char* image_path = cutFindFilePath(image_filename, loc_exec); if (image_path == 0) { printf( "Reading image: lena.pgm failed.\n"); exit(EXIT_FAILURE); } initializeData(image_path); cutFree(image_path); }
bool CheckRender::PGMvsPGM( const char *src_file, const char *ref_file, const float epsilon, const float threshold ) { unsigned char *src_data = NULL, *ref_data = NULL; unsigned long error_count = 0; unsigned int width, height; char *ref_file_path = cutFindFilePath(ref_file, m_ExecPath); if (ref_file_path == NULL) { printf("CheckRender::PGMvsPGM unable to find <%s> in <%s> Aborting comparison!\n", ref_file, m_ExecPath); printf(">>> Check info.xml and [project//data] folder <%s> <<<\n", ref_file); printf("Aborting comparison!\n"); printf(" FAILED\n"); error_count++; } else { if (src_file == NULL || ref_file_path == NULL) { printf("PGMvsPGM: Aborting comparison\n"); return false; } printf(" src_file <%s>\n", src_file); printf(" ref_file <%s>\n", ref_file_path); if (cutLoadPGMub(ref_file_path, &ref_data, &width, &height) != CUTTrue) { printf("PGMvsPGM: unable to load ref image file: %s\n", ref_file_path); return false; } if (cutLoadPGMub(src_file, &src_data, &width, &height) != CUTTrue) { printf("PGMvsPGM: unable to load src image file: %s\n", src_file); return false; } printf("PGMvsPGM: comparing images size (%d,%d) epsilon(%2.4f), threshold(%4.2f%%)\n", m_Height, m_Width, epsilon, threshold*100); if (cutCompareubt( ref_data, src_data, m_Height*m_Width, epsilon, threshold ) == CUTFalse) { error_count = 1; } } if (error_count == 0) { printf(" OK\n"); } else { printf(" FAILURE: %d errors...\n", (unsigned int)error_count); } return (error_count == 0); // returns true if all pixels pass }
// initialize OpenGL void initGL(int *argc, char **argv) { glutInit(argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); glutInitWindowSize(winWidth, winHeight); glutCreateWindow("CUDA Smoke Particles"); glewInit(); if (!glewIsSupported("GL_VERSION_2_0 GL_VERSION_1_5")) { fprintf(stderr, "The following required OpenGL extensions missing:\n\tGL_VERSION_2_0\n\tGL_VERSION_1_5\n"); fprintf(stderr, " PASSED\n"); cutilExit(*argc, argv); exit(-1); } if (!glewIsSupported("GL_ARB_multitexture GL_ARB_vertex_buffer_object GL_EXT_geometry_shader4")) { fprintf(stderr, "The following required OpenGL extensions missing:\n\tGL_ARB_multitexture\n\tGL_ARB_vertex_buffer_object\n\tGL_EXT_geometry_shader4.\n"); fprintf(stderr, " PASSED\n"); cutilExit(*argc, argv); exit(-1); } #if defined (_WIN32) if (wglewIsSupported("WGL_EXT_swap_control")) { // disable vertical sync wglSwapIntervalEXT(0); } #endif glEnable(GL_DEPTH_TEST); // load floor texture char* imagePath = cutFindFilePath("floortile.ppm", argv[0]); if (imagePath == 0) { fprintf(stderr, "Error finding floor image file\n"); fprintf(stderr, " FAILED\n"); exit(EXIT_FAILURE); } floorTex = loadTexture(imagePath); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f); floorProg = new GLSLProgram(floorVS, floorPS); glutReportErrors(); }
bool CheckRender::PPMvsPPM( const char *src_file, const char *ref_file, const float epsilon, const float threshold ) { unsigned long error_count = 0; char *ref_file_path = cutFindFilePath(ref_file, m_ExecPath); if (ref_file_path == NULL) { printf("CheckRender::PPMvsPPM unable to find <%s> in <%s> Aborting comparison!\n", ref_file, m_ExecPath); printf(">>> Check info.xml and [project//data] folder <%s> <<<\n", ref_file); printf("Aborting comparison!\n"); printf(" FAILED\n"); error_count++; } if (src_file == NULL || ref_file_path == NULL) { printf("PPMvsPPM: Aborting comparison\n"); return false; } printf(" src_file <%s>\n", src_file); printf(" ref_file <%s>\n", ref_file_path); return (cutComparePPM( src_file, ref_file_path, epsilon, threshold, true ) == CUTTrue ? true : false); }
void loadImage( unsigned char **img, unsigned int *width, unsigned int *height, const char* image_filename, const char* exec_path) { const char* image_path = cutFindFilePath(image_filename, exec_path); if (image_path == 0) { fprintf(stderr, "Error finding image file '%s'\n", image_filename); exit(-1); } cutilCheckError(cutLoadPGMub(image_path, img, width, height)); if (!*img) { fprintf(stderr, "Error opening file '%s'\n", image_path); exit(-1); } printf("Loaded '%s', %d x %d pixels\n", image_path, *width, *height); }
//////////////////////////////////////////////////////////////////////////////// // initialize marching cubes //////////////////////////////////////////////////////////////////////////////// void initMC(int argc, char** argv) { // parse command line arguments int n; if (cutGetCmdLineArgumenti( argc, (const char**) argv, "grid", &n)) { gridSizeLog2.x = gridSizeLog2.y = gridSizeLog2.z = n; } if (cutGetCmdLineArgumenti( argc, (const char**) argv, "gridx", &n)) { gridSizeLog2.x = n; } if (cutGetCmdLineArgumenti( argc, (const char**) argv, "gridy", &n)) { gridSizeLog2.y = n; } if (cutGetCmdLineArgumenti( argc, (const char**) argv, "gridz", &n)) { gridSizeLog2.z = n; } char *filename; if (cutGetCmdLineArgumentstr( argc, (const char**) argv, "file", &filename)) { volumeFilename = filename; } gridSize = make_uint3(1<<gridSizeLog2.x, 1<<gridSizeLog2.y, 1<<gridSizeLog2.z); gridSizeMask = make_uint3(gridSize.x-1, gridSize.y-1, gridSize.z-1); gridSizeShift = make_uint3(0, gridSizeLog2.x, gridSizeLog2.x+gridSizeLog2.y); numVoxels = gridSize.x*gridSize.y*gridSize.z; voxelSize = make_float3(2.0f / gridSize.x, 2.0f / gridSize.y, 2.0f / gridSize.z); maxVerts = gridSize.x*gridSize.y*100; printf("grid: %d x %d x %d = %d voxels\n", gridSize.x, gridSize.y, gridSize.z, numVoxels); printf("max verts = %d\n", maxVerts); #if SAMPLE_VOLUME // load volume data char* path = cutFindFilePath(volumeFilename, argv[0]); if (path == 0) { fprintf(stderr, "Error finding file '%s'\n", volumeFilename); cudaThreadExit(); exit(EXIT_FAILURE); } int size = gridSize.x*gridSize.y*gridSize.z*sizeof(uchar); uchar *volume = loadRawFile(path, size); cutilSafeCall(cudaMalloc((void**) &d_volume, size)); cutilSafeCall(cudaMemcpy(d_volume, volume, size, cudaMemcpyHostToDevice) ); free(volume); bindVolumeTexture(d_volume); #endif if (g_bQAReadback) { cudaMalloc((void **)&(d_pos), maxVerts*sizeof(float)*4); cudaMalloc((void **)&(d_normal), maxVerts*sizeof(float)*4); } else { // create VBOs createVBO(&posVbo, maxVerts*sizeof(float)*4); // DEPRECATED: cutilSafeCall( cudaGLRegisterBufferObject(posVbo) ); cutilSafeCall(cudaGraphicsGLRegisterBuffer(&cuda_posvbo_resource, posVbo, cudaGraphicsMapFlagsWriteDiscard)); createVBO(&normalVbo, maxVerts*sizeof(float)*4); // DEPRECATED: cutilSafeCall(cudaGLRegisterBufferObject(normalVbo)); cutilSafeCall(cudaGraphicsGLRegisterBuffer(&cuda_normalvbo_resource, normalVbo, cudaGraphicsMapFlagsWriteDiscard)); } // allocate textures allocateTextures( &d_edgeTable, &d_triTable, &d_numVertsTable ); // allocate device memory unsigned int memSize = sizeof(uint) * numVoxels; cutilSafeCall(cudaMalloc((void**) &d_voxelVerts, memSize)); cutilSafeCall(cudaMalloc((void**) &d_voxelVertsScan, memSize)); cutilSafeCall(cudaMalloc((void**) &d_voxelOccupied, memSize)); cutilSafeCall(cudaMalloc((void**) &d_voxelOccupiedScan, memSize)); cutilSafeCall(cudaMalloc((void**) &d_compVoxelArray, memSize)); // initialize CUDPP scan CUDPPConfiguration config; config.algorithm = CUDPP_SCAN; config.datatype = CUDPP_UINT; config.op = CUDPP_ADD; config.options = CUDPP_OPTION_FORWARD | CUDPP_OPTION_EXCLUSIVE; cudppPlan(&scanplan, config, numVoxels, 1, 0); }
bool CheckRender::compareBin2BinFloat(const char *src_file, const char *ref_file, unsigned int nelements, const float epsilon, const float threshold) { float *src_buffer, *ref_buffer; FILE *src_fp = NULL, *ref_fp = NULL; size_t fsize = 0; unsigned long error_count = 0; if ((src_fp = fopen(src_file, "rb")) == NULL) { printf("compareBin2Bin <float> unable to open src_file: %s\n", src_file); error_count = 1; } char *ref_file_path = cutFindFilePath(ref_file, m_ExecPath); if (ref_file_path == NULL) { printf("compareBin2Bin <float> unable to find <%s> in <%s>\n", ref_file, m_ExecPath); printf(">>> Check info.xml and [project//data] folder <%s> <<<\n", m_ExecPath); printf("Aborting comparison!\n"); printf(" FAILED\n"); error_count++; if (src_fp) fclose(src_fp); if (ref_fp) fclose(ref_fp); } else { if ((ref_fp = fopen(ref_file_path, "rb")) == NULL) { printf("compareBin2Bin <float> unable to open ref_file: %s\n", ref_file_path); error_count = 1; } if (src_fp && ref_fp) { src_buffer = (float *)malloc(nelements*sizeof(float)); ref_buffer = (float *)malloc(nelements*sizeof(float)); fsize = fread(src_buffer, nelements, sizeof(float), src_fp); fsize = fread(ref_buffer, nelements, sizeof(float), ref_fp); printf("> compareBin2Bin <float> nelements=%d, epsilon=%4.2f, threshold=%4.2f\n", nelements, epsilon, threshold); printf(" src_file <%s>\n", src_file); printf(" ref_file <%s>\n", ref_file_path); if (!cutComparefet( ref_buffer, src_buffer, nelements, epsilon, threshold)) { error_count++; } fclose(src_fp); fclose(ref_fp); free(src_buffer); free(ref_buffer); } else { if (src_fp) fclose(src_fp); if (ref_fp) fclose(ref_fp); } } if (error_count == 0) { printf(" OK\n"); } else { printf(" FAILURE: %d errors...\n", (unsigned int)error_count); } return (error_count == 0); // returns true if all pixels pass }
int main(int argc, char **argv) { shrQAStart(argc, argv); if (argc > 1) { if (cutCheckCmdLineFlag(argc, (const char **)argv, "qatest") || cutCheckCmdLineFlag(argc, (const char **)argv, "noprompt")) { g_bQAReadback = true; fpsLimit = frameCheckNumber; } if (cutCheckCmdLineFlag(argc, (const char **)argv, "glverify")) { g_bOpenGLQA = true; g_bFBODisplay = false; fpsLimit = frameCheckNumber; } if (cutCheckCmdLineFlag(argc, (const char **)argv, "fbo")) { g_bFBODisplay = true; fpsLimit = frameCheckNumber; } } if (g_bQAReadback) { runAutoTest(argc, argv); } else { printf("[%s] ", sSDKsample); if (g_bFBODisplay) printf("[FBO Display] "); if (g_bOpenGLQA) printf("[OpenGL Readback Comparisons] "); printf("\n"); // use command-line specified CUDA device, otherwise use device with highest Gflops/s if ( cutCheckCmdLineFlag(argc, (const char **)argv, "device")) { printf("[%s]\n", argv[0]); printf(" Does not explicitly support -device=n in OpenGL mode\n"); printf(" To use -device=n, the sample must be running w/o OpenGL\n\n"); printf(" > %s -device=n -qatest\n", argv[0]); printf("exiting...\n"); exit(0); } // First load the image, so we know what the size of the image (imageW and imageH) printf("Allocating host and CUDA memory and loading image file...\n"); const char *image_path = cutFindFilePath("portrait_noise.bmp", argv[0]); if (image_path == NULL) { printf( "imageDenoisingGL was unable to find and load image file <portrait_noise.bmp>.\nExiting...\n"); shrQAFinishExit(argc, (const char **)argv, QA_FAILED); } LoadBMPFile(&h_Src, &imageW, &imageH, image_path); printf("Data init done.\n"); // First initialize OpenGL context, so we can properly set the GL for CUDA. // This is necessary in order to achieve optimal performance with OpenGL/CUDA interop. initGL( &argc, argv ); cudaGLSetGLDevice( cutGetMaxGflopsDeviceId() ); cutilSafeCall( CUDA_MallocArray(&h_Src, imageW, imageH) ); initOpenGLBuffers(); // Creating the Auto-Validation Code if (g_bOpenGLQA) { if (g_bFBODisplay) { g_CheckRender = new CheckFBO(imageW, imageH, 4); } else { g_CheckRender = new CheckBackBuffer(imageW, imageH, 4); } g_CheckRender->setPixelFormat(GL_RGBA); g_CheckRender->setExecPath(argv[0]); g_CheckRender->EnableQAReadback(g_bOpenGLQA); } } printf("Starting GLUT main loop...\n"); printf("Press [1] to view noisy image\n"); printf("Press [2] to view image restored with knn filter\n"); printf("Press [3] to view image restored with nlm filter\n"); printf("Press [4] to view image restored with modified nlm filter\n"); printf("Press [ ] to view smooth/edgy areas [RED/BLUE] Ct's\n"); printf("Press [f] to print frame rate\n"); printf("Press [?] to print Noise and Lerp Ct's\n"); printf("Press [q] to exit\n"); glutDisplayFunc(displayFunc); glutKeyboardFunc(shutDown); cutilCheckError( cutCreateTimer(&hTimer) ); cutilCheckError( cutStartTimer(hTimer) ); glutTimerFunc(REFRESH_DELAY, timerEvent,0); glutMainLoop(); cutilDeviceReset(); shrQAFinishExit(argc, (const char **)argv, QA_PASSED); }
//////////////////////////////////////////////////////////////////////////////// // Program main //////////////////////////////////////////////////////////////////////////////// int main( int argc, char** argv) { // use command-line specified CUDA device, otherwise use device with highest Gflops/s if (!cutCheckCmdLineFlag(argc, (const char **)argv, "noqatest") || cutCheckCmdLineFlag(argc, (const char **)argv, "noprompt")) { g_bQAReadback = true; fpsLimit = frameCheckNumber; } if (argc > 1) { if (cutCheckCmdLineFlag(argc, (const char **)argv, "glverify")) { g_bOpenGLQA = true; fpsLimit = frameCheckNumber; } } printf("[%s] ", sSDKsample); if (g_bQAReadback) printf("(Automated Testing)\n"); if (g_bOpenGLQA) printf("(OpenGL Readback)\n"); // Get the path of the filename char *filename; if (cutGetCmdLineArgumentstr(argc, (const char**) argv, "image", &filename)) { image_filename = filename; } // load image char* image_path = cutFindFilePath(image_filename, argv[0]); if (image_path == 0) { fprintf(stderr, "Error finding image file '%s'\n", image_filename); cudaThreadExit(); exit(EXIT_FAILURE); } cutilCheckError( cutLoadPPM4ub(image_path, (unsigned char **) &h_img, &width, &height)); if (!h_img) { printf("Error opening file '%s'\n", image_path); cudaThreadExit(); exit(-1); } printf("Loaded '%s', %d x %d pixels\n", image_path, width, height); cutGetCmdLineArgumenti(argc, (const char**) argv, "threads", &nthreads); cutGetCmdLineArgumentf(argc, (const char**) argv, "sigma", &sigma); runBenchmark = cutCheckCmdLineFlag(argc, (const char**) argv, "bench"); int device; struct cudaDeviceProp prop; cudaGetDevice( &device ); cudaGetDeviceProperties( &prop, device ); if( !strncmp( "Tesla", prop.name, 5 ) ) { printf("Tesla card detected, running the test in benchmark mode (no OpenGL display)\n"); // runBenchmark = CUTTrue; g_bQAReadback = true; } // Benchmark or AutoTest mode detected, no OpenGL if (runBenchmark == CUTTrue || g_bQAReadback) { if( cutCheckCmdLineFlag( argc, (const char **)argv, "device" ) ) cutilDeviceInit( argc, argv ); else cudaSetDevice( cutGetMaxGflopsDeviceId() ); } else { // First initialize OpenGL context, so we can properly set the GL for CUDA. // This is necessary in order to achieve optimal performance with OpenGL/CUDA interop. initGL(argc, argv); if( cutCheckCmdLineFlag( argc, (const char **)argv, "device" ) ) cutilGLDeviceInit( argc, argv ); else cudaGLSetGLDevice( cutGetMaxGflopsDeviceId() ); } initCudaBuffers(); if (g_bOpenGLQA) { g_CheckRender = new CheckBackBuffer(width, height, 4); g_CheckRender->setPixelFormat(GL_RGBA); g_CheckRender->setExecPath(argv[0]); g_CheckRender->EnableQAReadback(true); } if (g_bQAReadback) { // This is the automated testing path g_CheckRender = new CheckBackBuffer(width, height, 4, false); g_CheckRender->setPixelFormat(GL_RGBA); g_CheckRender->setExecPath(argv[0]); g_CheckRender->EnableQAReadback(true); runAutoTest(argc, argv); cleanup(); cudaThreadExit(); cutilExit(argc, argv); } if (runBenchmark) { benchmark(100); cleanup(); cudaThreadExit(); exit(0); } initGLBuffers(); atexit(cleanup); glutMainLoop(); cudaThreadExit(); cutilExit(argc, argv); }