c - pragma omp for 没有性能

标签 c gcc openmp

我开始学习 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

现在我对以下情况产生了很大的兴趣:

  1. 我编译代码时没有 -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/

    相关文章:

    visual-studio - Qt5、Visual Studio 2012 Express 和 OpenMp。如何?

    c - 这是 C 语言未定义的行为吗? clang 和 GCC 的不同结果

    C:字符串标识符的整数值之和

    python - 用于 Python 编译的动态库 - 无目录

    c++ - 为什么在这个解散的 std::string dtor 中有一个锁定的 xadd 指令?

    c++ - 使用 openmp 优化循环

    c - 我是否发现了 libxml2 错误(多线程解析中的内存泄漏)?

    c++ - 延迟输出 0

    c - 使用 C 中的宏初始化未知大小的二维数组

    c - 为什么 GCC 编译器允许我们声明零长度字符串(直接)和负长度字符串(间接)?