【发布时间】:2011-02-09 09:09:52
【问题描述】:
我正在尝试在 C 中并行化一个卷积函数。这是对两个 64 位浮点数数组进行卷积的原始函数:
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 的任何想法?
【问题讨论】:
-
当然
convolveHelper比较慢。你有一定数量的乘法和加法要做,还有一定数量的数组索引要计算。您添加的所有其他内容都会使其花费更长的时间,例如第一个if、j =和第二个if,更不用说函数进入/退出了。 -
迈克,我的问题不是“为什么这个实现慢?”;很明显,
convolveHelper在单个线程上应该更慢。我重写函数的全部目的是让它并行运行,也许使用 CUDA。我在问convolveHelper是否可以在保持线程安全的同时更有效地编写。
标签: c optimization concurrency loops performance