如何在内核中添加路径包括库?

时间:2018-09-24 10:56:41

标签: c++ opencl

我发现了很多示例,如何在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 :(得分: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是同时构建的,但最后它们是两个不同的内核。