【发布时间】:2012-02-17 14:51:45
【问题描述】:
我正在编写一个执行大量BLAS gemv 操作的函数。
我希望能够在 GPU 上执行此操作,并且我已尝试使用 cuBlas。
我的问题是我的矩阵和向量相当小,100x100 矩阵和 100 向量。与 CPU 相比,CuBlas 需要很长时间,我明白为什么,cpu 上的快速缓存和对 GPU 的调用的大量开销。
因此,我试图找出一种聪明的方法来测量将调用传达给 GPU 所需的时间。
这是 CUDA 设置调用并将其发送到图形处理器所需的时间 - 不计算执行矩阵向量乘法实际所需的时间。
我该怎么做呢?
【问题讨论】:
-
这样您就可以动态选择是将作业发送到 CUDA,还是仅仅出于兴趣?
-
@Rup :只是想弄清楚通话的实际成本。并确定慢代码是我的错还是只是架构的产物;-)
-
对于少量数据,不仅开销会伤害您,而且可能缺乏并行性。 GPU 很大程度上依赖于有足够的线程来隐藏延迟(在 gpu 上比在 cpu 上要糟糕得多)。即使没有调用开销,GPU 也可能比 cpu 慢,除非工作被划分为 lots 个线程。很多很容易就意味着数千个线程。
-
@Grizzly 我知道 GPU 需要大量线程才能隐藏内存访问。但这引出了一个问题,有多少是很多? 100 会很多还是我们必须在 1000 或数百万的范围内?
-
@MartinKristiansen:这取决于需要隐藏什么样的延迟。最佳入住率通常在数万范围内。我通常会说任何少于 1000 个线程的东西可能不会从 gpu 计算中受益,少于 10000 个线程仍然会浪费大部分 gpu 潜力。当然这些都是经验法则,实际上它取决于内核(特别是全局内存访问量,很难隐藏)和使用的 gpu
标签: c++ cuda opencl gpgpu timing