Я пытаюсь закодировать многокодовую цепочку Маркова в 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 Гц не должно быть слишком большим.
Как вы синхронизируете свой общий экземпляр densityStack?
Исходя из этой ограниченной информации, я предполагаю, что процессоры заблокированы, ожидая записи данных каждый раз, когда у них есть крошечный кусок данных. Если это проблема, простой способ повысить производительность — уменьшить количество операций записи. Сохраняйте буфер данных для каждого процессора и реже записывайте его в плотность.