gpt4 book ai didi

c - 在 OpenCL 中获取文件输入?

转载 作者:太空宇宙 更新时间:2023-11-04 08:24:16 24 4
gpt4 key购买 nike

我是 OpenCL 的新手,我很好奇如何读取数据输入以执行简单的操作(例如叉积/点积)。

对于一个特定的例子,我已经编译并试图运行这个简单的示例代码来计算 vector 的 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 上运行,但我不知道如何将上下文分配给硬盘驱动器上的文件以从中读取测试 vector 数据。我这样做的方式正确吗?

最佳答案

一种方法如下:

#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;

}

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

特别是这部分:

 // 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);

分配足够的内存来存储整个程序+您必须自己添加的空终止符很重要。

将文件读入分配的空间,然后将其最后一个索引设置为空。

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

读入你的代码然后关闭你的文件。

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

现在您有 1 行代码,这就是计数,您知道那 1 行的大小,这就是长度。和 null 表示它是 null 终止的。完成。

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

完成后不要忘记释放程序缓冲区。

关于c - 在 OpenCL 中获取文件输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31549753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com