c - 调度程序不考虑 OpenCL 子设备亲和性

标签 c windows opencl partition numa

我正在尝试编写一个在特定 CPU 上执行内核的 OpenCL 概念验证应用程序(因此将来可以扩展为 NUMA 感知并为相应 NUMA 上的内核执行分配内存-节点,正如指出的 in the Intel Dev forums )。

不幸的是,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 ,这也没有成功)。

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

感谢您的帮助。

最佳答案

您是否尝试过使用这些标志?

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.

关于c - 调度程序不考虑 OpenCL 子设备亲和性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27754816/

相关文章:

c - 套接字发送和 EWOULDBLOCK

c++ - 指针递增 1 来遍历数组的元素是否更快?

c - U-Boot 2020.04 : Probing SPI flash fails - Invalid bus 0 (err=-19)

c - 返回按下的键而不输入确认

windows - 批处理文件创建多个文件夹和子文件夹

c# - 是否可以在 Docker 容器中运行 Kinect V2?

c - 在C中将字符串拆分为一定大小的字符串

c - OpenCL 一维数组大数乘法

c - 如何在没有警告的情况下传递用户定义的固定长度数组类型(C 和 OpenCL)

c++ - 收到 cl_build_program_failure 错误