所以我试图用 Alea/C# 实现一些代码。目前,它是基本代码。我尝试了 Alea 网站上提供的教程和示例。这些示例工作得很好,但是当我编写自己的代码版本时,即使用随机游走并为每次游走动态定义步数时,它似乎不起作用。
我如下设置一个双精度数组并将其初始化为0:
[GpuParam] public static double[] gaussian = {0};
然后我使用 gpumanaged 方法:
[GpuManaged]
private static void Random()
{
using (var rng = Generator.CreateGpu(Gpu.Default,RngType.PSEUDO_XORWOW))
{
rng.SetPseudoRandomGeneratorSeed(42);
rng.GenerateUniform(gaussian);
}
}
然后我使用并行函数,在 alea 网站上有大量示例。
[GpuManaged]
private static void Test()
{
var prices = new double[100];
Gpu.Default.For(0, 100,
i =>
{
Random();
prices[i] = gaussian[0];
});
}
但是,当我运行它时,我得到了错误:
System.Exception: 'Found more than one basic block without predecessors.
源位置堆栈:
-> in C:\Users\tub08918\source\repos\GpuMCOptics\GpuMCOptics\Program.cs(45,21-45,30)
-> at GpuMCOptics.Program+<>c__DisplayClass6_0.[Void <Test>b__0(Int32)]
-> at Alea.Parallel.Device.DeviceFor.[Void Kernel(Int32, Int32, System.Action`1[System.Int32])]
-> at defining runtime64 (sm52,64bit)
Loading method as kernel:
-> Method: Alea.Parallel.Device.DeviceFor.[Void Kernel(Int32, Int32, System.Action`1[System.Int32])]
-> InstanceOpt: <None>
-> Argument.#0: 0
-> Argument.#1: 100
-> Argument.#2: System.Action`1[System.Int32]
Getting or loading method as kernel:
-> Method: Alea.Parallel.Device.DeviceFor.[Void Kernel(Int32, Int32, System.Action`1[System.Int32])]
-> InstanceOpt: <None>
-> Argument.#0: 0
-> Argument.#1: 100
-> Argument.#2: System.Action`1[System.Int32]
对此的任何帮助都会有所帮助。我对使用这些 gpu 架构非常感兴趣,但我整天都在努力解决这个问题,当我尝试不同的方法(例如启动内核和操作以及使用共享内存)时,我变得越来越困惑,但这些方法都不起作用。