總結一下,opencl的步驟差很少是這些html
先要獲取平臺的id clGetPlatformIDs(nPlatforms, platform_id, &num_of_platforms)數組
而後獲取設備id clGetDeviceIDs(platform_id[1], CL_DEVICE_TYPE_GPU, 1, %device_id &num_of_devices)緩存
////這裏要注意的是,若是有多個設備(如cpu和gpu)platform_id必須使用數組形式傳入ui
而後是建立上下文clCreateContext(properties, 1, &device_id, NULL, NULL, &err)orm
建立命令隊列clCreateCommandQueue(context, device_id, 0, &err)htm
建立設備緩存clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(float) * DATA_SIZE, NULL, NULL);隊列
複製數據clEnqueueWriteBuffer(command_queue, input, CL_TRUE, 0, sizeof(float)*DATA_SIZE, inputData, 0, NULL, NULL)文檔
而後是根據源代碼產生program代碼 clCreateProgramWithSource(context, 1, (const char **)&ProgramSource, NULL, &err)input
而後編譯program clBuildProgram(program, 0, NULL, NULL, NULL, NULL)it
最後產生kernel clCreateKernel(program, "test", &err);
設定kernel的參數 clSetKernelArg(kernel, 0, sizeof(cl_mem), &input)
將kernel推入命令隊列 clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, &global, NULL, 0, NULL, NULL)
完成計算clFinish(command_queue)
讀取設備緩存clEnqueueReadBuffer(command_queue, input, CL_TRUE, 0, sizeof(float) * DATA_SIZE, inputData, 0, NULL, NULL)
最後是清理工做
clReleaseMemObject(input)
clReleaseProgram(program)
clReleaseKernel(kernel)
clReleaseCommandQueue(command_queue)
clReleaseContext(context)
大體是這個流程,詳細每一個命令的參數怎麼設定還要看文檔
https://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/
出了任何報錯最好仍是查一下頭文件,頗有幫助