无法读取外部.cl文件,字符串为空,(Ubuntu 22.04、C++、ROS2)

jjjwad0x  于 2023-03-25  发布在  其他
关注(0)|答案(1)|浏览(190)

我第一次使用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驱动程序识别。

xwbd5t1u

xwbd5t1u1#

如果你使用的是像cmake这样的构建工具,你可能需要告诉构建工具将这些文件复制到构建目录中。只有这样,它们才会被添加到可执行文件中。例如在cmake中,将以下内容添加到CMakeLists.txt中:

#add target that copies the file
add_custom_target(copy_cl_file ALL COMMAND ${CMAKE_COMMAND} -E copy
        ${PROJECT_SOURCE_DIR}/Smc.cl
        ${PROJECT_BINARY_DIR}/Smc.cl
        COMMENT "Copying cl file")

#add dependency to your executable target
add_dependencies(YOUR_TARGET_NAME copy_cl_file)

如果在特定目录中有一堆if .cl文件,也可以使用copy_directory命令

相关问题