OpenCL在GTX 760上只显示6个并行计算单元?

3
我认为这可能是一个非常愚蠢的问题,但我对OpenCL非常陌生,并且刚刚在我的台式计算机上安装了GTX 760 GPU。现在当我查询OpenCL的CL_DEVICE_MAX_COMPUTE_UNITS时,它显示GPU上有6个。然而,在集成显卡(Intel HD Graphics 4600)上,它显示有20个。这似乎有点令人失望,因为我期望GTX拥有比集成显卡更多的设备单元?或者说CL_DEVICE_MAX_COMPUTE_UNITS不能直接转换为核心数?

1
GTX 760读取6个CL计算单元,但我认为每个计算单元实际上是192个核心的虚拟化,总共达到了宣传的6 * 192 = 1152个核心。如果我理解有误请纠正我。这个数字本身并不能说明显卡的性能或者你可以分配的工作量。此外,还有类似的问题,请参考:https://dev59.com/nW025IYBdhLWcg3w_rFA - user2464424
有道理。有没有一种方法可以查询线程的数量?也就是说,我是否可以在不知道特定卡的情况下动态地找到数字1152? - user1291510
显然,如果你只是想要规范细节,那么你无法获得那个数字。如果需要该信息,请使用维基百科列表的网络爬虫。CL_DEVICE_MAX_WORK_GROUP_SIZE将告诉您允许的最大工作项计数,但您无法知道正在执行的工作是否并行执行,并且必须“信任”硬件。换句话说,拥有1152个线程并不意味着这些线程每个都在自己的核心中执行。 - user2464424
1个回答

3
您可能会认为:“我的设备有多少个核心?”,“因此,我将启动同样数量的线程。”然而,在OpenCL/CUDA等情况下,这种想法是错误的。
每个核心都包含有限的资源、内存和线程。根据每个“线程”将使用多少(因此,取决于代码/内核),核心将能够同时运行不同数量的线程。因此,第一个未知参数是:“一个核心可以运行多少线程?”直到编译代码之前,这是未知的,并且不同版本的编译器/驱动程序可能导致不同的结果。
如果您不知道每个核心可以运行多少线程,那么知道“6x?=?”又有什么用呢?您仍然不知道可以并行运行多少个线程,而且永远不会知道。当然,您可以获得最大值,但这可能并不总是这样的,那么对于实际应用程序有什么用处呢?
您必须意识到GPU是一群数量未知的非常简单的工人,只能以X组的形式执行相同的任务。唯一重要的问题是“多少个线程将同时在同一组中工作?”因为您可以使用一些聪明的合作技巧,使这些线程更快地一起运行。这就是“工作组大小”。
其他参数只是多余的。它们只会使您的应用程序更快或更慢。或允许您同时运行多个任务。但是,它不应该是设计参数。
与CPU编程中CPU时钟速度或L1缓存或正在运行的其他应用程序数量一样,GPU的核心数量也不是设计参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接