openMP에 대해 조금 배우고 여기에 두 행렬을 곱하기 위해 사용하려고합니다.행렬 곱셈 (OpenMP) 최적화 - C
void matrix_multiply(matrix *A, matrix *B, matrix *C) {
#pragma omp parallel
{
#pragma omp for
for(int i = 0; i < A->dim.rows; i++) {
for(int j = 0; j < B->dim.cols; j++) {
C->data[i][j] = 0;
for (int k = 0; k < A->dim.cols; k++) {
C->data[i][j] += A->data[i][k] * B->data[k][j];
}
}
}
}
}
typedef struct shape {
int rows;
int cols;
} shape;
typedef struct matrix {
shape dim;
float** data;
} matrix;
아직 조금 새롭기 때문에 성능을 향상시키기 위해 간단한 변경 사항이 있습니까? 아니면 이미 완료 했습니까? 또한 감소를 사용하지 않음으로써 모든 데이터 경주에 참여하고 있습니까?
교육적 연습 (즉, OpenMP 사용 방법 학습) 인 경우에는 문제가되지 않습니다. 고성능 행렬 곱셈을 원하면 지금 중지하십시오. 대신에 더 많은 최적화 (예 : 캐시 차단)가있는 Intel MKL과 같은 라이브러리를 찾아보십시오. 사실, 순진한 병렬 처리의 성능을 MKL의 성능과 비교하는 것이 흥미로울 수 있습니다 ... –