[英]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 個線程,我都會獲得相同的執行時間。添加了計時圖片。
我必須證明時間減少了近 8 倍。 我正在使用 Intel C++ 編譯器並打開 openMP。 請指教。
首先,我認為,當您將矩陣 1 中的條目初始化為Matrix1[i][j] = i * j
時,您的程序中存在一個小錯誤。 i
和j
不會分別達到 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.