C++ 有人可以帮我优化这段代码吗?
C++ Can someone help me optimize this code?
我正在尝试在大边界上执行循环卷积,有人可以帮助我优化它以运行得更快吗?我正在尝试用大量样本发出信号。缩减采样不是一种选择。
#include <iostream>
#include <time.h> /* clock_t, clock, CLOCKS_PER_SEC */
#include <math.h> /* sqrt */
using namespace std;
void fillarray(double* x, int N)
{
for (int i = 0; i < N; i++)
x[i] = i + 1;
}
void circcon(double* x, double* y, double* u, int N)
{
for (int m = 0; m < N; ++m)
for (int n = 0; n < N; ++n) {
if ((m - n) < 0)
u[m] += x[n] * y[m - n + N];
else
u[m] += x[n] * y[m - n];
}
}
int main(void)
{
int N = 447650;
double* x = new double[N];
double* y = new double[N];
double* u = new double[N];
clock_t t;
t = clock();
fillarray(x, N);
fillarray(y, N);
for (int i = 0; i < N; i++)
u[i] = 0.0;
circcon(x, y, u, N);
t = clock() - t;
printf("It took me %d clicks (%f seconds).n", t, ((float)t) / CLOCKS_PER_SEC);
return 0;
}
这取决于您需要提高多少性能...
首先,我会y
大小2N
,第二部分是第一部分的副本,这样就可以简单地写u[m] += x[n]*y[m-n+N];
而不是 if 语句if((m-n) < 0) u[m] += x[n]*y[m-n+N]; else u[m] += x[n]*y[m-n];
。
然后,您可以尝试将其设置为多线程,并寻求有关教程。有很多。
考虑使用 SIMD 指令,尽管我相信现在编译器会在足够简单的情况下自动使用它们。
然而,最好的解决方案是找到FFT(快速傅里叶变换)的实现。然后,您可以在 O(n log n) 操作中完成卷积,而不是 O(n^2)。我刚刚用谷歌搜索并找到了一个可以做到这一点的库:
http://www.alglib.net/fasttransforms/convolution.php
编辑:如果你有 matlab - 他们已经有 FFT 多年了。
相关文章:
- 在java中解决这段代码时面临循环中的问题
- 修改 VS Code 中的默认C++代码段
- 我是如何在这段代码中出现分段错误的
- 我不明白这段代码是如何对这个pythonlist()进行排序的,也不明白如何用C++中的向量来重现它
- 为什么这段代码不起作用,我该如何解决?
- 为什么这段代码给我错误? 有没有自错?
- 有人可以解释一下这段代码如何能够反转字符串
- 如何从C++代码中检索 QML 的文本字段中的文本?
- 可能我知道为什么这段代码没有给出任何输出吗?
- 这段代码的最后一行在做什么?
- 我不知道为什么这段代码会让核心被转储?
- 我试图用这段代码找到二叉树的高度,但它一直返回 0,有人可以告诉我为什么吗?
- 有人可以向我解释一下这段代码的作用吗?
- 在这段 python 代码中,大于符号是什么意思
- 为什么在此代码代码段中将复制构造函数两次称为两次
- c_str() vs std::这段小代码的真正区别是什么?
- 理解这段示例C++代码(类定义)
- c中的fork()命令——这段简单代码的输出是什么
- 在Visual Studio中对齐代码/代码边距
- 一段 qcustomplot 代码不起作用(小示例代码)