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

标签 c optimization concurrency loops performance

我正在尝试在 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/

相关文章:

无法在 gtk2 的销毁信号中传递数据

c - 错误: expected expression before ‘{’ token while assigning a character array

sorting - 如何执行排序+索引同时删除重复项?

javascript - Angular 1 : Above the Fold rendering

c++ - 我该怎么做——像一个人一样快速地修改 2 的幂++ 2 的幂?

scala - 处理应用程序级并发 - 我有什么选择?

c++ - ESENT 二级索引已损坏,必须对数据库进行碎片整理

c - 从 C 文件中读取 unicode 字符

python - 对文件使用 asyncio 真的是个好主意吗

java - 构造函数内的同步部分和同步构造函数的差异