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

时间:2016-09-22 16:57:19

标签: python opencl pycuda 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()函数的第二个参数,我不想进入另一个文件。

3 个答案:

答案 0 :(得分:2)

只需将内核代码放在纯文本文件中,然后使用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()

答案 1 :(得分:1)

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

因此,例如,如果您的内核名为“ kernel.cl”并且其中包含“ functions.h”,则OpenCL编译器将退出,并显示错误消息,即找不到“ functions.h”。要通过以下方法将build-)传递的“ -I”选项修复:

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”位于同一目录中。

答案 2 :(得分:0)

内核代码也可以 foo.c 存储在 .c 文件中。 这样在xcode等编辑器中编辑更容易。 它可以用同样的方式阅读

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