Базовая параллельная программа OpenMP не масштабируется, как ожидалось

#include <iostream>
#include <vector>
#include <stdexcept>
#include <sstream>
#include <omp.h>

std::vector<int> col_sums(const std::vector<std::vector<short>>& data) {
unsigned int height = data.size(), width = data[0].size();
std::vector<int> totalSums(width, 0), threadSums(width, 0);

#pragma omp parallel firstprivate(threadSums)
{
#pragma omp parallel for
for (unsigned int i = 0; i < height; i++) {
threadSums.data()[0:width] += data[i].data()[0:width];
}
#pragma omp critical
{
totalSums.data()[0:width] += threadSums.data()[0:width];
}
}
return totalSums;
}

int main(int argc, char** argv) {
if (argc < 3) {
std::cout << "Run program as \"executable <rows> <columns>\n";
} else {
std::stringstream args;
args << argv[1] << " " << argv[2];
int rows, columns;
args >> rows >> columns;
std::vector<std::vector<short>> data(rows, std::vector<short>(columns));
std::vector<int> columnSums = col_sums(data);
}
}
  • export OMP_NUM_THREADS=4
  • icpc -Ofast -fopenmp -g dummy.cpp -o dummy
  • /usr/bin/time -v ./dummy 115000 20000
  • CPU% = 225% (должно быть 380% +)

Я довольно опытен с OpenMP и CilkPlus, но барьер для масштабирования здесь ускользает от меня, и это довольно элементарная программа. Я знаю, что это должно быть что-то очевидное, но мне кажется, что я стерла все опасности данных и опасности контроля. Я полностью в тупике.

1

Решение

Задача ещё не решена.

Другие решения