2

我需要更新一些用于 Aho-Corasick 算法的代码,以便使用 GPU 实现该算法。但是,代码严重依赖于面向对象的编程模型。我的问题是,是否可以将对象传递给parallel for each?如果不; 有什么办法可以使我免于再次重写整个代码。如果这似乎是幼稚的问题,我深表歉意。C++-AMP 是我在 GPU 编程中使用的第一种语言。因此,我在这个领域的经验非常有限。

4

1 回答 1

3

您的问题的答案是肯定的,因为您可以将类或结构传递给标记为 的 lambda restrict(amp)。请注意,parallel_foreach` 不受 AMP 限制,它的 lambda 是。

但是,您只能使用 GPU 支持的类型。这更多是当前 GPU 硬件的限制,而不是 C++ AMP。

C++ AMP 兼容函数或 lambda 只能使用 C++ AMP 兼容类型,包括以下内容:

  • 整数
  • 无符号整数
  • 漂浮
  • 双倍的
  • C 样式的 int、unsigned int、float 或 double 数组
  • concurrency::array_view 或对 concurrency::array 的引用
  • 仅包含 C++ AMP 兼容类型的结构

这意味着某些数据类型是被禁止的:

  • bool(可用于 lambda 中的局部变量)
  • 字符
  • 短的
  • 长长的
  • 以上的未签名版本

引用和指针(指向兼容类型)可以在本地使用,但不能被 lambda 捕获。不允许使用函数指针、指针到指针等;既不是静态变量也不是全局变量。如果您希望使用它们的实例,类必须满足更多规则。它们必须没有虚函数或虚继承。允许使用构造函数、析构函数和其他非虚拟函数。成员变量必须都是兼容的类型,当然可以包括其他类的实例,只要这些类符合相同的规则。

...来自C++ AMP 书,第 3 章。

因此,尽管您可以这样做,但出于性能原因,它可能不是最佳解决方案。CPU 和 GPU 缓存有些不同。这使得结构数组成为 CPU 实现的更好选择,而如果使用数组结构,GPU 通常性能更好。

当一个warp 中的所有线程都访问连续的内存并对该数据执行相同的操作时,GPU 硬件旨在提供最佳性能。因此,GPU 内存被设计为在以这种方式访问​​时效率最高也就不足为奇了。事实上,warp 中不同线程对同一传输线的加载和存储操作被合并为一个事务。传输线的大小取决于硬件,但一般来说,如果您专注于使内存访问尽可能连续,则您的代码不必考虑这一点。

...频道。7.

如果您查看我的n-body 示例的 CPU 和 GPU 实现,您将看到 CPU 和 GPU 两种方法的实现。

以上并不意味着当您将实现移至 C++ AMP 时您的算法不会运行得更快。这只是意味着您可能会在桌面上留下一些额外的性能。我建议尽可能做最简单的移植,然后考虑是否要投入更多时间优化代码,可能重写它以更好地利用 GPU 的架构。

于 2013-11-05T19:26:57.920 回答