将内核存储在单独的文件中 - PyOpenCL

Storing Kernel in Separate File - PyOpenCL

我正在尝试将代码的内核部分与 3 """ 一起存储在不同的文件中。我尝试将其另存为文本文件和 bin 文件,然后读入,但我没有找到成功。它开始给我一个错误,说“””丢失,或者)丢失。 “但是,如果我只是将内核代码复制粘贴到 cl.Program(,它就可以工作。

那么,有没有办法将长内核代码提取到另一个文件中?这是 python 特有的,谢谢!

#Kernel function
prg = cl.Program(ctx, """
__kernel void sum(__global double *a, __global double *b, __global double *c)
{
  int gid = get_global_id(0);
  c[gid] = 1;

}
""").build()

cl.Program() 函数的第二个参数“””“”中的几乎所有内容,我不想移动到不同的文件中。

只需将您的内核代码放在一个纯文本文件中,然后使用open(...).read()获取内容:

foo.cl

__kernel void sum(__global double *a, __global double *b, __global double *c)
{
  int gid = get_global_id(0);
  c[gid] = 1;

}

Python代码

prg = cl.Program(ctx, open('foo.cl').read()).build()

内核代码也可以作为 foo.c 存储在 .c 文件中。 这样可以更轻松地在 xcode 等编辑器中进行编辑。 可以这样读

prg = cl.Program(ctx, open('foo.c').read()).build()

如果您将内核代码拆分为多个文件,那么您还必须将选项传递给 cl.Program.build() 函数。

因此,例如,如果您的内核名为 'kernel.cl' 并且它包含 'functions.h',则 OpenCL 编译器将退出并出现找不到 'functions.h' 的错误。要修复此传递 '-I' 选项到 build() 如下:

kernel_location = dirname(__file__)
kernel = open(join(kernel_location, 'kernel.cl').read()
program = cl.Program(context, kernel).build(options=['-I', kernels_location])

这假设您的 python 代码、'kernel.cl' 和 'functions.h' 在同一目录中。