Я пытаюсь распараллелить несколько функций с помощью директив OpenMP, но «с этим есть некоторые проблемы.
Идея состоит в том, чтобы создать параллельную область только один раз и вызывать функции после нее. Только один поток вызывает функцию (#pragma omp single), и после нее внутри функции начинают работать потоки умножения (#pragma omp for). Я переписал код, но он не работает вообще. Я был бы рад, если у вас есть идеи, как решить проблему.
int main()
{
size_t rows = 3, cols = 3;
std::vector<std::vector<double>> A, B, C, TrA;
fillMatrix(A, rows, cols, 1.0);
fillMatrix(B, rows, cols, 2.0);
#pragma omp parallel num_threads(2)
{
#pragma omp single
{
multiplyMatrix(A, B, C);
}
}
showMatrix(A);
showMatrix(B);
showMatrix(C);
return 0;
}
void multiplyMatrix(
const std::vector<std::vector<double>> &A,
const std::vector<std::vector<double>> &B,
std::vector<std::vector<double>> &C) {
C.assign(A.size(), std::vector<double>(B[0].size()));
#pragma omp for schedule(static)
for (size_t i = 0; i < A.size(); ++i) {
for (size_t j = 0; j < B[0].size(); ++j) {
for (size_t k = 0; k < B.size(); ++k) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
}