我发现了很多示例,如何在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中添加第二个源。有人写过这个吗?
答案 0 :(得分:2)
基于OpenCL 1.2 specification(对于2.0也相同)
-I目录 将目录dir添加到要搜索头文件的目录列表中。
您不能将任何“ .cl”包含到另一个“ .cl”中,但是您可以根据需要std::cout <<
尽可能多地使用某些功能或#define等。
请注意,这些标头中的代码必须位于与您的内核相似的OpenCL C中(除非使用OpenCL 2.2,您可以在其中使用OpenCL C ++)。
最后,除非您使用OpenCL 2.0及更高版本,否则您无法在内核内部调用内核函数,因此它们必须是普通函数#include "Header.h"
。
因此,您可以这样做:
void foo()
回答第二个问题
我认为在下一步中,需要在Program :: Sources中添加第二个源。有人写过这个吗?
您可以将任意数量的内核源代码push_back Program program = Program(context, source);
errcode = program.build(devices, "-I C:\Path\To\My\Include\Header);
到提供给程序的单个sources.push_back({ kernelSource.c_str(), kernelSource.length() + 1 });
向量中。但是最后,您可以使用此程序制作多个内核,因为您需要为每个cl :: Kernel提供一个内核名称,例如:
sources
因此,意味着Kernel kernel_add(program, "vector_add");
Kernel kernel_sub(program, "vector_sub");
和kernel_add
是同时构建的,但最后它们是两个不同的内核。