我将主线程的亲和性设置为核心0,但OpenCl上下文创建以段错误结束。 (我加入了一个代码片段来重现该问题,我删除了向量大小检查,以使其尽可能简洁。)
如果我在cpuset中定义了多个内核,则一切正常。
我对可能出了什么问题有直觉。但我希望有一个具体的解释。
然后,错误可能比原始的段错误更好。
打开CL信息:
#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版本
答案 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驱动程序。