内核变量位置

时间:2012-08-16 17:53:54

标签: memory-management cuda

我正在创建一个内核来管理位于结构和数组上的大量变量。 我知道如果我使用通过cudaMalloc分配的变量(全局内存......对吗?),计算速度会非常慢(我已经尝试过了,结果比我的算法的顺序版慢)。

如果我在内核变量上复制数据的数组,我会提高性能吗?

内核内存(它应该被称为“本地内存”,对吧?)应该比全局内存更快?

2 个答案:

答案 0 :(得分:1)

本地内存与全局内存一样慢。如果您的数据太大而无法存储在寄存器或共享内存中而您不需要写操作,则可以尝试使用纹理内存或常量内存,这些内存缓存因此比全局内存更快。

答案 1 :(得分:0)

我认为你对CUDA的工作方式感到有点困惑。我会尽力帮助,但我强烈建议您查看CUDA Programming Guide以及CUDA附带的示例。对于你对结构的研究,我会推荐Black Scholes的例子。

  

我知道如果我使用通过cudaMalloc分配的变量(全局内存......对吗?),计算速度会很慢(我已经尝试过了,结果比我的alghoritm的顺序版慢)

是的,您确实使用cudaMalloc分配给GPU设备到全局内存,正确。计算不一定很慢,但根据您对慢速的定义,将大量数据复制到设备(GPU)内存的过程可能会很慢。在CUDA中限制将内存复制到设备总是好的。

  

如果我在内核变量上复制数据的数组,我会提高性能吗?内核内存(它应该被称为“本地内存”,对吗?)应该比全局内存更快?

这句话没有意义,我不认为你理解设备内存是如何工作的。

在进一步深入之前,不要担心内存优化问题。特别是你应该检查每个CUDA调用错误,特别是CudaMalloc和CudaMemcpy,否则你会遇到一些严重的问题。

如果您计划真正学习GPU编程,我建议您阅读很多相关内容并查看示例程序。如果没有,你绝对应该检查一些现有的软件,而不是程序员使用GPU。特别是Thrust非常适用于此目的,特别是对于Map / Reduce样式任务。