在我的应用程序中,我想向用户显示各种OpenCL设备。 我无法决定如何显示设备中的核心数量。 这只是为了了解有多少线程可以同时并行运行。
计算单位告诉我们多处理器的数量,这可以通过CL_DEVICE_MAX_COMPUTE_UNITS
获得。
要确定每个多处理器支持的线程数是CL_DEVICE_MAX_WORK_GROUP_SIZE
正确的参数吗?
我的笔记本电脑上获得了以下结果:
ATI 7670m GPU
CL_DEVICE_MAX_COMPUTE_UNITS = 6
CL_DEVICE_MAX_WORK_GROUP_SIZE = 256
Intel 3rd gen i5
CL_DEVICE_MAX_COMPUTE_UNITS = 4
CL_DEVICE_MAX_WORK_GROUP_SIZE = 1024
所以我的 GPU有1536线程支持,而 CPU支持4096个线程 ? 这显然不正确,因此需要一些帮助。
答案 0 :(得分:1)
CL_DEVICE_MAX_WORK_GROUP_SIZE是工作组中允许的最大元素数。这与并行度没有关系。也就是说,没有规则工作组中的所有工作项并行执行,而且我知道他们不会执行的实现。 (有一些方法可以处理像障碍一样的工作组同步结构。)
不幸的是,其他值CL_DEVICE_MAX_COMPUTE_UNITS也被模糊地定义。至少使用英特尔,"计算单元的数量"通常是处理器,但对于一个硬件线程的CPU,以及GPU是一个具有多个执行通道的EU。我也不了解ATI,但我敢打赌6个单位可能比4"单位提供更多的并行性。在CPU实现中。换句话说,"单位"是苹果和橘子。最大工作组大小的1024和256与计算无关。
答案 1 :(得分:1)
计算单元数量更接近天真的“核心”定义。但是,考虑到它可能具有任意硬件架构,在我看来,它只会让用户感到困惑。
OpenCL精华之间的映射&硬件非常不稳定。