我想写一个OpenCL的概念应用程序的证明,在特定的CPU上执行一个内核(因此可以在将来扩展为NUMA感知,并为内存分配内核在相应的NUMA节点上执行,如in the Intel Dev forums所示)。调度程序没有考虑OpenCL子设备的亲和力
不幸的是,Windows调度程序并不在乎我想要什么,因为它似乎通过所有可用的CPU核心(因此远离本地内存)来循环我的内核。
我现在使用CL_DEVICE_PARTITION_BY_COUNTS
属性创建一个只有一个执行单元的子设备,然后在这个子设备上执行内核。尽管如此,当我观察Windows的CPU使用情况时,并不是说单个核心繁忙,而是多个核心的工作负载高峰(除非我使用任务管理器手动将进程固定到一个核心 - 那么我会得到结果我一直期待)。
这里是属性的完整定义我用来创建子设备(如果我查询的子设备的执行单元的数量是正确的给我“1”):
cl_device_partition_property props[4];
props[0] = CL_DEVICE_PARTITION_BY_COUNTS;
props[1] = 1;
props[2] = CL_DEVICE_PARTITION_BY_COUNTS_LIST_END;
props[3] = 0;
我使用一台配备两个Intel Xeon处理器的Windows机器(它们被Intel OpenCL实现确认为一个具有24个执行单元的执行设备),并且也尝试使用CL_DEVICE_PARTITION_BY_NAMES_INTEL
,但这两者都无法解决)。
我在做什么错误(或理解错误的方式)?
感谢您的帮助。
是的,我试过使用这些。不幸的是,Intel OpenCL SDK和AMD OpenCL SDK(/ drivers)似乎都不支持亲和域。 – dorbeetle