Я нашел много примеров, как добавить это в хост на 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. Кто-нибудь это написал?
@hellow, извините, забыл добавить, что мне нужно включить библиотеку (.cl) в файл ядра. Для этого мне нужно добавить путь к библиотеке на хосте.
Если файл, который вы включаете в свой .cl, не является простым OpenCL C (или C++, где поддерживается), он не будет работать. Например, вы не можете использовать std :: map в ядре OpenCL.
@Dithermaster Я хочу добавить свою внешнюю библиотеку .cl. Подскажите, пожалуйста, как я могу это сделать в среде хоста? Как мне написать путь к библиотеке на хосте C++? Простой пример. Я показал часть своего кода выше.





На основе Спецификация OpenCL 1.2 (то же самое для 2.0),
-I dir Add the directory dir to the list of directories to be searched for header files.
Вы не можете включать какой-либо ".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);
И чтобы ответить на ваш второй вопрос
In the next step i think, that need to add the second source in Program::Sources. Has anyone written this?
Вы можете вернуть 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 собираются одновременно, но в конечном итоге это два разных ядра.
О чувак. Будьте здоровы! Решение моей задачи - 10 символов. Никто не мог дать такого ответа.
Вы говорите о компиляции и передаче библиотеки компоновщику? Или про библиотеки opencl?