Хранение ядра в отдельном файле - 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(), я не хочу переходить в другой файл.
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()
Код ядра также может быть сохранен в файле .c как foo.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" находятся в одном каталоге.