C# 禁用Alea GPU For循环上的延迟编译

C# 禁用Alea GPU For循环上的延迟编译,c#,cuda,aleagpu,C#,Cuda,Aleagpu,我开始使用Alea GPU library for C,我在熟悉的环境中与CUDA一起工作非常愉快。然而,我解决了一个我无法轻松解决的问题 因此,我使用Alea GPU编写了一小部分代码: Alea.Parallel.GpuExtension.For(gpu, 0, Points.Count, i => { xComponent[i] = xComponent[i] - minX; yComponent[i] = yCompo

我开始使用Alea GPU library for C,我在熟悉的环境中与CUDA一起工作非常愉快。然而,我解决了一个我无法轻松解决的问题

因此,我使用Alea GPU编写了一小部分代码:

Alea.Parallel.GpuExtension.For(gpu, 0, Points.Count, i =>
        {
            xComponent[i] = xComponent[i] - minX;
            yComponent[i] = yComponent[i] - minY;
            zComponent[i] = zComponent[i] - minZ;
        });
和它在C中的平凡对应物使用Parallel.For,使用相同的代码块处理内部组件。仅供参考,Points.Count大约等于270万,我正在Geforce GT 635M上运行此代码

我开始比较这两种方法的性能,并注意到一个意外的行为。在第一次运行时,上面发布的代码比其CPU并行速度慢近10倍。下一次的运行都按照预期进行,并且比C代码更快


我猜在CUDA代码上执行了某种类似于延迟加载的延迟编译,并且在第一次运行中花费的时间也包含了实际的编译时间。那么,有没有一种简单的方法来强制执行此代码的预编译?我注意到内核可以提前编译,但我更喜欢使用Alea.Parallel.GpuExtension.For循环保持代码的简单。

据我所知,它可能是GPU唤醒和JIT编译的混合体。如果要多次执行该内核,一个内核的速度慢可能不会影响您,我不熟悉该GPU库,但您可能希望编译几个内核,从而避免在二进制文件上重新编译。您还可以在此之前运行一个小内核来初始化和预热gpu

编辑:在Alea gpu网页中找到