gpt4 book ai didi

cuda - 如何最好地将大量字符数组传输到 GPU?

转载 作者:行者123 更新时间:2023-12-04 05:46:42 27 4
gpt4 key购买 nike

我是 CUDA 的新手,正在尝试对大量数组进行一些处理。每个数组是一个大约 1000 个字符的数组(不是字符串,只是存储为字符),最多可以有 100 万个字符,因此要传输大约 1 GB 的数据。这些数据已经全部加载到内存中,我有一个指向每个数组的指针,但我认为我不能依赖内存中的所有数据,所以我不能只通过一次调用就将它们全部传输。

我目前用推力做了第一次尝试,我的解决方案基于 this message ...我用分配所有内存的静态调用创建了一个结构,然后每个单独的构造函数复制该数组,并且我有一个转换调用,它接收带有指向设备数组的指针的结构。

我的问题是这显然非常慢,因为每个数组都是单独复制的。我想知道如何更快地传输这些数据。

this question (这个问题大多无关,但我认为用户正在尝试做类似的事情)talonmies 建议他们尝试使用 zip 迭代器,但我不知道这将如何帮助传输大量数组。

我在写这个问题时也刚刚发现了 cudaMemcpy2DToArray 和 cudaMemcpy2D,所以也许这些就是答案,但我没有立即看到它们是如何工作的,因为它们似乎都没有将指向指针的指针作为输入......

欢迎任何建议...

最佳答案

一种方法是按照 marina.k 的建议,仅在您需要时对传输进行批处理。由于您说每个数组仅包含大约 1000 个字符,您可以将每个字符分配给一个线程(因为在 Fermi 上,我们可以为每个块分配 1024 个线程)并让每个数组由一个块处理。在这种情况下,您可以在一次调用中传输一个“回合”的所有数组 - 您可以使用 FORTRAN 样式,在其中创建一个巨大的数组并获得“第三个”1000 个字符数组的第 5 个元素走:

third_array[5] = big_array[5 + 2*1000]

这样前 1000 个字符数组构成 big_array 的前 1000 个元素,第二个 1000 个字符数组构成 big_array 的第二个 1000 个元素,依此类推?在这种情况下,您的字符在内存中将是连续的,并且您可以仅在一个 memcpy 中使用一个内核启动来移动要处理的集合。然后,只要启动一个内核,就在 CPU 端重新填充 big_array 并将其异步复制到 GPU。

在每个内核中,您可以简单地处理 1 个块内的每个数组,以便块 N 处理第 (N-1) 千个元素,直到 d_big_array 的第 N 千个元素(您将所有这些字符复制到的位置)。

关于cuda - 如何最好地将大量字符数组传输到 GPU?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10590595/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com