如何更快地计算数学运算?

时间:2015-08-01 18:52:57

标签: c++ multithreading

我有以下C ++代码,

和complexCorrelationLoop如下:

void complexMath::complexCorrelationLoop(fftw_complex *in_1, fftw_complex *in_2, fftw_complex *out, int N, int k1, int k2) {
for(int k=k1; k<k2; k++) {
    complexMath::complexCorrelation(in_1, in_2, out, N, k);
}

}

with complexCorrelation:

void complexMath::complexCorrelation(fftw_complex *in_1, fftw_complex *in_2, fftw_complex *out, int N, int k) {
fftw_complex *inConj = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*N);
fftw_complex *mulOut = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*N);
for(int m=0; m<N; m++){
    complexMath::complexConjugate(in_1, inConj, m);
    complexMath::complexScalarMultiplication(inConj, in_2, mulOut, m, m+k, m);
    out[k][0] += mulOut[m][0];
    out[k][1] += mulOut[m][1];
}
fftw_free(inConj); fftw_free(mulOut);

}

complexConjugate和complexScalarMultiplication正是它们的名称。现在,我在main()中有以下代码:

  boost::thread thread1(boost::bind(&complexMath::complexCorrelationLoop, &cM, in_1, in_1, out_1, nfft, 0, 101));
  boost::thread thread2(boost::bind(&complexMath::complexCorrelationLoop, &cM, in_1, in_1, out_1, nfft, 101, 201));

cM.complexCorrelationLoop(in_1, in_1, out_2, nfft, 0, 200);

我想要做的是使complexCorrelationLoop并行,以便它运行得更快。因为我需要它来使计算真的很快,在我的例子中这里是1.000.000,所以循环实际上是一种巨大的,200 * 1.000.000等。但是200循环的单循环比运行快4倍2个单独的线程,每个线程包含100个循环。这可能是因为创建和加入线程实际上是昂贵的。

所以我想做的是以某种方式,让这个过程更快。除了线程之外我没有任何其他想法,而且在我的情况下它显然不起作用。我已经阅读了有关线程池的内容,但我不确定如何将其实现到我的案例中。有没有人有任何建议或者某些链接可供我进一步阅读?

提前致谢。

0 个答案:

没有答案