0

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

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

内核内存(应该叫“本地内存”吧?)应该比全局内存快?

4

2 回答 2

1

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

于 2012-08-16T18:30:39.127 回答
0

我认为您对 CUDA 的工作方式有点困惑。我将尽我所能提供帮助,但我强烈建议您查看CUDA 编程指南以及 CUDA 中包含的示例。对于您在结构上的工作,我会推荐 Black Scholes 示例。

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

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

如果我将数据数组复制到内核变量上,我会提高性能吗?内核内存(应该叫“本地内存”吧?)应该比全局内存快?

这种说法没有意义,我认为您不了解设备内存的工作原理。

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

如果您打算真正学习 GPU 编程,我建议您阅读大量相关内容并查看示例程序。如果没有,您绝对应该检查一些现有的软件来使用 GPU,而无需成为程序员。特别是Thrust非常适合此目的,尤其是对于 Map/Reduce 风格的任务。

于 2012-08-16T18:13:51.797 回答