2015-06-24 43 views
0

我在Linux上發揮作用& CPP(使用Eclipse SDK)。 我是OpenCL(GPU編程)的新手 我想在GPU上執行一些代碼(使用openCL重寫某些函數並在GPU上運行它們)。如何將CPP應用程序與OpenCL代碼集成在一起

我很liitle有點混亂 - 如果我會寫一些代碼(.cl文件)我怎麼能從我的cpp應用程序調用它們? 我沒有看到這個需求的任何例子。

+1

'......我沒有看到這個需求的任何例子.'很多例子[這裏](https://www.google.co.uk/?gws_rd=ssl#q=opencl+tutorial) – doqtor

+0

重複的[本](http://stackoverflow.com/questions/26517114/how-to-compile-opencl-project-with-kernels) – doqtor

回答

1

如果你想使用opencl,有兩部分代碼。 A.內核代碼。 由1到多個在設備上執行計算的內核函數組成。

B.主機代碼 正常的c/C++代碼。這裏所發生:

  1. 挑選設備爲內核要在(GPU/CPU/iGPU的/至強融核/ ...) OpenCL中你有一組的平臺上它可以包含幾個不同的計算設備。所以你選擇一個平臺和一個設備。 例如: 平臺:Intel的CPU + GPU的OpenCL 1.2 裝置:CPU或iGPU的

  2. 建立內核

    常量字符*代碼= load_program_source( 「kernel.cl」); cl_program program = clCreateProgramWithSource(context,1,(const char **)& code,NULL,& err); errWrapper(「clCreateProgramWithSource」,err);

  3. 創建用於緩衝存儲器傳送到設備:

    cl_mem devInput1 = clCreateBuffer(上下文,CL_MEM_READ_ONLY,變量1 *的sizeof(int)的,NULL,& ERR);

  4. 轉移到設備

    errWrapper( 「setKernel」,clSetKernelArg(countKeyCardinality,0,的sizeof(cl_mem),& devInput1));

  5. 啓動內核

    errWrapper( 「clEnqueueNDRangeKernel」,clEnqueueNDRangeKernel(command_queue,kernel_function1,1,NULL,& tasksize,NULL,0,NULL,NULL));

  6. 等待終止 clFinish(command_queue)

  7. 使用

    clEnqueueReadBuffer

  8. 設備 抓取你的結果使用由OpenCL的計算產生的結果與你的c繼續++代碼。

那是在代碼中使用的OpenCL的基本思想。 更好的開始做一個完整的opencl教程。(它只是谷歌,你會在OpenCL的教程淹死)

概念,你應該familar有: 的OpenCL API主機命令 隊列 內核參數。 工作組 局部尺寸 本地內存 全局內存 cl_mem對象

調試OpenCL是可能的,但不好受。我會建議使用NORMAL C代碼進行調試,並將它移植到opencl(如果它工作的話)。

主要來源爲所有命令是官方的API文檔,可以在這裏找到:opencl 1.2 api

編輯:你不需要特殊的IDE代碼的OpenCL。

相關問題