gpt4 book ai didi

c - 我怎样才能加快这个循环(在 C 中)?

转载 作者:太空狗 更新时间:2023-10-29 16:44:30 25 4
gpt4 key购买 nike

我正在尝试在 C 中并行化一个卷积函数。这是对两个 64 位 float 数组进行卷积的原始函数:

void convolve(const Float64 *in1,
UInt32 in1Len,
const Float64 *in2,
UInt32 in2Len,
Float64 *results)
{
UInt32 i, j;

for (i = 0; i < in1Len; i++) {
for (j = 0; j < in2Len; j++) {
results[i+j] += in1[i] * in2[j];
}
}
}

为了允许并发(没有信号量),我创建了一个函数来计算 results 数组中特定位置的结果:

void convolveHelper(const Float64 *in1,
UInt32 in1Len,
const Float64 *in2,
UInt32 in2Len,
Float64 *result,
UInt32 outPosition)
{
UInt32 i, j;

for (i = 0; i < in1Len; i++) {
if (i > outPosition)
break;
j = outPosition - i;
if (j >= in2Len)
continue;
*result += in1[i] * in2[j];
}
}

问题是,使用 convolveHelper 会使代码速度降低大约 3.5 倍(在单线程上运行时)。

关于如何加速 convolveHelper,同时保持线程安全,有什么想法吗?

最佳答案

时域中的卷积变成傅里叶域中的乘法。我建议您获取一个快速 FFT 库(如 FFTW)并使用它。你将从 O(n^2) 到 O(n log n)。

算法优化几乎总是胜过微优化。

关于c - 我怎样才能加快这个循环(在 C 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2662389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com