параллельная обработка — стек C ++ эффективен для многоядерных приложений

Я пытаюсь закодировать многокодовую цепочку Маркова в C ++, и хотя я пытаюсь использовать преимущества многих процессоров (до 24) для запуска разных цепочек в каждой, у меня есть проблема в выборе правильного контейнера для сбора результата численные оценки на каждом процессоре. То, что я пытаюсь измерить, — это в основном среднее значение массива логических переменных. Я попытался кодировать оболочку вокруг объекта `std :: vector«, который выглядит так:

struct densityStack {
vector<int> density; //will store the sum of boolean varaibles
int card; //will store the amount of elements we summed over for normalizing at the end

densityStack(int size){ //constructor taking as only parameter the size of the array, usually size = 30
density = vector<int> (size, 0);
card = 0;
}

void push_back(vector<int> & toBeAdded){ //method summing a new array (of measurements) to our stack
for(auto valStack = density.begin(), newVal = toBeAdded.begin(); valStack != density.end(); ++valStack, ++ newVal)
*valStack += *newVal;
card++;
}

void savef(const char * fname){ //method outputting into a file
ofstream out(fname);
out.precision(10);
out << card << "\n"; //saving the cardinal in first line
for(auto val = density.begin(); val != density.end(); ++val)
out << << (double) *val/card << "\n";
out.close();
}
};

Затем в моем коде я использую один densityStack объект и каждый раз, когда ядро ​​процессора имеет данные (может быть 100 раз в секунду), он будет вызывать push_back отправить данные обратно densityStack,

Моя проблема в том, что это, кажется, медленнее, чем при первом необработанном подходе, когда каждое ядро ​​сохраняло каждый массив измерений в файле, а затем я использовал некоторый скрипт Python для усреднения и очистки (я был недоволен этим, потому что хранили слишком много информации и слишком много бесполезной нагрузки на жесткие диски).

Вы видите, где я могу потерять много производительности? Я имею в виду, есть ли источник очевидных накладных расходов? Потому что для меня копирование вектора назад даже на частотах 1000 Гц не должно быть слишком большим.

0

Решение

Как вы синхронизируете свой общий экземпляр densityStack?

Исходя из этой ограниченной информации, я предполагаю, что процессоры заблокированы, ожидая записи данных каждый раз, когда у них есть крошечный кусок данных. Если это проблема, простой способ повысить производительность — уменьшить количество операций записи. Сохраняйте буфер данных для каждого процессора и реже записывайте его в плотность.

2

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


По вопросам рекламы [email protected]