我有一个c应用程序处理用于Radix4计算的浮动表。现在我想将它分成两个线程,以便在多核系统上运行它,首先,这是函数结构:
void radix4(float* x, float* y, N)
{
for (l = 1; l <= PMAX; l++)
{
n = pow_4[l];//LUT for power of 4
for (c =0; c < n; c=c+4)
{
//Loading some parameters from a look-up table
n2 =LUT_n2[l][c];
N2 =LUT_n2[l][c+1];
N2_2=LUT_n2[l][c+2];
N2_3=LUT_n2[l][c+3];
factor = TWIDDLE_LIMIT/(range*4);
while ((k < range) && ( range > 7))
{//loading data from input tables
//Computing butterflies
//Loading twiddles
//Computing final values
//Store result in the same table
}
while ((k<range) && (range<=7))
{
//loading data from input tables
//Computing butterflies
//Loading twiddles
//Computing final values
//Store result in the same table
}
}
}
}
while循环展开。 现在我想要了解的是我怎么知道哪些部分可以分成线程并且可以提供一些关于如何做的提示,因为我正在阅读很多让我有点困惑的东西。
答案 0 :(得分:1)
您似乎正在尝试优化FFT例程。您可能希望查看线程池,因为您将在应用程序的生命周期内计算多个FFT。查看FFTW的网站,了解其API的结构。
对于你的问题的答案,你可以&#34;分裂&#34;将您的问题转移到N
个帖子中(让我们选择N = 2
)。那么你需要做的是基本上解交织(即使在数组的上半部分,也在N = 2
的底部奇数)。并运行另一个例程来计算这些数组子集的FFT(N
)。然后,您可以使用identity / symmetry属性将数组放回,并再次交错数组。
希望这有帮助。
答案 1 :(得分:0)
我认为你可以创建两个完成工作的功能。我假设k和范围的值已经在程序中定义。 使用boost / threads。
约翰
#include <boost/thread.hpp>
void task1()
{
while ((k < range) && ( range > 7))
{
//loading data from input tables
//Computing butterflies
//Loading twiddles
//Computing final values
//Store result in the same table
}
}
void task2()
{
while ((k<range) && (range<=7))
{
//loading data from input tables
//Computing butterflies
//Loading twiddles
//Computing final values
//Store result in the same table
}
}
void radix4(float* x, float* y, N)
{
for (l = 1; l <= PMAX; l++)
{
n = pow_4[l];//LUT for power of 4
for (c =0; c < n; c=c+4)
{
//Loading some parameters from a look-up table
n2 =LUT_n2[l][c];
N2 =LUT_n2[l][c+1];
N2_2=LUT_n2[l][c+2];
N2_3=LUT_n2[l][c+3];
factor = TWIDDLE_LIMIT/(range*4);
thread thread_1 = thread(task1);
thread thread_2 = thread(task2);
// join
thread_2.join();
thread_1.join();
}
}