void runBenchmark(int iterations, char *exec_path) { printf("Run %u particles simulation for %d iterations...\n\n", numParticles, iterations); cudaDeviceSynchronize(); sdkStartTimer(&timer); for (int i = 0; i < iterations; ++i) { psystem->update(timestep); } cudaDeviceSynchronize(); sdkStopTimer(&timer); float fAvgSeconds = ((float)1.0e-3 * (float)sdkGetTimerValue(&timer)/(float)iterations); printf("particles, Throughput = %.4f KParticles/s, Time = %.5f s, Size = %u particles, NumDevsUsed = %u, Workgroup = %u\n", (1.0e-3 * numParticles)/fAvgSeconds, fAvgSeconds, numParticles, 1, 0); if (g_refFile) { printf("\nChecking result...\n\n"); float *hPos = (float *)malloc(sizeof(float)*4*psystem->getNumParticles()); copyArrayFromDevice(hPos, psystem->getCudaPosVBO(), 0, sizeof(float)*4*psystem->getNumParticles()); sdkDumpBin((void *)hPos, sizeof(float)*4*psystem->getNumParticles(), "particles.bin"); if (!sdkCompareBin2BinFloat("particles.bin", g_refFile, sizeof(float)*4*psystem->getNumParticles(), MAX_EPSILON_ERROR, THRESHOLD, exec_path)) { g_TotalErrors++; } } }
void runAutoTest(const char *ref_file, char *exec_path) { checkCudaErrors(cudaMalloc((void **)&d_output, width*height*sizeof(GLubyte)*4)); // render the volumeData render_kernel(gridSize, blockSize, d_output, width, height, w); checkCudaErrors(cudaDeviceSynchronize()); getLastCudaError("render_kernel failed"); void *h_output = malloc(width*height*sizeof(GLubyte)*4); checkCudaErrors(cudaMemcpy(h_output, d_output, width*height*sizeof(GLubyte)*4, cudaMemcpyDeviceToHost)); sdkDumpBin(h_output, width*height*sizeof(GLubyte)*4, "simpleTexture3D.bin"); bool bTestResult = sdkCompareBin2BinFloat("simpleTexture3D.bin", sdkFindFilePath(ref_file, exec_path), width*height, MAX_EPSILON_ERROR, THRESHOLD, exec_path); checkCudaErrors(cudaFree(d_output)); free(h_output); // cudaDeviceReset causes the driver to clean up all state. While // not mandatory in normal operation, it is good practice. It is also // needed to ensure correct operation when the application is being // profiled. Calling cudaDeviceReset causes all profile data to be // flushed before the application exits cudaDeviceReset(); sdkStopTimer(&timer); sdkDeleteTimer(&timer); exit(bTestResult ? EXIT_SUCCESS : EXIT_FAILURE); }