0

我正在尝试将一些以链表形式的数据传输到我的 GPGPU。我是否需要进行与节点数量一样多的转移,还是有更好更快的方法来做到这一点?

4

2 回答 2

5

使用 Thrust 库时,您可以从迭代器范围生成设备向量。在以下站点,他们为此案例提供了一个示例

#include <thrust/device_vector.h>
#include <thrust/copy.h>
#include <list>
#include <vector>

int main(void)
{
    // create an STL list with 4 values
    std::list<int> stl_list;

    stl_list.push_back(10);
    stl_list.push_back(20);
    stl_list.push_back(30);
    stl_list.push_back(40);

    // initialize a device_vector with the list
    thrust::device_vector<int> D(stl_list.begin(), stl_list.end());

    // copy a device_vector into an STL vector
    std::vector<int> stl_vector(D.size());
    thrust::copy(D.begin(), D.end(), stl_vector.begin());

    return 0;
}

https://github.com/thrust/thrust/wiki/Quick-Start-Guide

查看标题为“迭代器和静态调度”的部分。

您可以使用 STL 的算法库执行类似的操作。

std::list<int> stl_list;
stl_list.push_back(10);
...
float *myarray = new float[stl_list.size()];
float *mydevicearray;
CUDA_SAFE_CALL(cudaMalloc(&mydevicearray, sizeof(float)*stl_list.size()));
std::copy(stl_list.begin(), stl_list.end(), myarray);
CUDA_SAFE_CALL(cudaMemcpy(myarray, mydevicearray, sizeof(float)*stl_list.size(), cudaMemcpyHostToDevice));

这两个示例应该只进行一次 memcopy 操作,因为将内存复制到 CUDA 设备的成本很高,而且对列表中的每个元素都这样做是不合逻辑的。

于 2012-09-19T13:48:07.273 回答
0

如果要将数据从链表传输到数组(到 GPU),您只需将节点中的值发送到数组 (GPU)。这是一个简单的。您可以使用cudaMalloc()节点数的大小。

如果您尝试将数据从链表传输到链表(到 GPU),那么创建节点和传输数据是一个忙碌的过程。您可以调用不同的函数来创建节点、链接节点等。(不推荐,因为链表比并行更串行)。

建议选择第一种情况。它很简单,您想要的只是数据传输。

尝试数据结构的推力库。

于 2012-09-19T08:31:16.387 回答