3

大規模なデータ セットを分割し、作業を複数の GPU に分割したいと考えています。2 回目の実行で GPU にロードする必要がないように、これらのデータを静的にしたいと考えています。ここでの問題は、pthread_create ではすべての入力データを「構造体」にアセンブルする必要があり、一連の静的データを構造体にアセンブルできるかどうかわからないことです。提案をありがとう。

4

1 に答える 1

2

「最新の」CUDA マルチ GPU では、特定のデバイスでコンテキストを保持するために別のホスト スレッドを使用する必要がなくなりました。CUDA 4.0 以降、API はスレッド セーフであり、1 つのホスト スレッドは を使用するだけで複数のコンテキストを保持して操作できます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 呼び出しでポインターを使用する前に、必ずデバイスを選択してください。

于 2012-12-18T10:33:44.910 に答える