簡體   English   中英

不同線程數 openMP 上的相同程序執行時間

[英]Same program execution time on different thread numbers openMP

我有一個乘以 2 個矩陣的 C++ 程序。 我必須使用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 個線程8 線程

我必須證明時間減少了近 8 倍。 我正在使用 Intel C++ 編譯器並打開 openMP。 請指教。

首先,我認為,當您將矩陣 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];
            }
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM