我有一个 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 循环展开。 现在我想了解的是,我如何知道哪些部分可以拆分为线程,并且可以就如何进行拆分给出一些提示,因为我正在阅读很多让我有点困惑的东西。
最佳答案
看起来您正在尝试优化 FFT 例程。您可能需要查看线程池,因为您将在应用程序的生命周期内计算多个 FFT。看看FFTW的网站并查看其 API 的结构。
对于问题的答案,您可以将问题“拆分”为 N
个线程(让我们选择 N = 2
)。然后你需要做的基本上是去交错(即使在数组的上半部分,对于 N = 2
,在底部也是奇数)。并运行另一个例程来为这些数组的子集(其中的 N
)计算 FFT。然后,您可以使用身份/对称属性将数组放回原位并再次交错数组。
希望这对您有所帮助。
关于c - 将 c 函数拆分为线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39121715/