NCHW与NC4HW4数据排布在卷积优化上的优劣分析


数据布局对性能影响巨大。

先来看一看在 NCHW 的布局下,怎么利用 SIMD 加速 3x3 的 depth-wise 卷积。

首先,读取数据时,需要一次性读取四个 float 作为第一行的数据,后两行的读取也是相似的;此时,读取出的三行数据已经足够计算两列输出,即,可以复用部分数据;而后,为了提高数据复用,会再读取出第四行数据,一次计算两行两列,即,可以引入循环展开;然而,残留的 5~25 和 21~25 亮度眼边界无法利用 SIMD 计算,只能逐一循环读写完成计算;按照这样的方式,就可以相应完成后几个通道的计算。

但是, NCHW 布局下,无法充分利用 SIMD 进行加速,同时,实现优化分支越多,占用包大小也就越多。


再来看一看 NC/4HW4 布局下,利用 SIMD 加速的情况又是怎样的。

这里的 "C/4" 指的是按照 4 个通道对齐的方式重排数据。重排所有输入和权重数据后,每次 SIMD 读写都天然是 4 个通道的输入数据和 4 个通道的权重数据。这样,不论 kernel、stride、dilation 怎么变化,我们都可以简单地使用 for 循环和 SIMD 的一套通用优化完成卷积计算。既不会有边缘数据无法加速的问题,也不会对包大小造成影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C++读取数据并对数据进行NCHW维度转换的代码示例: ```c++ #include <fstream> #include <iostream> #include <vector> // 定义输入数据的维度 const int N = 1; // batch size const int C = 3; // channel const int H = 224; // height const int W = 224; // width int main() { // 读取数据 std::ifstream fin("input_data.txt"); // 初始化输入数据 std::vector<float> input_data(N * C * H * W); // 读取输入数据 for (int n = 0; n < N; ++n) { for (int c = 0; c < C; ++c) { for (int h = 0; h < H; ++h) { for (int w = 0; w < W; ++w) { fin >> input_data[n * C * H * W + c * H * W + h * W + w]; } } } } // 转换为NCHW格式 std::vector<float> output_data(N * C * H * W); for (int n = 0; n < N; ++n) { for (int c = 0; c < C; ++c) { for (int h = 0; h < H; ++h) { for (int w = 0; w < W; ++w) { output_data[n * C * H * W + c * H * W + h * W + w] = input_data[n * H * W * C + h * W * C + w * C + c]; } } } } // 输出转换后的数据 for (int n = 0; n < N; ++n) { for (int c = 0; c < C; ++c) { for (int h = 0; h < H; ++h) { for (int w = 0; w < W; ++w) { std::cout << output_data[n * C * H * W + c * H * W + h * W + w] << " "; } std::cout << std::endl; } std::cout << std::endl; } std::cout << std::endl; } return 0; } ``` 这个示例代码中,我们首先定义了输入数据的维度,然后使用`std::ifstream`类读取输入数据。接着,我们将输入数据转换为NCHW格式,存储在`output_data`变量中,并输出转换后的数据。在转换数据时,我们需要注意输入数据的排列方式,这里假设输入数据是按照NHWC格式排列的,因此在转换为NCHW格式时需要进行相应的计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值