我正在使用OpenMP运行一些并行工作,但发现加速不能很好地扩展。然后我发现随着线程数量的增加,执行相同工作量的时间也会增加。这是一个例子:
void fillingVec(vector<int>& vec) {
for (int i = 0; i < 1000000; ++i)
vec.push_back(i);
}
int main() {
const int num_thread = omp_get_max_threads();
vector<int> vec;
double start;
#pragma omp parallel \
private(vec)
{
int id = omp_get_thread_num();
start = omp_get_wtime();
fillingVec(vec);
}
double end = omp_get_wtime();
printf("Elasped time = %f sec\n", end - start);
return 0;
}
由于我为每个线程运行相同的工作,我希望不同的线程数的运行时间相似。但是,当我测试程序时,运行时间似乎随着线程数量的增加而线性增加。结果如下:
# time
1 0.004387
4 0.009015
16 0.034197
32 0.230581
有人可以解释为什么会这样吗?这仅仅是由于OpenMP的开销吗?
答案 0 :(得分:1)
最有可能的是,时间增加是由于内存分配开销造成的。在填充数据之前,请尝试为向量保留空间(使用vec.reserve(1000000);
)。
此外,您测量时间的方式很奇怪并且存在数据争用,因为并行区域中的每个线程都会写入共享的start
变量。