Функции, работающие по столбцам на gpuArrays в matlab

У меня есть пользовательская функция, которая принимает на 2 матрицы (2 столбца) и работает на нем. Это довольно сложная функция, поскольку она включает в себя несколько умножений матриц, проходящих последовательно через один из векторов столбцов (в цикле for) и в зависимости от соответствующего значения из другого вектора столбца выбирают матрицу для умножения. Больше похоже на совокупный матричный продукт с элементами в столбце, но с условием значений в одном из столбцов.

например.,:

 col1 col2
 0   0.03
 0   0.04
 1   0.02
 0   0.1
 1   0.004

если значения равны 0, выбирается одна матрица для умножения или, если она равна 1, выбирается другая. Затем кумулятивное матричное произведение берется. то есть. Значения = Diag(Valuesmat); cumulMatProduct = ini;

  for ix = 1:length(col2)
      if col1(ix) == 0
          matrixToMultiply = matrix1;
      elsif col1(ix) == 1
          matrixToMultiply = matrix2;
      end

      anotherMatrixtoMultiply = diag( exp(Values).*col2(ix) );
      cumulMatProduct = matrixToMultiply*anotherMatrixtoMultiply*cumulMatProduct;

   end

  etc., 

В основном это то, что делает функция.

Теперь у меня есть большое количество таких данных столбцов, и поэтому я хотел бы знать, могу ли я использовать вычисления GPU с ним. (имея доступ к Matlab r2013A с помощью PCT и TESLA s2050)

Я хотел бы сделать что-то вроде:

    DataMatrix1 = [col1; col1; col1] ;
    DataMatrix2 = [col2; col2; col2];

    gpuDat1 = gpuArray(DataMatrix1);
    gpuDat2 = gpuArray(DataMatrix2);

    [resultVect] = myFuncCall(gpuDat1, gpuDat2, ValueMat,ini); 
     %(ValueMat & ini is not sliced & each processor will have its copy)

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

Я не думаю, что поэлементные операции, такие как arrayfun или bsxfun, могли бы помочь здесь. Буду очень признателен за предложения и помощь. Спасибо за ваше время.

1 ответ

Если бы у вас был multi GPU, вы могли бы использовать spmd или parfor.

Вам нужен низкоуровневый доступ к ресурсам вашего GPU, который вы можете иметь только с помощью файлов CUDA и Mex.

Книга " Ускорение MATLAB с использованием вычислений на GPU" может быть правильной отправной точкой.

Другие вопросы по тегам