首页 > 代码库 > OpenCL( 一)
OpenCL( 一)
#include <CL/cl.h> #include <iostream> #include <string> #include <fstream> #pragma comment(lib, "OpenCL.lib") const char * loadfile(const char * fileName) { std::ifstream fs(fileName, std::ios::binary); fs.seekg(0, std::ios::end); int size = fs.tellg(); char * data = http://www.mamicode.com/new char[size + 1]; fs.seekg(0); fs.read(data, size); fs.close(); data[size] = 0; return data; } int main() { cl_platform_id platform; clGetPlatformIDs(1, &platform, NULL); cl_device_id device; clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL); cl_context context = clCreateContext(NULL, 1, &device, NULL, NULL, NULL); cl_command_queue queue = clCreateCommandQueue(context, device, 0, NULL); const char * clSourceFile = loadfile("H:/QtTool/build/TritonRayTracing/kernel.txt"); cl_program program = clCreateProgramWithSource(context, 1, &clSourceFile, NULL, NULL); cl_int result = clBuildProgram(program, 1, &device, NULL, NULL, NULL); if (result) { std::cout << "Error buring compilation" << std::endl; } cl_kernel kernel = clCreateKernel(program, "main", NULL); cl_mem output = clCreateBuffer(context, CL_MEM_WRITE_ONLY, 10 * sizeof(cl_int), NULL, 0); cl_mem buffer1 = clCreateBuffer(context, CL_MEM_READ_WRITE, 10 * sizeof(cl_int), NULL, 0); cl_mem buffer2 = clCreateBuffer(context, CL_MEM_READ_WRITE, 10 * sizeof(cl_int), NULL, 0); clSetKernelArg(kernel, 0, sizeof(output), (void *)&output); clSetKernelArg(kernel, 1, sizeof(buffer1), (void *)&buffer1); clSetKernelArg(kernel, 2, sizeof(buffer2), (void *)&buffer2); cl_int * buffer1Ptr = (cl_int *)clEnqueueMapBuffer(queue, buffer1, CL_TRUE, CL_MAP_WRITE, 0, 10 * sizeof(cl_int), 0, NULL, NULL, NULL); cl_int * buffer2Ptr = (cl_int *)clEnqueueMapBuffer(queue, buffer2, CL_TRUE, CL_MAP_WRITE, 0, 10 * sizeof(cl_int), 0, NULL, NULL, NULL); for (int i = 0; i < 10; ++i) { buffer1Ptr[i] = i; buffer2Ptr[i] = i; } clEnqueueUnmapMemObject(queue, buffer1, buffer1Ptr, 0, 0, 0); clEnqueueUnmapMemObject(queue, buffer2, buffer2Ptr, 0, 0, 0); size_t global_work_size = 10; clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global_work_size, NULL, 0, NULL, NULL); cl_int * resultBufferPtr = (cl_int *)clEnqueueMapBuffer(queue, output, CL_TRUE, CL_MAP_READ, 0, 10 * sizeof(cl_int), 0, NULL, NULL, NULL); for (int i = 0; i < 10; i++) { std::cout << "ptr[" << i << "] = " << resultBufferPtr[i] << std::endl; } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。