C ++有人可以帮助我优化此代码吗?

时间:2018-12-18 03:06:41

标签: c++ signal-processing

我正在尝试在较大的边界上执行圆形卷积,有人可以帮助我优化它以使其运行得更快吗?我正在尝试cconv发出大量样本的信号。下采样不是一种选择。

#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;
}

1 个答案:

答案 0 :(得分:1)

这取决于您需要提高性能的程度...

首先,我将使y的大小为2N,而第二部分是第一部分的副本,以便可以代替if语句if((m-n) < 0) u[m] += x[n]*y[m-n+N]; else u[m] += x[n]*y[m-n];来简单地编写u[m] += x[n]*y[m-n+N];。 / p>

然后,您可以尝试使其成为多线程,并寻求相关的教程。有很多。

考虑使用SIMD指令,尽管我认为当今编译器会在足够简单的情况下自动使用它们。

但是,最好的解决方案是找到FFT(快速傅立叶变换)的实现。然后,您可以用O(n log n)运算而不是O(n ^ 2)完成卷积。我只是在Google上搜索,发现有一个库可以做到这一点:

http://www.alglib.net/fasttransforms/convolution.php

编辑:如果您有matlab-他们已经使用FFT很久了。