我第一次使用OpenCL(版本1.2,在Ubuntu 22.04LTS上)时遇到了问题。我试图同时使用OpenCL和ROS2,因此以下代码通过启动文件在ROS2节点中执行。我安装了英特尔SDK的驱动程序,并尝试在英特尔UHD Graphics上执行内核。
cl::Platform::get(&platforms);
platform.getDevices(CL_DEVICE_TYPE_ALL, &devices);
std::ifstream kernelFile("Smc.cl");
std::string src(std::istreambuf_iterator<char>(kernelFile), (std::istreambuf_iterator<char>()));
cl::Program::Sources sources (1, std::make_pair(src.c_str(), src.length() + 1));
context = cl::Context(devices[0]);
program = cl::Program(context, sources);
program.build();
我试图从“www.example.com“读取内核Smc.cl,它与.cpp文件位于同一目录。
内核看起来像这样(目前只是一个用于测试的虚拟内核):
__kernel void dummy(__global int* a, __global int* b)
{
int gid = get_global_id[0];
b[gid] = a[gid];
}
然而,“src”字符串是空的,当我这样做:cl_int num = program.getInfo<CL_PROGRAM_NUM_KERNELS>();
打印“num”,它的值为零。
有人能帮帮我吗?
程序构建工作正常,其他一切也正常。没有关于及时编译的错误代码。我的平台和设备也被OpenCL驱动程序识别。
1条答案
按热度按时间xwbd5t1u1#
如果你使用的是像cmake这样的构建工具,你可能需要告诉构建工具将这些文件复制到构建目录中。只有这样,它们才会被添加到可执行文件中。例如在cmake中,将以下内容添加到CMakeLists.txt中:
如果在特定目录中有一堆if .cl文件,也可以使用
copy_directory
命令