【问题标题】:GPU Programming StrategyGPU 编程策略
【发布时间】:2017-12-22 06:47:28
【问题描述】:

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

【问题讨论】:

  • 写代码,然后测量。

标签: c++ cuda gpu


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢您的回答。我将只分配一次数组。
【解决方案2】:

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

  • 很难调整大小,所以如果您打算调整单个图层的大小。去一个大街区。
  • 正如 Daniel 所说,可能很难找到一个连续的内存块(请记住,有些东西可能感觉很大。但不是从技术/硬件的角度来看。

分离数组或容器的缺点。

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

总的来说,我会赞成分手。

【讨论】:

  • 非常感谢您的有用回复:)。
猜你喜欢
  • 2011-09-26
  • 2012-09-13
  • 1970-01-01
  • 2022-06-28
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
相关资源
最近更新 更多