如何将静态数据划分为多个GPU?

时间:2012-12-18 02:13:42

标签: cuda pthreads gpu

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

1 个答案:

答案 0 :(得分:2)

在“现代”CUDA multi-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];
}

[免责声明:用浏览器编写,从未编译或测试,使用自己的风险]

假设GPU从[0,ngpus-1]开始按顺序编号,源数据保存在长度为host_array的浮点数组N中。您将获取pvals中的一系列设备指针以及plens中每个数组的长度。请注意,每个指针仅在您分配它的上下文中有效,因此请确保在使用带有内核启动或API调用的指针之前选择设备。