【发布时间】:2012-05-14 20:31:41
【问题描述】:
我是 CUDA 新手,正在尝试对大量数组进行一些处理。每个数组是一个大约 1000 个字符的数组(不是字符串,只是存储为字符),最多可以有 100 万个字符,因此要传输大约 1 gb 的数据。这些数据已经全部加载到内存中,并且我有一个指向每个数组的指针,但我认为我不能依赖内存中顺序的所有数据,所以我不能一次调用就全部传输。
我目前第一次尝试使用推力,并将我的解决方案基于this message ...我创建了一个带有分配所有内存的静态调用的结构,然后每个单独的构造函数复制该数组,我有一个转换调用,它接收带有指向设备数组的指针的结构。
我的问题是这显然非常慢,因为每个数组都是单独复制的。我想知道如何更快地传输这些数据。
在this question 中(这个问题大多不相关,但我认为用户正在尝试做类似的事情)talonmies 建议他们尝试使用 zip 迭代器,但我看不出这将如何帮助转移大量的数组。
我在写这个问题时也刚刚发现了 cudaMemcpy2DToArray 和 cudaMemcpy2D,所以也许这些就是答案,但我没有立即看到它们是如何工作的,因为它们似乎都没有将指针作为输入...
欢迎提出任何建议...
【问题讨论】:
-
如果您不需要立即在内核中使用所有这些内存。您可以使用同步复制操作复制其中的一部分,而使用异步复制操作复制其他部分。这种复制机制可以采用你的算法吗?
-
嗯,我不确定,该算法的工作原理是每个数组都可以独立处理,这就是我尝试在 GPU 上并行化它的原因。我想这取决于 GPU 上可用的最大线程数,然后是的,我可以传输那么多数组,然后在处理这些数组时复制其他数组。
-
我最终决定最好的方法就是根本不使用推力,而只是将内存(意味着我必须复制它)重新组织成一个连续的数组可以一次性全部转移。感谢那些回复的人。