GPU编程策略

问题描述 投票:2回答:2

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

c++ cuda gpu
2个回答
1
投票

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

  • 更难调整大小,所以如果你打算调整单个图层的大小。去一个大块。
  • 正如丹尼尔所说,可能很难找到一块连续的记忆块(请记住,某些东西可能感觉很大。但不是从技术/硬件的角度来看。

Separate数组或容器的缺点。

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

总的来说,我赞成分裂。


2
投票

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

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

然而,这是非常具体的实现,如果您不知道自己在做什么,管理自己的内存/数组可能会使您的代码更慢,更不健壮。此外,如果您的NN很大,您可能无法找到足够大的连续内存块来容纳您的内存/阵列块。

© www.soinside.com 2019 - 2024. All rights reserved.