我开始使用 C# 的 Alea GPU 库,并且在熟悉的环境中使用 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 Parallel.For 对应的代码慢了近 10 倍。每次下一次运行都按预期运行,并且比 C# 代码更快。
我猜想在 CUDA 代码上执行了某种惰性编译(类似于惰性加载),第一次运行所花费的时间也包含实际编译时间。那么有没有一种简单的方法来强制执行这段代码的预编译呢?我注意到内核可以提前编译,但我更愿意使用 Alea.Parallel.GpuExtension.For 循环来保持我的代码简单。