我正在尝试将一些以链表形式的数据传输到我的 GPGPU。我是否需要进行与节点数量一样多的转移,还是有更好更快的方法来做到这一点?
问问题
1322 次
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 回答