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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions