2015-01-03 28 views
2

我想写一个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,但这两者都无法解决)。

我在做什么错误(或理解错误的方式)?

感谢您的帮助。

回答

0

您是否尝试过使用这些标志中的任何一个?

CL_AFFINITY_DOMAIN_L1_CACHE_EXT     0x1 
CL_AFFINITY_DOMAIN_L2_CACHE_EXT     0x2 
CL_AFFINITY_DOMAIN_L3_CACHE_EXT     0x3 
CL_AFFINITY_DOMAIN_L4_CACHE_EXT     0x4 
CL_AFFINITY_DOMAIN_NUMA_EXT      0x10 
CL_AFFINITY_DOMAIN_NEXT_FISSIONABLE_EXT   0x100 

我认为当你使用CL_DEVICE_PARTITION_BY_COUNTS,你所要求的任何单核做的工作。上面的标志将尝试根据缓存级别进行分组,这是您的目标。我没有亲自测试过,看看操作系统是否会遵守亲和力,但我希望它应该这样做。 read more here.

+0

是的,我试过使用这些。不幸的是,Intel OpenCL SDK和AMD OpenCL SDK(/ drivers)似乎都不支持亲和域。 – dorbeetle