在不同的线程号openMP上执行相同的程序

时间:2017-10-30 11:52:08

标签: c++ multithreading openmp

我有一个c ++程序,它可以乘以2个矩阵。我必须使用openMP。这就是我到目前为止所拥有的。 https://pastebin.com/wn0AXFBG

#include <stdlib.h>
#include <time.h>
#include <omp.h>
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    int n = 1;

    int Matrix1[1000][100];
    int Matrix2[100][2];
    int Matrix3[1000][2];
    int sum = 0;
    ofstream fr("rez.txt");

    double t1 = omp_get_wtime();

    omp_set_num_threads(n);
#pragma omp parallel for  collapse(2) num_threads(n)
    for ( int i = 0; i < 10; i++) {
        for ( int j = 0; j < 10; j++) {
            Matrix1[i][j] = i * j;
        }
    }


#pragma omp simd
    for (int i = 0; i < 100; i++) {
        for (int j = 0; j < 2; j++) {
            int t = rand() % 100;
            if (t < 50) Matrix2[i][j] = -1;
            if (t >= 50) Matrix2[i][j] = 1;
        }
    }

#pragma omp parallel for  collapse(3) num_threads(n)
    for (int ci = 0; ci < 1000; ci++) {
        for (int cj = 0; cj < 2; cj++) {
            for (int i = 0; i < 100; i++) {
                if(i==0) Matrix3[ci][cj] = 0;
                Matrix3[ci][cj] += Matrix1[ci][i] * Matrix2[i][cj];
            }
        }
    }

    double t2 = omp_get_wtime();

    double time = t2 - t1;

    fr << time;


    return 0;
}

问题是我得到相同的执行时间,无论是使用1个线程还是8.添加了时序图片。 1 thread 8 threads

我必须证明时间减少了近8倍。我正在使用打开openMP的英特尔C ++编译器。请指教。

1 个答案:

答案 0 :(得分:1)

首先,我认为,当您将矩阵1中的条目初始化为Matrix1[i][j] = i * j时,程序中存在一个小错误。 ij分别不会达到1000和100。

另外,我不确定您的计算机是否实际支持8个逻辑核心, 如果没有8个逻辑核心,那么您的计算机将创建8个线程,并且一个逻辑核心将上下文切换多个线程,从而将降低性能,从而实现高执行时间。因此,请确保可用的实际逻辑核心数量,并指定小于或等于num_threads()的核心数量

现在提出问题,collapse子句将所有循环融合为一,并尝试在p处理器之间动态调度融合循环。我不确定它如何处理竞争条件处理,但是如果你尝试并行化最内层循环而不融合所有3个循环,那么就存在竞争条件,因为每个线程将尝试同时更新Matrix3[ci][cj]和某种同步机制可能是原子或减少条款,以确保正确性。

我很确定您可以在没有任何竞争条件的情况下并行化外部循环,并且在您使用的处理器数量附近获得加速(同样,只要处理器数量小于或等于逻辑数量)核心)我建议你改变你的代码段如下。

// You can also use this function to set number of threads:
// omp_set_num_threads(n);
#pragma omp parallel for num_threads(n)
    for (int ci = 0; ci < 1000; ci++) {
        for (int cj = 0; cj < 2; cj++) {
            for (int i = 0; i < 100; i++) {
                if(i==0) Matrix3[ci][cj] = 0;
                Matrix3[ci][cj] += Matrix1[ci][i] * Matrix2[i][cj];
            }
        }
    }