Как добавить путь включенной библиотеки в ядро? - PullRequest
0 голосов
/ 24 сентября 2018

Я нашел много примеров, как добавить это в хосте на C, но синтаксис C++ отличается от C.Я хочу добавить внешнюю библиотеку в файл ядра.

Это часть моего кода:

std::ifstream sourceFile(name);
std::string sourceCode(
    std::istreambuf_iterator<char>(sourceFile),
    (std::istreambuf_iterator<char>()));
Program::Sources source(1, std::make_pair(sourceCode.c_str(), sourceCode.length() + 1));

// Make program of the source code in the context
Program program = Program(context, source);

// Build program for these specific devices


errcode = program.build(devices);
if (errcode != CL_SUCCESS)
{
    cout << "There were error during build kernel code. Please, check program code. Errcode = " << errcode << "\n";
    cout << "BUILD LOG: " + program.getBuildInfo<CL_PROGRAM_BUILD_LOG>(devices[0]) + "\n";
    getchar();
    return;
}


// Make kernel
Kernel kernel(program, "vector_add");

Как добавить путь к внешней библиотеке в этом коде?

На следующем шаге я думаю, что нужно добавить второй источник в Program :: Sources.Кто-нибудь написал это?

1 Ответ

0 голосов
/ 25 сентября 2018

На основе спецификации OpenCL 1.2 (также то же самое для 2.0),

-I dir Добавить каталог dir в список каталогов для поиска файлов заголовков.

Вы не можете включать какой-либо ".cl" в другой ".cl", но вы можете #include "Header.h" столько, сколько хотите, где у вас могут быть некоторые функции или #define и т. Д.

Обратите внимание, что код в этих заголовках должен быть в OpenCL C похож на ваше ядро ​​(за исключением случаев, когда используется OpenCL 2.2, где вы можете использовать OpenCL C ++).

И, наконец, за исключением того, что вы используете OpenCL 2.0 и вышеВы не можете вызывать функцию ядра внутри ядра, поэтому они должны быть обычной функцией void foo().

Итак, в вашем случае вы можете сделать это:

Program program = Program(context, source);
errcode = program.build(devices, "-I C:\Path\To\My\Include\Header);

И ответитьВаш второй вопрос

На следующем шаге я думаю, что нужно добавить второй источник в Program :: Sources.Кто-нибудь написал это?

Вы можете push_back sources.push_back({ kernelSource.c_str(), kernelSource.length() + 1 }); столько исходного кода ядра, сколько хотите, в один sources вектор, который вы предоставляете программе.Но, в конце концов, вы можете создать несколько ядер с помощью этой программы, так как вам нужно предоставить одно имя ядра для cl :: Kernel, например:

Kernel kernel_add(program, "vector_add");
Kernel kernel_sub(program, "vector_sub");

Так что это означает kernel_add и kernel_subсобираются в одно и то же время, но в конце они представляют собой два разных ядра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...