在 C++11 中,我们可以在迭代容器时使用更简单的“for”循环,如下所示:
for (auto i : {1, 2, 3, 4})
...;
Run Code Online (Sandbox Code Playgroud)
但是,我不知道此类代码的效率。具体来说:
更新:假设我们使用-O2,并且循环中的代码只是几个操作。就我而言,我想枚举四个方向 UP DOWN LEFT RIGHT 并使用方向参数调用一个函数。我只关心程序是否可以具有最佳性能。
非常感谢!
我在 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) 创建库时,显式模板实例化非常有用。假设我有一个带有 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++程序调用。
现代 GPU 架构同时具有 L1 缓存和 L2 缓存。众所周知,L1 缓存比全局内存快得多。然而,L2 缓存的速度在 CUDA 文档中不太清楚。我查阅了CUDA文档,但只能发现全局内存操作的延迟约为300-500个周期,而L1缓存操作只需要约30个周期。谁能给出二级缓存的速度吗?这些信息可能非常有用,因为如果 L2 缓存与全局内存相比不是很快,那么编程就不会专注于优化 L2 缓存的使用。如果不同架构的速度不同,我只想关注最新的架构,例如 NVIDIA Titan RTX 3090(计算能力 8.6)或 NVIDIA Telsa V100(计算能力 7.0)。
谢谢你!