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

时间:2015-02-18 10:07:07

标签: c++ macos performance parallel-processing

我在理解程序的执行时间(串行和并行版本)时遇到问题。

在这里你可以找到我正在谈论的主要功能部分:

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;

其中“秒表”是一个定义良好的对象(我希望如此,因为我的教授创建了它:))以便以毫秒为单位更正时间。

问题在于,当我使用此命令行执行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

它没有任何意义!此外,虽然程序在第一种情况下为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

1 个答案:

答案 0 :(得分:0)

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

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

或在开始之前致电reset

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