2015-10-20 59 views
0

如何在AleaGpu中使用10000行10000列(而不是行= 10和行= 5)的數組?我們如何使用AleaGpu使用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和cols = 10000(而不是行= 10和行= 5):

我碰到一個錯誤「類型Alea.CUDA.CUDAInterop的」未處理的異常。 CUDAException」發生在Alea.CUDA.dll」的功能:公共靜態無效收集(這DeviceMemory DMEM,T [,] array2D):

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

如何刪除這個錯誤?

回答

1

首先,CUDAException中有一個枚舉字段,所以您可以更好地調試以獲取CUDA錯誤。如下面的代碼:

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

現在,我10000x10000矩陣運行它,我得到的錯誤:CUDA_ERROR_LAUNCH_FAILED。原因是,內核無法執行,因爲您正在一個線程中迭代一個大矩陣。我創建這個測試僅僅是爲了展示如何使用二維數組,但如果你正在做一些真正的大事,避免使用這樣簡單的內核,並在1線程中執行它!這會導致內核運行很長時間,最後CUDA驅動程序發現運行時間太長,驅動程序將終止該內核的執行。所以設計一個新的真正的並行內核來迭代大矩陣。

+0

非常感謝你的回答,我有同樣的問題,增加並行性事實上爲我解決了問題! – Sergio0694

相關問題