c++ - 在创建 OpenCL 上下文之前设置线程亲和性会导致段错误

标签 c++ pthreads opencl intel

我正在将主线程的亲和性设置为核心 0,但 OpenCl 上下文创建以段错误结束。 (我加入了一个代码片段来重现这个问题,我删除了 vector 大小检查以使其尽可能简洁)。

如果我在我的 cpuset 中定义了一个以上的内核,那么一切正常。

我有直觉知道哪里出了问题。但我更喜欢具体的解释。

然后错误可能比原始段错误更好。

打开 CL 信息:

  • 设备版本 Intel OpenCL 1.2(Build 475)
  • 驱动版本 1.2.0.475
#include <vector>

#include <CL/cl.hpp>


int main(int argc, char** argv)
{
    // Set affinity to core 0
    cpu_set_t cpuset;
    CPU_ZERO(&cpuset);
    CPU_SET(0, &cpuset);
    pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);

    // Retrieve first platform
    std::vector<cl::Platform> platforms;
    cl::Platform::get(&platforms);
    cl::Platform platform = platforms[0];

    // Retrieve first CPU device
    std::vector<cl::Device> devices;
    platform.getDevices(CL_DEVICE_TYPE_CPU, &devices);
    cl::Device device = devices[0];

    // Create context
    cl::Context ctx(device);

    return 0;
}

编辑:添加 OpenCL 版本

最佳答案

我刚刚使用两个英特尔 OpenCL SDK 尝试了您的示例,但手头没有您的确切版本。两者都运行无误,因此:无法重现

这个似乎比你的老一点(从内部版本号来看):

CL_DEVICE_VERSION:          OpenCL 1.2 (Build 43)
CL_DRIVER_VERSION:          1.2.0.43
CL_DEVICE_OPENCL_C_VERSION: OpenCL C 1.2 

我认为,第二个仍然是最新的 Intel CPU 驱动程序:

CL_DEVICE_VERSION:          OpenCL 2.1 (Build 0)
CL_DRIVER_VERSION:          18.1.0.0920
CL_DEVICE_OPENCL_C_VERSION: OpenCL C 2.0 

我在 Ubuntu 18.4 上使用 GCC 7.4.0。

根据我的经验,为 CPU 设置与英特尔 OpenCL 运行时的亲和性不是问题

我在 super 计算机上将它与 MPI 一起使用,在那里你会有多个,例如4,每个计算节点的 MPI 进程,然后让运行时将每个进程的 CPU 掩码设置为可用核心的分 ionic 集。然后,每个进程内的英特尔 OpenCL 运行时(在引擎盖下使用英特尔线程构建模块)将为每个分配的核心生成一个线程,即如预期的那样遵守主机进程的 CPU 掩码。如果您设置第一个线程的关联,结果可能会有所不同,并且还取决于您在程序中设置的位置(相对于 OpenCL 运行时生成它的线程的位置)。

因为您似乎已经在调试器中运行了代码并将范围缩小到 clcreatecontext我建议您尝试使用更新的 OpenCL 驱动程序。

关于c++ - 在创建 OpenCL 上下文之前设置线程亲和性会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56950612/

相关文章:

c - 为什么我的线程不在程序完成之前将其结果存储在数组中?

c - 使用 POSIX 线程 : Program hangs every fourth or fifth run, 但在其他方面似乎可以工作

c - pthread条件变量只能使用一次吗?

opencl - 在 Ubuntu 上编译 OpenCL

c++ - 运算符删除函数的放置形式

c++ - 为 MinGW 配置 Eclipse

python - 安装了 beignet 以在 Intel 上使用 OpenCL,但 OpenCL 程序仅在以 root 身份运行时才有效

c - 什么情况下无法展开循环?

c++ - 无缘无故地在我的 C++ 指针代码中不断出现错误

c++ - 一个 if else 语句将不会执行