我认为这可能是一个非常愚蠢的问题,但我对OpenCL非常陌生,只是在我的桌面电脑上运行GTX 760 GPU。
现在当我查询OpenCL' CL_DEVICE_MAX_COMPUTE_UNITS
时,它说GPU上有6个。然而在机载gpu(英特尔高清显卡4600)上,它表示有20个。
这看起来有点令人失望,因为我预计GTX会有更多的机载GPU?
或CL_DEVICE_MAX_COMPUTE_UNITS
不能直接转换为核心数量?
答案 0 :(得分:3)
你倾向于认为,“我的设备有多少核心?” “因此我会推出那么多线程。”
对于像OpenCL / CUDA这样的案例,这种思维方式是错误的。
核心包含有限数量的资源,内存和线程。根据每个“线程”的使用量(因此,取决于代码/内核),核心将能够同时运行不同数量的线程。
所以第一个未知的是:“核心可以运行多少个线程?”,在编译代码之前不知道,不同版本的编译器/驱动程序会导致不同的结果。
如果您不知道每个核心有多少个线程,那么您知道“6x?=?”的用途是什么。你仍然不知道有多少线程可以并行运行,你永远不会。当然你可以获得最大值,但这可能并不总是那样,那么它对真正的应用有什么用呢?
你必须认为GPU是一个非常简单的工人,只能在X组中进行相同的任务。
唯一重要的问题是“在同一组中并行工作多少线程?”。因为你可以做一些聪明的合作技术,所以那些线程一起运行得更快。这就是“工作组规模”。
其他参数简直是多余的。只会让您的应用更快或更慢。或者允许您同时运行多个任务。但它不应该是一个设计参数。
与CPU时钟速度相同,或者L1缓存不是CPU编程中的设计参数。或者有多少其他应用正在运行。