C++ OpenMP运行时间
我正在使用OpenMP运行一些并行工作,但发现加速比不能很好地扩展。然后我发现,随着线程数量的增加,完成相同工作量的时间也会增加。以下是一个例子:C++ OpenMP运行时间,c++,openmp,C++,Openmp,我正在使用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(
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;
}
有人能解释为什么会这样吗?这仅仅是由于OpenMP的开销吗?最有可能的是,时间增加是由于内存分配开销。在用数据填充向量之前,请尝试为向量保留空间(使用
vec.reserve(1000000);
)
此外,度量时间的方式很奇怪,并且存在数据竞争,因为并行区域中的每个线程都写入共享
start
变量 它是什么硬件(有多少核)?我建议简化benchamrk(只留下空循环)。同时也增加了一点运行时间。我试过你的例子(有点修改),它似乎有一些开销,但不确定它是否与硬件或软件相关。你也可以通过同时运行N个进程(相同的程序也可以,只需使用单线程运行N个进程)获得一些见解。谢谢你的回复。但即使我事先保留了向量,运行时间仍然是线性增长的。我也更改了其他说明,但问题仍然存在。
# time
1 0.004387
4 0.009015
16 0.034197
32 0.230581