Mercurial > hg > Game > Cerium
view example/add/opencl/main.cc @ 2054:2e7a6f40672f draft
add param(4) in FileMapReduce.cc
author | masa |
---|---|
date | Fri, 29 Jan 2016 15:56:28 +0900 |
parents | 096412ad80fb |
children |
line wrap: on
line source
//=================================================================== // 二つ変数を加算し、別の変数に格納する,C/C++で書いたもの。 // // Linux, AMD OpenCL開発環境の例: // $ g++ -I /opt/AMDAPP/include/ -L /opt/AMDAPP/lib/x86_64/ main.cpp -lOpenCL // $ ./a.out // 1.100000 + 2.200000 = 3.300000 // // (c)Copyright Spacesoft corp., 2012 All rights reserved. // Hiro KITAYAMA //=================================================================== #ifdef __APPLE__ #include <OpenCL/opencl.h> #else #include <CL/cl.h> #endif //__APPLE__ #include <stdio.h> #include <sys/stat.h> //------------------------------------------------------------------- // main int main() { cl_int status; float A=1.1f, B=2.2f, C; // get platform id cl_platform_id platformId; status=clGetPlatformIDs(1, &platformId, NULL); // get device id cl_device_id deviceID; status=clGetDeviceIDs(platformId, CL_DEVICE_TYPE_DEFAULT, 1, &deviceID, NULL); // create Context cl_context context=clCreateContext( NULL, 1, &deviceID, NULL, NULL, NULL); // create Command Queue cl_command_queue queue=clCreateCommandQueue(context, deviceID, 0, NULL); // file open const char * filename = "add.cl"; int fd; char *source_str; size_t source_size; fd = open(filename, O_RDONLY); if (fd<0) { fprintf(stderr, "Failed to load kernel %s.\n",filename); exit(1); } struct stat stats; fstat(fd,&stats); off_t size = stats.st_size; if (size<=0) { fprintf(stderr, "Failed to load kernel.\n"); exit(1); } source_str = (char*)alloca(size); source_size = read(fd, source_str, size); close(fd); cl_program prog=clCreateProgramWithSource(context, 1, (const char**)&source_str, (const size_t *)&source_size, NULL); // build program status=clBuildProgram(prog, 1, &deviceID, NULL, NULL, NULL); // create kernel cl_kernel kernel=clCreateKernel(prog, "add", NULL); // create memory object cl_mem memA=clCreateBuffer(context, CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PTR, sizeof(A), &A, NULL); cl_mem memB=clCreateBuffer(context, CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PTR, sizeof(B), &B, NULL); cl_mem memC=clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(C), NULL, NULL); // set kernel parameters status=clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&memA); status=clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&memB); status=clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&memC); // request execute kernel status=clEnqueueTask(queue, kernel, 0, NULL, NULL); // obtain results status=clEnqueueReadBuffer(queue, memC, CL_TRUE, 0, sizeof(C), &C, 0, NULL, NULL); // list results printf("%f + %f = %f\n", A, B, C); // release resources clReleaseMemObject(memC); clReleaseMemObject(memB); clReleaseMemObject(memA); clReleaseKernel(kernel); clReleaseProgram(prog); clReleaseCommandQueue(queue); clReleaseContext(context); return 0; }