bool Sample::begin()
{
  initGL();
  initOpenCL();

  m_control.m_sceneOrbit = nvmath::vec3f(-0.25f, 0.0f, 0.0f);
  m_control.m_sceneDimension = float(10) * 0.2f;
  m_control.m_viewMatrix = nvmath::look_at(m_control.m_sceneOrbit - nvmath::vec3f(0, 0, -m_control.m_sceneDimension), m_control.m_sceneOrbit, nvmath::vec3f(0, 1, 0));

  return true;
}
コード例 #2
0
int main (int argc, char* argv[]) {

    struct timespec start, end;
    
    initOpenCL();

    /* START Measurements */
    get_date(argc, argv);
    clock_gettime(CLOCK_MONOTONIC, &start);

    int arraySize = SIZE;
    size_t bufferSize = arraySize * sizeof(double);
    double* inputA = (double*) malloc (bufferSize);
    double* inputB = (double*) malloc (bufferSize);
    double* output = (double*) malloc (bufferSize);


    /* Initilise data */
    initialize_data(arraySize, inputA, inputB);

    /* Computation */
    vector_sum(arraySize, inputA, inputB, output);

    /* END Measurements */
    clock_gettime(CLOCK_MONOTONIC, &end);
    get_date(argc, argv);

    /* Check results */
    //check_results(arraySize, inputA, inputB, output);

    /* Cleaning */
    cleanUpOpenCL();

    double res=0;
    int i;
    for (i = 0; i < arraySize; i++) {
      res = res + output[i] ;
    }

    times = (((double)(end.tv_sec  - start.tv_sec)*1000) +
             ((double)(end.tv_nsec - start.tv_nsec)/1000000));
    //cout << "Time to finish: " << times << " ms" << endl;
    printf("Time to finish %6.0f ms [check = %e]\n", times, res);
}
コード例 #3
0
ファイル: main.cpp プロジェクト: kernl/Multi-GPU_Saxpy
int main(int argc, char const *argv[])
{
    unsigned int i;
    if(argc < 2) {
        std::cout << "Usage: " << argv[0] << "<numberElements> <Optional_numberOverlapPerGPU>" << std::endl;
        return -1;
    } else {
        // Set the values in regards to the supplied arguments
        if(argc >= 2) {
            numberElems = atoi(argv[1]);
            if(argc == 3) {
                numOverlap = atoi(argv[2]);
            } else {
                numOverlap = DEFAULT_OVERLAP;
            }
        }
    }

    inValues1 = new float[numberElems];
    inValues2 = new float[numberElems];
    outValues = new float[numberElems];

    // Initialize the example matrices
    for(i = 0; i < numberElems; i++) {
        inValues1[i] = 10;
        inValues2[i] = 15;
    }

    initOpenCL();

    startExecution();

    finishOpenCL();

    free(inValues1);
    free(inValues2);
    free(outValues);
    return 0;
}
コード例 #4
0
ファイル: bake.cpp プロジェクト: cheind/gpu-bake
 bool bakeTextureMap(const Surface &src, const Surface &target) {
     OCL ocl;
     if (!initOpenCL(ocl, 2)) {
         BAKE_LOG("Failed to initialize OpenCL.");
         return false;
     }
     
     SurfaceVolume sv;
     if (!buildSurfaceVolume(src, Eigen::Vector3i::Constant(64), sv)) {
         BAKE_LOG("Failed to create surface volume.");
         return false;
     }
     
     
     // Target
     
     cl_int err;
     
     cl::Buffer bTargetVertexPositions(ocl.ctx,
                                       CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
                                       target.vertexPositions.array().size() * sizeof(float),
                                       const_cast<float*>(target.vertexPositions.data()),
                                       &err);
     ASSERT_OPENCL(err, "Failed to create vertex buffer for target.");
     
     
     cl::Buffer bTargetVertexUVs(ocl.ctx,
                                 CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
                                 target.vertexUVs.array().size() * sizeof(float),
                                 const_cast<float*>(target.vertexUVs.data()), &err);
     ASSERT_OPENCL(err, "Failed to create UV buffer for target.");
     
     cl::Buffer bTargetVertexNormals(ocl.ctx,
                                     CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
                                     target.vertexNormals.array().size() * sizeof(float),
                                     const_cast<float*>(target.vertexNormals.data()), &err);
     ASSERT_OPENCL(err, "Failed to create normals buffer for target.");
     
     // Source
     
     cl::Buffer bSrcVertexPositions(ocl.ctx,
                                    CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
                                    src.vertexPositions.array().size() * sizeof(float),
                                    const_cast<float*>(src.vertexPositions.data()),
                                    &err);
     ASSERT_OPENCL(err, "Failed to create vertex buffer for source.");
     
     cl::Buffer bSrcVertexNormals(ocl.ctx,
                                  CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
                                  src.vertexNormals.array().size() * sizeof(float),
                                  const_cast<float*>(src.vertexNormals.data()), &err);
     ASSERT_OPENCL(err, "Failed to create normals buffer for source.");
     
     
     cl::Buffer bSrcVertexColors(ocl.ctx,
                                 CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
                                 src.vertexColors.array().size() * sizeof(float),
                                 const_cast<float*>(src.vertexColors.data()), &err);
     ASSERT_OPENCL(err, "Failed to create color buffer for source.");
     
     // Volume
     
     cl::Buffer bSrcVoxels(ocl.ctx,
                           CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
                           (int)sv.cells.size() * sizeof(int),
                           const_cast<int*>(sv.cells.data()),
                           &err);
     ASSERT_OPENCL(err, "Failed to create voxel buffer for source.");
     
     cl::Buffer bSrcTrianglesInVoxels(ocl.ctx,
                                      CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
                                      (int)sv.triangleIndices.size() * sizeof(int),
                                      const_cast<int*>(sv.triangleIndices.data()),
                                      &err);
     ASSERT_OPENCL(err, "Failed to triangle index buffer for source.");
     
     float minmax[8] = {
         sv.bounds.min().x(), sv.bounds.min().y(), sv.bounds.min().z(), 0.f,
         sv.bounds.max().x(), sv.bounds.max().y(), sv.bounds.max().z(), 0.f,
     };
     
     cl_float4 voxelSizes = {{sv.voxelSizes.x(), sv.voxelSizes.y(), sv.voxelSizes.z(), 0}};
     cl_float4 invVoxelSizes = {{1.f / sv.voxelSizes.x(), 1.f / sv.voxelSizes.y(), 1.f / sv.voxelSizes.z(), 0}};
     cl_int4 voxelsPerDim = {{sv.voxelsPerDimension.x(), sv.voxelsPerDimension.y(), sv.voxelsPerDimension.z(), 0}};
     
     // Texture
     
     const int imagesize = 512;
     
     Image<unsigned char> texture(imagesize, imagesize, 3);
     texture.toOpenCV().setTo(0);
     
     cl::Image2D bTexture(ocl.ctx,
                          CL_MEM_WRITE_ONLY | CL_MEM_COPY_HOST_PTR,
                          cl::ImageFormat(CL_RGB, CL_UNORM_INT8),
                          imagesize, imagesize, 0, texture.row(0), &err);
     ASSERT_OPENCL(err, "Failed to create texture image.");
     
     int argc = 0;
     ocl.kBakeTexture.setArg(0, bTargetVertexPositions);
     ocl.kBakeTexture.setArg(1, bTargetVertexNormals);
     ocl.kBakeTexture.setArg(2, bTargetVertexUVs);
     ocl.kBakeTexture.setArg(3, bSrcVertexPositions);
     ocl.kBakeTexture.setArg(4, bSrcVertexNormals);
     ocl.kBakeTexture.setArg(5, bSrcVertexColors);
     ocl.kBakeTexture.setArg(6, bSrcVoxels);
     ocl.kBakeTexture.setArg(7, bSrcTrianglesInVoxels);
     ocl.kBakeTexture.setArg(8, carray(minmax, 8));
     ocl.kBakeTexture.setArg(9, sizeof(cl_float4), voxelSizes.s);
     ocl.kBakeTexture.setArg(10, sizeof(cl_float4), invVoxelSizes.s);
     ocl.kBakeTexture.setArg(11, sizeof(cl_int4), voxelsPerDim.s);
     ocl.kBakeTexture.setArg(12, bTexture);
     ocl.kBakeTexture.setArg(13, imagesize);
     ocl.kBakeTexture.setArg(14, 0.5f);
     ocl.kBakeTexture.setArg(15, (int)target.vertexPositions.cols()/3);
     
     int nTrianglesDivisableBy2 = target.vertexPositions.cols()/3 + (target.vertexPositions.cols()/3) % 2;
     
     err = ocl.q.enqueueNDRangeKernel(ocl.kBakeTexture, cl::NullRange, cl::NDRange(nTrianglesDivisableBy2), cl::NullRange);
     ASSERT_OPENCL(err, "Failed to run bake kernel.");
     
     cl::size_t<3> origin;
     origin.push_back(0);
     origin.push_back(0);
     origin.push_back(0);
     
     cl::size_t<3> region;
     region.push_back(imagesize);
     region.push_back(imagesize);
     region.push_back(1);
     
     err = ocl.q.enqueueReadImage(bTexture, false, origin, region, 0, 0, texture.row(0));
     ASSERT_OPENCL(err, "Failed to read image.");
     ocl.q.finish();
     
     cv::Mat m = texture.toOpenCV();
     cv::flip(m, m, 0);
     
     cv::imwrite("input.png", m);
     cv::imshow("test", m);
     cv::waitKey();
     
     
     return false;
 }
コード例 #5
0
OCLSample::OCLSample()
: numIterations_(4) {
  initOpenCL();
}
コード例 #6
0
ファイル: main.cpp プロジェクト: janten/clutilities
int main(int argc, const char * argv[]) {
    // Simulation parameters
    cl_float T  = 100;  // Maximum time
    cl_float dt = 0.01; // Length of timestep
    int planets = 3;    // Number of bodies (sun, earth, moon)

    Planet universe[planets];
    Planet output[planets];
    memset(universe, 0, planets*sizeof(Planet));
    printf("Size of universe: %lu bytes\n", sizeof(universe));
    
    // Initialisation
    
    // Sun at center - according to G. Galilei
    universe[0].x_old = 0;
    universe[0].y_old = 0;
    universe[0].z_old = 0;
    universe[0].mass  = 5;
    
    // Earth
    universe[1].x_old = 40;
    universe[1].y_old =  0;
    universe[1].z_old =  0;
    universe[1].mass  = 81.3;
    universe[1].vy    =  2;
    
    // Moon
    universe[2].x_old = 44;
    universe[2].y_old =  0;
    universe[2].z_old =  0;
    universe[2].mass  = 10;
    universe[2].vy    = -0.8;
    
    printf("Position of sun:   %9.6f, %9.6f, %9.6f\n", universe[0].x_old, universe[0].y_old, universe[0].z_old);
	printf("Position of earth: %9.6f, %9.6f, %9.6f\n", universe[1].x_old, universe[1].y_old, universe[1].z_old);
	printf("Position of moon:  %9.6f, %9.6f, %9.6f\n", universe[2].x_old, universe[2].y_old, universe[2].z_old);

	// Initialize OpenCL and create leap_frog integration kernel
    initOpenCL();
	cl_program program = buildCLProgram("calc.cl");
    cl_kernel kernel = buildCLKernel(program, "leap_frog");

    // Create memory buffer andy copy universe
	cl_mem univ = createCLBuffer(sizeof(universe));
	writeDataToCLBuffer(universe, sizeof(universe), univ);
    waitForCLOperations();
    
    // Set kernel arguments
    cl_int error = CL_SUCCESS;
	error = clSetKernelArg (kernel, 0, sizeof(cl_mem), &univ);
    error = clSetKernelArg (kernel, 1, sizeof(cl_float), &dt);
	error = clSetKernelArg (kernel, 2, sizeof(cl_int), &planets);
	error = clSetKernelArg (kernel, 3, sizeof(cl_float), &T);
	showCLError(error);
    
    // Run kernel
	const size_t globalSize = planets;
	enqueueCLKernel(kernel, globalSize);
    waitForCLOperations();
    
    // Read results
	readDataFromCLBuffer(output, sizeof(universe), univ);
    waitForCLOperations();

    // Clean up
    clReleaseKernel(kernel);
    clReleaseProgram(program);
    clReleaseMemObject(univ);
    releaseCLHelper();

	printf("%lu Bytes of data read from graphics card\n", sizeof(universe));

	printf("Position of sun:   %9.6f, %9.6f, %9.6f\n", output[0].x, output[0].y, output[0].z);
	printf("Position of earth: %9.6f, %9.6f, %9.6f\n", output[1].x, output[1].y, output[1].z);
	printf("Position of moon:  %9.6f, %9.6f, %9.6f\n", output[2].x, output[2].y, output[2].z);
    
    return 0;
}