Skip to content

请教关于1D向量批量卷积如何加速的问题 #11

@YangZ2020

Description

@YangZ2020

我手写了一个计算1D卷积的程序,但是发现执行起来很慢。问题描述和示例代码如下:
WechatIMG367

#include <random>
// #include <utils/chronoMarco.h>
#include <vector>

int main() {

  std::random_device rd;
  std::mt19937 gen(rd());
  std::uniform_real_distribution<float> dis(1.0, 10.0);

  // 生成vec数据;
  size_t size1 = 10000;
  size_t size2 = 126;
  std::vector<float> vec(size1 * size2, 0);
  for (auto &x : vec) {
    x = dis(gen);
  }

  // 生成conv数据;
  size_t sizeb = 64;
  std::vector<float> b(sizeb);
  for (auto &x : b) {
    x = dis(gen);
  };

  // 临时向量,把vec中的每个向量存储到padZeroData中(前后各有一部分0);
  std::vector<float> padZeroData(size2 + sizeb);

  // 分配结果向量;
  std::vector<float> result(size1 * size2, 0);

  // TICK(conv); // 用于计时的Marco。
  // 开始计算。对于每个向量:
  for (int idx = 0; idx < size1; idx++) {

    // 将数据插入到padZeroData中;
    for (int idy = 0; idy < size2; idy++) {
      padZeroData[idy + sizeb / 2] = vec[idx * size2 + idy];
    }

    // padZeroData和b两个向量卷积,结果放入vec中;
    for (int idy = 0; idy < size2; idy++) {
      for (int idz = 0; idz < sizeb; idz++) {
        result[idx * size2 + idy] += padZeroData[idy + idz] * b[idz];
      }
    }
  }
  // TOCK(conv, end, ""); // 用于计时的Marco。
                       // 两段计时之间耗时约35ms。
}

谢谢小彭老师。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions