0

我开始使用 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 循环来保持我的代码简单。

4

1 回答 1

1

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

编辑:在 Alea gpu 网页中找到了这个例子

于 2018-01-24T23:03:45.827 回答