我需要使用 OpenMP 在矩陣中找到最大值。這是我第一次使用 OpenMP,之前我使用 pthreads 完成了這項任務。我寫了這段代碼,但它不起作用:
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
void MatrixFIller(int nrows, int* m) {
for (int i = 0; i < nrows; i ) {
for (int j = 0; j < nrows; j ) {
*(m i * nrows j) = rand() % 200;
}
}
};
#define dimension 9
#define number_of_threads 4
int main() {
srand(time(NULL));
int matrix[dimension][dimension];
int local_max=-1;
int final_max=-1;
int j = 0;
MatrixFIller(dimension, &matrix[0][0]);
for (int i = 0; i < dimension; i ) {
for (int j = 0; j < dimension; j ) {
printf("%d\t", matrix[i][j]);
}
printf("\n");
}
omp_set_num_threads(number_of_threads);
#pragma omp parallel private(local_max)
{
#pragma omp for
for (j = 0; j < dimension * dimension; j ) {
if (*(matrix (int)((j) / dimension) * dimension (j - dimension * ((int)(j / dimension)))) > local_max) {
local_max = *(matrix (int)((j) / dimension) * dimension (j - dimension * ((int)((j) / dimension))));
}
}
#pragma omp critical
if (local_max > final_max) { final_max = local_max; };
};
printf("Max value of matrix with dimension %d is %d", dimension, final_max);
};
這個想法是,在每個執行緒的 pragma 中找到區域最大值,然后將其與 pragma critical 中的全域最大值進行比較。為什么它不正確?謝謝!
uj5u.com熱心網友回復:
當進入并行區域時,local_max被初始化:private子句創建每個執行緒本地的變數,僅此而已,它們沒有初始化為任何值。如果您希望它們local_max在進入并行區域之前使用 had 的內容進行初始化,則必須改用該firstprivate子句。
但是,實際上最好local_max在并行區域內宣告(和初始化)。
此外,您可以查看該reduction子句(帶有max選項),這將使代碼更加簡單:
#pragma omp parallel for reduction(max:final_max)
for (j = 0; j < dimension * dimension; j ) {
if (*(matrix (int)((j) / dimension) * dimension (j - dimension * ((int)(j / dimension)))) > final_max) {
final_max = *(matrix (int)((j) / dimension) * dimension (j - dimension * ((int)((j) / dimension))));
}
}
編輯
在 Laci 對算術不正確的評論之后:你所有的 indeces 計算看起來都是正確的,但不容易閱讀。由于您從一開始就有一個二維陣列,因此設定兩個回圈更簡單。并且可能使用該collapse子句告訴 OpenMP 將它們并行化(順便說一下,盡可能在for(): 中宣告回圈索引,這樣可以避免總是想知道哪些應該被宣告為私有):
#pragma omp parallel for reduction(max:final_max) collapse(2)
for (int i = 0; i < dimension; i ) {
for (int j = 0; j < dimension; j ) {
if (matrix[i][j] > final_max) {
final_max = matrix[i][j];
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/532227.html
標籤:C开放式
