执行时间串行和并行 openmp 程序 mac os

execution time serial and parallel openmp program mac os

我无法理解我的程序(串行和并行版本)的执行时间。

在这里你可以找到我所说的主要功能部分:

stopwatch temp2;
temp2.start();
#pragma omp parallel
{

    #pragma omp for
    for (int i=0; i<100; i++){
        int a=itemVectorTraining->at(mapScaledItem->at(5755)).timesIWatchedAfterC(itemVectorTraining->at(mapScaledItem->at(236611)), deviceVectorTraining, 180);
    }
}
temp2.stop();

cout<<"Parallel: "<<temp2.elapsed_ms()<<endl;

stopwatch temp1;
temp1.start();

for (int i=0; i<100; i++){
    int a=itemVectorTraining->at(mapScaledItem->at(5755)).timesIWatchedAfterC(itemVectorTraining->at(mapScaledItem->at(236611)), deviceVectorTraining, 180);
}

temp1.stop();

cout<<"Serial: "<<temp1.elapsed_ms()<<endl;

其中 "stopwatch" 是一个定义明确的对象(我希望如此,因为我的教授创建了它 :) )以便以毫秒为单位进行更正的时间测量。

问题是当我用这个命令行执行 main 时:

g++-4.9 -std=c++11 -o test -Iinclude main.cpp

我得到这个输出

Parallel: 140821125 
Serial: 89847

同时添加“-fopenmp”,即使用此命令行:

g++-4.9 -fopenmp -std=c++11 -o testVale main.cpp

我得到:

Parallel: 39413
Serial: 2089786185294

而且没有任何意义!此外,虽然程序 return 在第一种情况下为 Parallel 和在第二种情况下为 Serial 设置了如此大的值,但实际上 运行 代码并不需要这么长时间。

我正在从 MAC OS X 的终端编译,通常我应该得到类似的东西:

Parallel:38548 
Serial 68007

有没有人知道程序的编译过程是怎么回事?

非常感谢!

秒表代码:

    #ifndef CGLIFE_STOPWATCH_HPP
#define CGLIFE_STOPWATCH_HPP

#include <chrono>

class stopwatch {
private:
    typedef std::chrono::high_resolution_clock clock;
    bool running;
    clock::time_point start_time;
    clock::duration elapsed;
public:
    stopwatch() {
        running = false;
    }
    // Starts the stopwatch.
    void start() {
        if (!running) {
            running = true;
            start_time = clock::now();
        }
    }
    // Stops the stopwatch.
    void  stop() {
        if (running) {
            running = false;
            elapsed += clock::now() - start_time;
        }
    }
    // Resets the elapsed time to 0.
    void reset() {
        elapsed = clock::duration();
    }
    // Returns the total elapsed time in milliseconds.
    // If the stopwatch is running, the elapsed time
    // includes the time elapsed in the current interval.
    long long elapsed_ms() const {
        clock::duration total;
        if (!running) {
            total = elapsed;
        } else {
            total = elapsed + (clock::now() - start_time);
        }
        return std::chrono::duration_cast<std::chrono::milliseconds>(total).count();
    }
};

#endif

stopwatch::elapsed 似乎未初始化。我不确定它是怎么回事,因为它必须是 class 类型。 在 stopwatch 构造函数中初始化它:

stopwatch() {
    running = false;
    elapsed = clock::duration();
}

或总是在开始前调用 reset

stopwatch temp2;
temp2.reset();
temp2.start();