다음은 행렬 n x n의 행렬식을 찾는 코드입니다.nx n 행렬의 행렬식을 계산하기위한 OpenMP를 추가하십시오. n x n
#include <iostream>
using namespace std;
int determinant(int *matrix[], int size);
void ijMinor(int *matrix[], int *minorMatrix[], int size, int row, int column);
int main()
{
int size;
cout << "What is the size of the matrix for which you want to find the determinant?:\t";
cin >> size;
int **matrix;
matrix = new int*[size];
for (int i = 0 ; i < size ; i++)
matrix[i] = new int[size];
cout << "\nEnter the values of the matrix seperated by spaces:\n\n";
for(int i = 0; i < size; i++)
for(int j = 0; j < size; j++)
cin >> matrix[i][j];
cout << "\nThe determinant of the matrix is:\t" << determinant(matrix, size) << endl;
return 0;
}
int determinant(int *matrix[], int size){
if(size==1)return matrix[0][0];
else{
int result=0, sign=-1;
for(int j = 0; j < size; j++){
int **minorMatrix;
minorMatrix = new int*[size-1];
for (int k = 0 ; k < size-1 ; k++)
minorMatrix[k] = new int[size-1];
ijMinor(matrix, minorMatrix, size, 0, j);
sign*=-1;
result+=sign*matrix[0][j]*determinant(minorMatrix, size-1);
for(int i = 0; i < size-1; i++){
delete minorMatrix[i];
}
}
return result;
}
}
void ijMinor(int *matrix[], int *minorMatrix[], int size, int row, int column){
for(int i = 0; i < size; i++){
for(int j = 0; j < size; j++){
if(i < row){
if(j < column)minorMatrix[i][j] = matrix[i][j];
else if(j == column)continue;
else minorMatrix[i][j-1] = matrix[i][j];
}
else if(i == row)continue;
else{
if(j < column)minorMatrix[i-1][j] = matrix[i][j];
else if(j == column)continue;
else minorMatrix[i-1][j-1] = matrix[i][j];
}
}
}
}
의 OpenMP 프라그 마를 추가 한 후, 나는 결정 기능을 변경 한 지금은 다음과 같습니다
int determinant(int *matrix[], int size){
if(size==1)return matrix[0][0];
else{
int result=0, sign=-1;
#pragma omp parallel for default(none) shared(size,matrix,sign) private(j,k) reduction(+ : result)
for(int j = 0; j < size; j++){
int **minorMatrix;
minorMatrix = new int*[size-1];
for (int k = 0 ; k < size-1 ; k++)
minorMatrix[k] = new int[size-1];
ijMinor(matrix, minorMatrix, size, 0, j);
sign*=-1;
result+=sign*matrix[0][j]*determinant(minorMatrix, size-1);
for(int i = 0; i < size-1; i++){
delete minorMatrix[i];
}
}
return result;
delete [] matrix;
}
}
내 문제는 결과가 다를 때마다 것입니다. 때로는 올바른 가치를 제공하지만 가장 자주 잘못된 것입니다. 나는 sign
변수 때문이라고 생각합니다. 당신이 볼 수 있듯이, 모든 반복에 내 루프 sign
다른이 있어야
하지만 난 OpenMP를 사용할 때, 뭔가 잘못이다 : 나는 다음 식입니다. 이 프로그램을 OpenMP와 함께 실행하려면 어떻게해야합니까?
마지막으로 두 번째 문제점은 OpenMP를 사용하더라도 OpenMP가없는 경우보다 프로그램이 더 빨리 실행되지 않는다는 것입니다. 또한 100,000 x 100,000 행렬을 만들려고했지만 프로그램에서 메모리 할당에 대한 오류를보고합니다. 매우 큰 행렬로이 프로그램을 실행하려면 어떻게해야합니까? 흐리 스토에서 언급 한 바와 같이
1), 당신의 스레드가 sign
변수에 대한 서로의 데이터에 참견하는 다음과 같이 내가보기로
* 매트릭스 100 000 x 100 000을 만들려고 시도하고 메모리를 할당하는 데 오류가 발생했습니다. * OpenMP없이 큰 매트릭스를 할당 할 수 있습니까? 그렇지 않다면, OpenMP가 어디에서 메모리를 얻을 것이라고 상상합니까? –
OpenMP가이 메모리를 확보하지 못한다는 것을 알고 있습니다. 나는 다른 해결책을 찾고있다. 이 주제에는 2 가지 문제점이 있습니다. 먼저 OpenMP를이 프로그램과 함께 사용하십시오. 둘째로이 큰 행렬을 계산하기 위해 할 수있는 일이 있습니다. 더 큰 매트릭스로 할 수있는 것이 없다면, 작은 매트릭스로 OpenMP를 점검 할 것입니다. – Jakub
'sign * = - 1; 대신'sign = (j % 2)? '를 사용해야합니까? -1 : 1; 또는 그런 종류의 것. 또한 'sign'은 'private'이어야합니다. 현재 버전에서는 서로 다른 스레드가 지속적으로 부호를 뒤집어 서로 간섭합니다. –