【发布时间】:2018-11-16 05:38:45
【问题描述】:
我正在测试和比较 GPU 速度与不同数量的工作项(无工作组)。我使用的内核是一个非常简单但耗时的操作。当我使用多个工作项进行测试时,我使用屏障功能并将工作分成更小的块以获得与仅使用一个工作项相同的结果。我使用 cl_event 测量内核执行时间,结果如下:
- 1 个工作项:35735 毫秒
- 2 个工作项:11822 毫秒(比 1 个工作项快 3 倍)
- 10 个工作项:2380 毫秒(比 2 个工作项快 5 倍)
- 100 个工作项:239 毫秒(比 10 个工作项快 10 倍)
- 200 个工作项:122 毫秒(比 100 个工作项快 2 倍)
CPU 平均需要大约 580 毫秒来执行相同的操作。
我不理解且无法解释的唯一结果是具有 2 个工作项的结果。与仅使用一个工作项的结果相比,我希望速度提高大约 2 倍,那为什么是 3?
我试图通过查看这些工作项在处理元素上的分布方式来理解这些数字。我假设如果我只有一个内核,则只有一个计算单元(或多处理器)将被激活,并且工作项分布在该计算单元的所有处理元素(或 CUDA 核心)上。我也不确定一个处理元素是否可以同时处理多个工作项,还是每个处理元素只有一个工作项?
CL_DEVICE_MAX_WORK_ITEM_SIZES 是 1024 / 1024 / 64 和 CL_DEVICE_MAX_WORK_GROUP_SIZE 1024。由于我只使用一个维度,这是否意味着每个处理元素或每个计算单元可以同时运行 1024 个工作项?当我尝试使用 1000 个工作项时,结果是一个较小的数字,所以我认为并不是所有的工作项都被执行了,但为什么会这样呢?
我的 GPU 信息:Nvidia GeForce GT 525M,96 个 CUDA 核心(2 个计算单元,每个单元 48 个 CUDA 核心)
【问题讨论】:
标签: performance concurrency opencl gpu nvidia