3

我想对一个大型数据集进行分区并在多个 GPU 上拆分工作。我想让这些数据静态化,这样我就不必在第二次运行时加载到 GPU。现在的问题是,pthread_create 要求将所有输入数据组装成一个“结构”,我不确定将一堆静态数据组装成一个结构是否可行。感谢您的任何建议。

4

1 回答 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 回答