我开始学习 OpenMP,用于并行计算,并测试以下代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int i,j,k,a = -59, b = 19,N,R;
struct timeval T1, T2;
long delta_ms;
N = atoi(argv[1]);
float m1[N][N], m2[N][N], m3[N][N];
gettimeofday(&T1, NULL);
#pragma omp parallel for default(none) private(R,i,j,k) shared(N,b,a,m1, m2, m3)
for (R=0; R<100; R++)
{
srand(R);
#pragma omp parallel for default(none) private(i,j) shared(N,b,a,m1)
for (i = 0; i < N; i++){
for (j = 0; j < N; j++){
m1[i][j] = (float) rand() / RAND_MAX * (b - a + 1) + a;
}
}
#pragma omp parallel for default(none) private(i,j) shared(N,m1,m2)
for (i = 0; i < N; i++){
for (j = 0; j < N; j++){
m2[i][j] = m1[i][j] * 5;
}
}
#pragma omp parallel for default(none) private(i,j,k) shared(N,m1,m2,m3)
for(i = 0; i < N; i++){
for(j = 0; j < N; j++){
m3[i][j] = 0;
for(k = 0; k < N; k++){
m3[i][j] = m3[i][j] + (m1[i][k] * m2[k][j]);
}
}
}
}
gettimeofday(&T2, NULL);
delta_ms = 1000*(T2.tv_sec - T1.tv_sec) + (T2.tv_usec - T1.tv_usec)/1000;
printf("\nN=%d. Milliseconds passed: %ld\n", N, delta_ms);
return 0;
}
我的电脑的特点:
我使用虚拟机(Virtual Box)。我安装的是Ubuntu 14.04。我的虚拟机使用 3 个 CPU 和 1 Gb RAM。我使用 gcc 编译器,版本 4.8
现在我对以下情况产生了很大的兴趣:
- 我编译代码时没有
-fopenmp
key :gcc -o code1 code1.c
.
当我运行代码1时,我看到:
N=300. Milliseconds passed: 13706
- 我使用 key
-fopenmp
编译我的代码:gcc -o code1 code1.c -fopenmp
.
当我运行代码1时,我看到:
N=300. Milliseconds passed: 4898
- 我使用 key
-fopenmp
编译我的代码我只使用一个#pragma omp for
:
#pragma omp parallel for default(none) private(R,i,j,k) shared(N,b,a,m1, m2, m3)
for (R=0; R<100; R++)
{...}
当我运行代码1时,我看到:
N=300. Milliseconds passed: 4919
第 2 步和第 3 步的结果相等。
有人可以向我解释一下为什么会发生这种情况吗?
我阅读了 OpenMP 的文档,但没有找到答案。
最佳答案
检查OMP_NUM_THREADS环境变量。我在使用 VirtualBox 时遇到过这个问题,问题是这个变量被设置为 1。 它应该等于 CPU 核心的数量(如果使用超线程,则为 x2)。
关于c - pragma omp for 没有性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28871843/