GPU编程攻略

GPU Programming Strategy

我正在尝试在 CUDA 中使用 c 编写一种神经网络。我有一个基本问题。对于编程,我可以使用大数组或不同的命名策略。例如对于权重,我可以将所有权重放在一个大数组中,或者对具有不同名称的不同层使用不同的数组,例如 weight1 用于第一层,weight2 用于第二层等等。第一个策略有点麻烦,而第二个策略对我来说更容易。但是,我想知道如果我使用不同的命名策略,它会使程序在 GPU 上变慢到 运行 吗?

只要所有的数组只分配一次并且不调整大小,性能上的差异应该可以忽略不计。

如果您经常重新分配内存并调整包含权重的数组的大小,那么在大数组中管理您自己的内存可能会带来性能优势。

然而,这是非常具体的实现,如果您不知道自己在做什么,管理您自己的 memory/arrays 可能会使您的代码变慢且不那么健壮。此外,如果您的 NN 很大,您可能很难找到足够大的连续内存块来容纳您的 memory/array 块。

这是我的 2 美分。 拥有 1 个非常大的数组的缺点:

  • 更难调整大小,因此如果您打算调整单个图层的大小。去大块。
  • 正如 Daniel 所说,可能很难找到连续的内存块(请记住,有些东西可能感觉很大。但从 techinal/hardware 的角度来看并非如此。

分离数组或容器的缺点。

  • 如果您的访问模式非常精细、不可预测。如果需要多个步骤来查找数组中的单个位置,访问时间可能会更慢。例如,如果你有一个指向指针列表的指针列表,指向一个指针列表。每次都必须走三步(稍微有点贵)。这可以通过适当的编码来避免。

总的来说我会赞成分手。