【问题标题】:Calling multiple kernels, global memory performances - CUDA调用多个内核,全局内存性能——CUDA
【发布时间】:2012-04-26 17:28:18
【问题描述】:

我有四个 CUDA 内核以下列方式处理矩阵:

convolution<<<>>>(A,B);
multiplybyElement1<<<>>>(B);
multiplybyElement2<<<>>>(A);
multiplybyElement3<<<>>>(C);

// A + B + C with CUBLAS' cublasSaxpy

基本上每个内核(首先是卷积除外)都会执行一个矩阵每个元素乘以一个硬编码在其常量内存中的固定值(以加快速度)。

我是否应该通过调用类似的方法将这些内核合并为一个单独的内核

multiplyBbyX_AbyY_CbyZ<<<>>>(B,A,C)

?

全局内存应该已经在设备上,所以这可能无济于事,但我不完全确定

【问题讨论】:

  • 你能尝试测试这两个版本,看看哪个更好吗?无论如何,由于您正在跨内核调用重用内存中的数据,我怀疑性能会有任何差异。

标签: c++ cuda gpu


【解决方案1】:

如果我理解正确,您是在问是否应该将三个“multiplybyElement”内核合并为一个,其中每个内核读取整个(不同)矩阵,将每个元素乘以一个常数,并存储新的缩放矩阵。

鉴于这些内核将受内存带宽限制(实际上没有计算,每个元素只需乘一次),除非您的矩阵很小,否则合并内核不太可能带来任何好处,在这种情况下,您的使用效率会很低GPU 的原因,因为内核将串行执行(相同的流)。

【讨论】:

  • 谢谢,即使有使用CUBLAS库的“A+B+C”语句也有效?
  • 你的意思是如果你继续打电话给 cuBLAS,我的建议会是一样的吗?是的。
【解决方案2】:

如果合并内核意味着您只能通过一次内存,那么您可能会看到 3 倍的加速。

你可以先将固定值相乘,然后在单个内核中进行单次乘法吗?

【讨论】:

  • 遗憾的是,我需要三个不同的常数乘以三个不同的矩阵
猜你喜欢
  • 2014-04-06
  • 2011-12-20
  • 2014-07-21
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 2011-10-23
  • 2015-09-30
相关资源
最近更新 更多