0

AleaGpu で (行 =10 と行 =5 の代わりに) 10000 行と 10000 列の配列を使用するにはどうすればよいですか?

private void button3_Click(object sender, EventArgs e)
{
    var worker = Worker.Default;
    const int rows = 10;
    const int cols = 5;
    var rng = new Random();
    var inputs = new double[rows, cols];
    for (var row = 0; row < rows; ++row)
    {
        for (var col = 0; col < cols; ++col)
        {
            inputs[row, col] = rng.Next(1, 100);
        }
    }
    var dInputs = worker.Malloc(inputs);
    var dOutputs = worker.Malloc<double>(rows, cols);
    var lp = new LaunchParam(1, 1);
    worker.Launch(Kernel, lp, dOutputs.Ptr, dInputs.Ptr, rows, cols);
    var outputs = new double[rows, cols];
    dOutputs.Gather(outputs);
    Assert.AreEqual(inputs, outputs);
}

行 = 10000 と列 = 10000 を使用する場合 (行 =10 と行 =5 の代わりに):

関数で「「Alea.CUDA.CUDAInterop.CUDAException」タイプの未処理の例外が発生しました」というエラーが関数に表示されます: public static void Gather(this DeviceMemory dmem, T[,] array2D) :

    dmem.Worker.EvalAction(() =>
        {
            CUDAInterop.cuSafeCall(CUDAInterop.cuMemcpyDtoH(hostPtr, devicePtr,
                new IntPtr(Intrinsic.__sizeof<T>() * rows * cols)));
        });  

このエラーを取り除くにはどうすればよいですか?

4

1 に答える 1

1

まず、 には enum フィールドがCUDAExceptionあるため、デバッグして CUDA エラーを取得できます。次のコードのように:

        catch (CUDAInterop.CUDAException x)
        {
            var code = x.Data0;
            Console.WriteLine("ErrorCode = {0}", code);
            Assert.Fail();
        }

ここで、10000x10000 マトリックスで実行したところ、エラーが発生しました: CUDA_ERROR_LAUNCH_FAILED. その理由は、1 つのスレッドで大きな行列を反復しているため、カーネルが実行に失敗したためです。このテストは単に 2 次元配列の使用方法を示すためだけに作成したものですが、実際に大きなことを行う場合は、このような単純なカーネルを使用せず、1 スレッドで実行してください。これにより、カーネルが長時間実行され、最終的に CUDA ドライバーが実行するには長すぎることがわかり、ドライバーはこのカーネル実行を強制終了します。そのため、新しい真の並列カーネルを設計して、大きな行列を反復します。

于 2015-10-21T12:39:39.947 に答える