2

次のようなコードがあります。

for(int i =0; i<2; i++)
{
    //initialization of memory and some variables
    ........
    ........
    RunDll(input image, output image); //function that calls kernel
}

上記のループの各反復は独立しています。それらを同時に実行したい。だから、私はこれを試しました:

for(int i =0; i<num_devices; i++)
{
    cudaSetDevice(i);
    //initialization of memory and some variables
    ........
    ........
    RunDll(input image, output image); 
    {
        RunBasicFBP_CUDA(parameters); //function that calls kernel 1

        xSegmentMetal(parameters); //CPU function

        RunBasicFP_CUDA(parameters);  //function that uses output of kernel 1 as input for kernel 2

        for (int idx_view = 0; idx_view < param.fbp.num_view; idx_view++)
        {
            for (int idx_bin = 1; idx_bin < param.fbp.num_bin-1; idx_bin++)
            {
                sino_diff[idx_view][idx_bin] = sino_org[idx_view][idx_bin] - sino_mask[idx_view][idx_bin];
            }
        }

        RunBasicFP_CUDA(parameters);
        if(some condition)
        {
            xInterpolateSinoLinear(parameters);  //CPU function
        }
        else
        {
            xInterpolateSinoPoly(parameters);  //CPU function
        }

        RunBasicFBP_CUDA( parameters );
    }
}

2 つの GTX 680 を使用しており、これら 2 つのデバイスを同時に使用したいと考えています。上記のコードでは、速度が向上しません。処理時間はシングル GPU で実行した場合とほぼ同じです。

利用可能な 2 つのデバイスで同時実行を実現するにはどうすればよいですか?

4

2 に答える 2

5

あなたのコメントであなたは言う:

RunDll には 2 つのカーネルがあり、1 つずつ起動されています。カーネルには cudaThreadSynchronize() があります

これは、1 つの GPU で実行し、同期してから、別の GPU で実行することを意味する(そして前者は実際には非推奨ですcudaThreadSynchronize()) と同等であることに注意してください。また、これはブロッキング ルーチンであることに注意してください。すべてのブロッキングを回避するにはバージョンが必要です(コメントで @JackOLantern が指摘しているように)。cudaDeviceSynchronize()cudaMemcpy()cudaMemcpyAsync()

一般に、内容の詳細を投稿する必要がありRunDLL()ます。そうしないと、質問に決定的な回答を与えるのに十分な情報が得られないためです。これらのガイドラインに従うのが理想的です。

于 2013-09-05T11:45:32.057 に答える