我想对一个大型数据集进行分区并在多个 GPU 上拆分工作。我想让这些数据静态化,这样我就不必在第二次运行时加载到 GPU。现在的问题是,pthread_create 要求将所有输入数据组装成一个“结构”,我不确定将一堆静态数据组装成一个结构是否可行。感谢您的任何建议。
问问题
369 次
1 回答
2
在“现代”CUDA 多 GPU 中,不再需要使用不同的主机线程来保存给定设备上的上下文。从 CUDA 4.0 开始,API 是线程安全的,一个主机线程可以简单地使用cudaSetDevice
.
在 CUDA 4.x 或 CUDA 5 中,如何在多个 GPU 上分发大型数据集的一个非常非常基本的示例可能很简单:
int remainder = N;
int* plens = new int[ngpus];
float** pvals = new float*[ngpus];
float* source = &host_array[0];
for(int i=0; i<ngpus; i++) {
const int blen = N/gpus;
plens[i] = blen;
remainder -= blen;
if (remainder < blen) {
plens[i] += remaninder;
remainder = 0;
}
size_t sz = sizeof(float) * size_t(plens[i]);
cudaSetDevice(i);
cudaMalloc((void **)&pvals[i], sz);
cudaMemcpy(pvals[i], source, sz, cudaMemcpyHostToDevice);
source += plens[i];
}
[免责声明:用浏览器编写,从未编译或测试,使用风险自负]
host_array
假设 GPU 从 [0,ngpus-1] 开始按顺序编号,并且源数据保存在长度为的浮点数组中N
。你会得到一个设备指针数组pvals
和每个数组的长度plens
。请注意,每个指针仅在分配它的上下文中有效,因此请确保在将指针用于内核启动或 API 调用之前选择设备。
于 2012-12-18T10:33:44.910 回答