小编zbh*_*047的帖子

迭代 const 容器时,编译器会展开“for”循环吗?

在 C++11 中,我们可以在迭代容器时使用更简单的“for”循环,如下所示:

for (auto i : {1, 2, 3, 4})
    ...;
Run Code Online (Sandbox Code Playgroud)

但是,我不知道此类代码的效率。具体来说:

  • {1, 2, 3, 4} 的类型是什么?它是原始数组,还是转换为其他容器,例如 std::vector?
  • 编译器会展开循环吗?

更新:假设我们使用-O2,并且循环中的代码只是几个操作。就我而言,我想枚举四个方向 UP DOWN LEFT RIGHT 并使用方向参数调用一个函数。我只关心程序是否可以具有最佳性能。

非常感谢!

c++ c++11

6
推荐指数
2
解决办法
178
查看次数

GroupNorm 比 Pytorch 中的 BatchNorm 慢得多,并且消耗更高的 GPU 内存

我在 pytorch 中使用 GroupNorm 而不是 BatchNorm 并保持所有其他(网络架构)不变。结果表明,在 Imagenet 数据集中,使用 resnet50 架构,GroupNorm 比 BatchNorm 慢 40%,并且比 BatchNorm 多消耗 33% 的 GPU 内存。我真的很困惑,因为 GroupNorm 不应该比 BatchNorm 需要更多的计算。详情如下。

有关 Group Normalization 的详细信息,可以参见这篇论文:https : //arxiv.org/pdf/1803.08494.pdf

对于 BatchNorm,GPU 内存为 7.51GB,一个 minibatch 耗时 12.8 秒;

对于 GroupNorm,一个 minibatch 消耗 17.9 秒,GPU 内存为 10.02GB。

我使用以下代码将所有 BatchNorm 层转换为 GroupNorm 层。

def convert_bn_model_to_gn(module, num_groups=16):
"""
Recursively traverse module and its children to replace all instances of
``torch.nn.modules.batchnorm._BatchNorm`` with :class:`torch.nn.GroupNorm`.
Args:
    module: your network module
    num_groups: num_groups of GN …
Run Code Online (Sandbox Code Playgroud)

pytorch

5
推荐指数
1
解决办法
934
查看次数

C++ 中一系列模板参数的显式模板实例化

创建库时,显式模板实例化非常有用。假设我有一个带有 int 参数的模板:

template <int i> struct S { ... };
Run Code Online (Sandbox Code Playgroud)

要执行显式模板实例化,语法类似于

template struct S<1>;
Run Code Online (Sandbox Code Playgroud)

但是,我只能以这种方式使用一行实例化一个实例。我想做的是以一种优雅的方式定义一系列模板。例如,考虑无法编译的错误代码:

#define MIN_I 1
#define MAX_I 16
for (int i = MIN_I; i <= MAX_I; i++) // i should be a constant
    template struct S<i>;
Run Code Online (Sandbox Code Playgroud)

这样,当MAX_I改变时,修改就非常简单了。我能实现这个目标吗?如果可能的话,有没有一种简单的方法可以做到这一点?谢谢你!

此外,这个问题可以推广到更一般的环境。例如,我可以采用 1,2,4,8,16,32,64,128,256 或一些预定义的序列。

我创建模板库的原因不好说。简而言之,我将创建一个在GPU上运行的CUDA库(由nvcc编译器编译),并由gcc编译的标准c++程序调用。

c++ templates

5
推荐指数
1
解决办法
1218
查看次数

L2 缓存的内存操作是否比 NVIDIA GPU 的全局内存快得多?

现代 GPU 架构同时具有 L1 缓存和 L2 缓存。众所周知,L1 缓存比全局内存快得多。然而,L2 缓存的速度在 CUDA 文档中不太清楚。我查阅了CUDA文档,但只能发现全局内存操作的延迟约为300-500个周期,而L1缓存操作只需要约30个周期。谁能给出二级缓存的速度吗?这些信息可能非常有用,因为如果 L2 缓存与全局内存相比不是很快,那么编程就不会专注于优化 L2 缓存的使用。如果不同架构的速度不同,我只想关注最新的架构,例如 NVIDIA Titan RTX 3090(计算能力 8.6)或 NVIDIA Telsa V100(计算能力 7.0)。

谢谢你!

cuda gpu nvidia

4
推荐指数
1
解决办法
2923
查看次数

标签 统计

c++ ×2

c++11 ×1

cuda ×1

gpu ×1

nvidia ×1

pytorch ×1

templates ×1