Вот уже несколько дней бьюсь над решением этой проблемы, но мои решения получаются медленнее чем последовательное однопоточное решение:
for(int i=0;i<LAYERS;i++)
{
for(int j=0;j<INPUTS*NEURONS;j++)
{
temp[j] = inputs[j%INPUTS] * weights[i][j];
}
for(int j=0;j<NEURONS;j++)
{
inputs[j] = 0;
for(int l=0;l<INPUTS;l++)
{
inputs[j] += temp[j*INPUTS + l];
}
inputs[j] = sigmoid(inputs[j]);
}
}
Т.е. если вкратце, то имеем массив в N элементов, массив в N*M, и массив (или матрица, здесь weight) в N*M*K элементов.
Поэлементно перемножаем первый массив на группу из K элементов третьего (когда в первом кончаются элементы, переходим на первый и вновь идем по его элементам) и результат во второй. Далее суммируем во втором массиве группы по M элементов и пишем суммы в первый массив (предварительно применив некоторую функцию, но не суть важно). Далее повторяем все с новой группой элементов третьего массива.
Так вот, как я уже сказал, мои решения намного медленнее, чем приведенный выше код (openMP медленнее на чуть-чуть :) ). Как же это сделать правиль?