在创建OpenCL上下文之前设置线程关联会导致Segfault

时间:2019-07-09 10:33:13

标签: c++ pthreads opencl intel

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

如果我在cpuset中定义了多个内核,则一切正常。

我对可能出了什么问题有直觉。但我希望有一个具体的解释。

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

打开CL信息:

  • 设备版本英特尔OpenCL 1.2(内部版本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版本

1 个答案:

答案 0 :(得分:1)

我刚刚使用两个Intel 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设置与Intel OpenCL运行时的关联性不是问题

我在超级计算机上将它与MPI一起使用,在那里您将拥有多个,例如4,每个计算节点的MPI进程,然后将运行时将每个进程' CPU掩码设置为可用核心的不同子集。然后,每个进程中的Intel OpenCL运行时(在后台使用Intel线程构建模块)将为每个分配的内核产生一个线程,即按预期遵守主机进程的CPU掩码。如果设置第一个线程的亲和力,结果可能会有所不同,并且还取决于设置的程序位置(相对于OpenCL运行时生成线程的位置)。

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