我们如何使用AleaGpu使用10000行和10000列的数组(而不是rows = 10和rows = 5)?
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);
}
如果我使用rows = 10000和cols = 10000(而不是rows = 10和rows = 5):
我收到错误&#34;未处理的类型&#39; Alea.CUDA.CUDAInterop.CUDAException&#39;发生在Alea.CUDA.dll&#34;在函数中:public static void Gather(此DeviceMemory dmem,T [,] array2D):
dmem.Worker.EvalAction(() =>
{
CUDAInterop.cuSafeCall(CUDAInterop.cuMemcpyDtoH(hostPtr, devicePtr,
new IntPtr(Intrinsic.__sizeof<T>() * rows * cols)));
});
如何删除此错误?
答案 0 :(得分:1)
首先,CUDAException
中有一个枚举字段,因此您可以调试以获得CUDA错误。如下面的代码:
catch (CUDAInterop.CUDAException x)
{
var code = x.Data0;
Console.WriteLine("ErrorCode = {0}", code);
Assert.Fail();
}
现在,我使用10000x10000矩阵运行它,我收到错误:CUDA_ERROR_LAUNCH_FAILED
。原因是,内核无法执行,因为你在一个线程中迭代一个大矩阵。我创建这个测试只是为了简单地展示如何使用2d数组,但如果你正在做一些真实和大的事情,请避免使用这样简单的内核,并在1个线程中执行它!这将导致内核运行很长时间,最后CUDA驱动程序发现它运行时间太长,然后驱动程序将终止此内核执行。因此,设计一个新的真实并行内核来迭代大矩阵。