Задать вопрос
@Robotex

Как реализовать поэлементное перемножение массивов средствами OpenMP, CUDA и GLSL?

Вот уже несколько дней бьюсь над решением этой проблемы, но мои решения получаются медленнее чем последовательное однопоточное решение:

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 медленнее на чуть-чуть :) ). Как же это сделать правиль?
  • Вопрос задан
  • 5363 просмотра
Подписаться 2 Оценить Комментировать
Ответ пользователя svetlov К ответам на вопрос (8)
svetlov
@svetlov
Кажется, во втором варианте второй цикл не параллелится. Замените input[j] на локальную переменную, чтобы она в регистр упала. Еще может потребоваться промежуточный массив для складывания этих input[j] — чтобы потом одним махом переключить на него после выхода за цикл.
Ответ написан
Комментировать