Хранение ядра в отдельном файле - 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" находятся в одном каталоге.

Другие вопросы по тегам