条件:
我安装了 AMD OpenCL 版本AMD-APP-SDK-v2.8-lnx64和 Intel OpenCL 版本 *intel_sdk_for_ocl_applications_xe_2013_r2_sdk_3.1.1.11385_x64*(版本识别不能更复杂)根据具有双插槽Xeon的 HPC 服务器上的描述E5-2650、Xeon Phi 协处理器、64GB 主机内存和 Red Hat Enterprise Server 6.4。
问题描述:
我想用OpenCL做设备裂变来解决NUMA问题。不幸的是,设备(英特尔 CPU)或者 Linux 内核似乎不支持CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN。我尝试了 Intel OpenCL 和 AMD OpenCL。尽管 AMD OpenCL 设备查询说它支持关联域选项,但实际上并不支持:当我尝试使用 CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN 运行代码时,clCreateSubDevices() 函数返回 -30 错误代码。根据论坛帖子,我猜这是当前英特尔 OpenCL 驱动程序中的一个错误。
潜在的解决方案:
我认为如果我可以选择前 16 个并行计算核心(8 个核心 + 8 个超线程)(在总共 32 个并行计算核心中),它们将映射到第一个套接字。不幸的是,英特尔 OpenCL 将 16 个并行计算内核随机分布在 32 个内核中。另一方面,AMD OpenCL 选择了前 16 个并行计算内核,但 OpenCL 编译器在我正在运行的内核上表现不佳。所以没有免费的午餐定理也适用于此。
问题:
- 有什么方法可以指定 OpenCL 应该使用哪些并行计算核心进行计算?
- 有什么办法可以用 OpenCL 克服这个 NUMA 问题?
欢迎对 NUMA 亲和力的体验发表任何评论。
谢谢!
更新
部分解决方法,仅适用于单插槽测试:
(在 Linux 中)禁用一个 NUMA 节点的所有内核,因此 OpenCL ICD 只能从另一个 NUMA 节点的硬件线程中进行选择。例如。在 2 插座 32 HTT 系统上:
sudo sh -c "echo 0 > /sys/devices/system/cpu/cpu31/online"
....
sudo sh -c "echo 0 > /sys/devices/system/cpu/cpu16/online"
我不确定这种黑客攻击是否没有副作用,但到目前为止它似乎有效(至少用于测试)。