我在理解程序的执行时间(串行和并行版本)时遇到问题。
在这里你可以找到我正在谈论的主要功能部分:
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
答案 0 :(得分:0)
stopwatch::elapsed
似乎未初始化。我不确定它是怎么回事,因为它必须属于类型。
在stopwatch
构造函数中初始化它:
stopwatch() {
running = false;
elapsed = clock::duration();
}
或在开始之前致电reset
:
stopwatch temp2;
temp2.reset();
temp2.start();