-
Notifications
You must be signed in to change notification settings - Fork 13
Open
Description
我手写了一个计算1D卷积的程序,但是发现执行起来很慢。问题描述和示例代码如下:
#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
Labels
No labels