Задать вопрос
@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 Оценить Комментировать
Ответ пользователя Robotex К ответам на вопрос (8)
@Robotex Автор вопроса
CUDA: pastebin.com/TkrhuEWA
Что-то не так. Если L равно 1, то считает верно, если 2 и выше, то какие-то запредельные числа выходят.


for(int j=0;j<L;j++)
        {
          mulKernel<<<blocksMul, threadsMul>>>(devTemp, devInputs, devWeights, j*N*I, I);
          
          sumKernel<<<blocksSum, threadsSum>>>(devInputs, devTemp, N);
        }
Ответ написан
Комментировать