【发布时间】:2020-06-30 21:37:05
【问题描述】:
我正在尝试使用混合器在 C# 中使用 GPU 进行计算。我尝试使用 Altimesh Hybridizer 将我的 GPU 代码嵌入到 .NET 库中。我们称它为 GPU_DLL。
这个库必须在另一个项目中使用,我们称之为Test_GPU_Caller。 GPU 代码使用定时器定期调用,如下代码所示:
class Program
{
static GPU_DLL.GPU_DLL gpuDllTest = new GPU_DLL.GPU_DLL();
static void Main(string[] args)
{
Timer tmr = new Timer(100);
tmr.Elapsed += Tmr_Elapsed;
tmr.Start();
while (true) ;
}
private static void Tmr_Elapsed(object sender, ElapsedEventArgs e)
{
gpuDllTest.Test("GPU_DLL_CUDA.dll");
}
}
测试功能在 .NET 库中实现,代码如下:
public class GPU_DLL
{
[EntryPoint("run")]
public void Run(int N, double[] a, double[] b)
{
Parallel.For(0, N, i => { a[i] += b[i]; });
}
public void Test(string dllName)
{
// 268 MB allocated on device -- should fit in every CUDA compatible GPU
int N = 1024 * 1024 * 16;
double[] acuda = new double[N];
double[] adotnet = new double[N];
double[] b = new double[N];
Random rand = new Random();
//Initialize acuda et adotnet and b by some doubles randoms, acuda and adotnet have same numbers.
for (int i = 0; i < N; ++i)
{
acuda[i] = rand.NextDouble();
adotnet[i] = acuda[i];
b[i] = rand.NextDouble();
}
cudaDeviceProp prop;
cuda.GetDeviceProperties(out prop, 0);
HybRunner runner = HybRunner.Cuda(dllName).SetDistrib(prop.multiProcessorCount * 16, 128);
// create a wrapper object to call GPU methods instead of C#
dynamic wrapped = runner.Wrap(this);
// run the method on GPU
wrapped.Run(N, acuda, b);
// run .Net method
Run(N, adotnet, b);
// verify the results
for (int k = 0; k < N; ++k)
{
if (acuda[k] != adotnet[k])
Console.Out.WriteLine("ERROR !");
}
Console.Out.WriteLine("DONE");
//Thread.Sleep(10000);
}
}
GPU_DLL 已被首先混合并编译。当我启动程序时,我收到一个错误: System.ArgumentException:'Un élément avec la meme clé a déjà été ajouté。 (法语...)
有人知道如何使用 Hybridizer 定期调用的 GPU 代码吗?欢迎提供示例项目;)
最好的问候, 瓦伦丁
【问题讨论】:
-
法语中的错误与您的语言环境有关。 (这是一个未捕获的系统异常)。
标签: c# hybridizer