Функции, работающие по столбцам на 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" может быть правильной отправной точкой.