条件:
我安装了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 E5-2650,Xeon Phi协处理器,64GB主机内存和Red Hat Enterprise Server 6.4的HPC服务器上的说明。
问题描述:
我想用 OpenCL 进行设备分裂以解决 NUMA 问题。不幸的是,设备(Intel CPU)或Linux内核似乎不支持 CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN 。我尝试过Intel OpenCL和AMD OpenCL。虽然AMD OpenCL设备查询说它支持affinity域选项,但实际上它不会:当我尝试使用CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN运行代码时,clCreateSubDevices()函数返回-30错误代码。根据{{3}},我猜这是当前英特尔OpenCL驱动程序中的一个错误。
潜在解决方案:
我认为如果我可以选择前16个并行计算核心(8个核心+ 8个超线程)(在32个并行计算核心中),那么这些核心将映射到第一个插槽。不幸的是,英特尔OpenCL在32个核心上随机分配了16个并行计算核心。另一方面,AMD OpenCL选择了前16个并行计算核心,但OpenCL编译器在我正在运行的内核上做得不好。所以这里也没有免费午餐定理。
问题:
欢迎任何有关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"
我不确定这种黑客攻击是否没有副作用,但到目前为止它似乎有用(至少测试)。