执行时间串行和并行 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();
我无法理解我的程序(串行和并行版本)的执行时间。
在这里你可以找到我所说的主要功能部分:
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();