【发布时间】:2015-09-04 10:09:17
【问题描述】:
我正在使用 openMP 在 C++ 中运行一个非常简单的例程并测量经过的时间......代码在读取时进行,
#include <iostream>
#include <math.h>
#include "timer.h"
#include <omp.h>
int main ()
{
double start,finish;
int i;
int n=8000;
double a[n];
double b[n];
double c[n];
GET_TIME(start);
#pragma omp parallel private(i,a) shared(b,c,n)
{
#pragma omp for
for (i=0; i<n-1; i++)
b[i] += (a[i] + a[i+1])/2;
#pragma omp for
for (i=0; i<n-1; i++)
c[i] += (a[i] + a[i+1])/2;
}
GET_TIME(finish);
std::cout<< "Elapsed time is" <<(finish-start)<<"seconds";
return 0;
}
我正在使用以下 bash 脚本编译代码(注意线程是在环境变量 OMP_NUM_THREADS=$n 中定义的):
#!/bin/bash
clear
g++ -O3 -o test test.cpp -fopenmp
for n in $(seq 1 8); do
export OMP_NUM_THREADS=$n
./test
echo threads=$n
done
因此,随着线程数量的增加,性能下降的总体趋势如下:(当然数量可以改变)......
Elapsed time is0.000161886secondsthreads=1
Elapsed time is0.00019002secondsthreads=2
Elapsed time is0.00226498secondsthreads=3
Elapsed time is0.000210047secondsthreads=4
Elapsed time is0.000212908secondsthreads=5
Elapsed time is0.00920105secondsthreads=6
Elapsed time is0.00937104secondsthreads=7
Elapsed time is0.000834942secondsthreads=8
对提高性能(而不是降低性能)有何建议? 非常感谢!
【问题讨论】:
-
如果我正确阅读了您的数字,当从 7 个线程变为 8 个线程时,执行速度会提高 10 倍以上——性能显着提高。我建议您使用更大更长的循环重新计时,并在尝试得出任何结论之前平均运行 3 到 5 次。
-
谢谢马克。。也许我最常得到的是: 8.39233e-05secondsthreads=1 已用时间 is0.000119925secondsthreads=2 已用时间 is0.000138044secondsthreads=3 已用时间 is0.000138044secondsthreads=4 已用时间is0.000123978secondsthreads=5 已用时间 is0.000133991secondsthreads=6 已用时间 is0.00356102secondsthreads=7 已用时间 is0.00615597secondsthreads=8....当我增加线程时总是变得更糟...我知道 Loop 不够大,但是有没有办法用 SIMD f.e. 等其他技术来改进它?谢谢!。