OpenMP运行时

时间:2014-12-12 17:27:31

标签: 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();
    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的开销吗?

1 个答案:

答案 0 :(得分:1)

最有可能的是,时间增加是由于内存分配开销造成的。在填充数据之前,请尝试为向量保留空间(使用vec.reserve(1000000);)。

此外,您测量时间的方式很奇怪并且存在数据争用,因为并行区域中的每个线程都会写入共享的start变量。

相关问题