我刚刚开始使用C ++学习OpenMP,并且使用了一个非常简单的程序来检查是否可以通过并行化程序来提高速度:
#include <iostream>
#include <ctime>
#include "omp.h"
int main() {
const uint N = 1000000000;
clock_t start_time = clock();
#pragma omp parallel for
for (uint i = 0; i < N; i++) {
int x = 1+1;
}
clock_t end_time = clock();
std::cout << "total_time: " << double(end_time - start_time) / CLOCKS_PER_SEC << " seconds." << std::endl;
}
程序在没有并行#pragma的情况下花费2.2秒,在并行#pragma 4个线程的情况下花费2.8秒。我在程序中犯了什么错误?我的编译器是clang ++ 6.0,计算机是具有2.6G i5 CPU和MacOS 10.13.6的Macbook Pro。
编辑:
我意识到我使用了错误的函数来测量执行时间。我应该使用库chrono库中的high_resolution_clock而不是库ctime中的clock()。在这种情况下,我得到1个线程80秒,2个线程47秒,3个线程35秒。因为程序令人尴尬地是并行的,所以提速是否应该比我在这里得到的好?
答案 0 :(得分:0)
与任何并行编程一样,创建新线程会产生启动成本。对于简单程序,创建和管理线程的开销通常足够大,以至于与在单个线程中运行该程序相比,它实际上会使目标程序变慢。
换句话说,您没有犯错-这是使用线程的固有部分。