2015-07-21 33 views
-1

我是OpenCL的新手,對於如何讀取數據輸入以執行簡單操作(例如交叉/點積),我很好奇。在OpenCL中獲取文件輸入?

對於一個具體的例子,我編譯,我試圖運行這個簡單的示例代碼來計算矢量3D點積:https://github.com/mattscar/opencl_dot_product

但是,我不知道如何格式化輸入的碼。在下面的代碼片段:

/* Create program from file */ 
program = clCreateProgramWithSource(ctx, 1, 
    (const char**)&program_buffer, &program_size, &err); 
if(err < 0) { 
    perror("Couldn't create the program"); 
    exit(1); 
} 

clCreateProgramWithSource似乎上下文CTX工作,但我不知道如何分配上下文到一個文件在我的硬盤從讀取測試矢量數據。我是否以正確的方式去做這件事?

+0

據我的理解,源應該簡單地是矢量值(例如13 17 45)嗎? –

+0

根據https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clCreateProgramWithSource.html它基本上是一個字符串數組。數組是程序行,字符串是每行。如果行是空終止的,那麼長度應該爲空。所以在一個堅果殼裏,你可能會想要逐行閱讀一個文件,用null結束每一行,然後將它加載到程序緩衝區(記住,它是一個指針數組,所以你需要分配內存對於每個指針最有可能)第二個參數基本上是多少行。 – ydobonebi

+0

在將它傳遞給此函數之前,先看看用於加載程序的代碼會很好。 – ydobonebi

回答

0

的方法之一,這是如下:

禮貌的 http://dhruba.name/2012/08/16/opencl-cookbook-creating-programs-and-reading-kernels-from-a-file/

#include <stdio.h> 
#include <stdlib.h> 
#ifdef __APPLE__ 
#include <OpenCL/opencl.h> 
#else 
#include <CL/cl.h> 
#endif 

int main() { 

    cl_platform_id platform; 
    cl_device_id device; 
    cl_context context; 
    cl_program program; 

    FILE* programHandle; 
    size_t programSize, kernelSourceSize; 
    char *programBuffer, *kernelSource; 

    // get first available platform and gpu and create context 
    clGetPlatformIDs(1, &platform, NULL); 
    clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL); 
    context = clCreateContext(NULL, 1, &device, NULL, NULL, NULL); 

    // get size of kernel source 
    programHandle = fopen("kernel.cl", "r"); 
    fseek(programHandle, 0, SEEK_END); 
    programSize = ftell(programHandle); 
    rewind(programHandle); 

    // read kernel source into buffer 
    programBuffer = (char*) malloc(programSize + 1); 
    programBuffer[programSize] = '\0'; 
    fread(programBuffer, sizeof(char), programSize, programHandle); 
    fclose(programHandle); 

    // create program from buffer 
    program = clCreateProgramWithSource(context, 1, 
      (const char**) &programBuffer, &programSize, NULL); 
    free(programBuffer); 

    // read kernel source back in from program to check 
    clGetProgramInfo(program, CL_PROGRAM_SOURCE, 0, NULL, &kernelSourceSize); 
    kernelSource = (char*) malloc(kernelSourceSize); 
    clGetProgramInfo(program, CL_PROGRAM_SOURCE, kernelSourceSize, kernelSource, NULL); 
    printf("nKernel source:nn%sn", kernelSource); 
    free(kernelSource); 

    clReleaseContext(context); 
    return 0; 

} 

特別是這部分:

// get size of kernel source 
     programHandle = fopen("kernel.cl", "r"); 
     fseek(programHandle, 0, SEEK_END); 
     programSize = ftell(programHandle); 
     rewind(programHandle); 

     // read kernel source into buffer 
     programBuffer = (char*) malloc(programSize + 1); 
     programBuffer[programSize] = '\0'; 
     fread(programBuffer, sizeof(char), programSize, programHandle); 
     fclose(programHandle); 

     // create program from buffer 
     program = clCreateProgramWithSource(context, 1, 
       (const char**) &programBuffer, &programSize, NULL); 
     free(programBuffer); 

你需要知道的你正在閱讀的大小,所以尋求到底

fseek(programHandle, 0, SEEK_END); 

然後得到那個職位

programSize = ftell(programHandle); 

這應該是大小。

然後回滾重置文件位置。

rewind(programHandle); 

重要的是您分配足夠的內存來存儲您必須添加自己的整個程序+ null終止符。

將文件讀入分配的空間,然後將其最後一個索引設置爲空。

programBuffer = (char*) malloc(programSize + 1); 
programBuffer[programSize] = '\0'; 

閱讀您的代碼,然後關閉您的文件。

fread(programBuffer, sizeof(char), programSize, programHandle); 
fclose(programHandle); 

現在你有1行的代碼,因此多數民衆贊成算,你知道,1號線的規模,因此多數民衆贊成長度。空值表示它是空的。完成。

program = clCreateProgramWithSource(context, 1, (const char**) &programBuffer, &programSize, NULL); 
free(programBuffer); 

當你完成後,不要忘記釋放你的程序緩衝區。