Как вернуть разреженную матрицу из CUSP::csr_matrix в MEX в Matlab?
Я разрабатываю свой MEX-файл для разреженных матричных вычислений с помощью CUDA. Я использую библиотеку CUSP. Я не знаю, как вернуть cusp::csr_matrix обратно в Matlab. Например, у меня есть
cusp::csr_matrix<mwIndex,double,cusp::host_memory> At(m,n,N);
Итак, это матрица At в формате CSR, которую, скажем, я вычислил. Теперь я должен вернуть его Матлабу. Что-то вроде этого:
plhs[0] = At;
Но, конечно, это не работает, во-первых, потому что At на GPU. Я думаю, что я должен использовать At.values и методы для индексов. Но также, как назначить их хост-данным?
Кто-нибудь может подсказать, как все это сделать?:)
1 ответ
Matlab также хранит разреженные матрицы в формате CSR, так что это не сложно. Все, что вам нужно сделать, это выделить разреженную матрицу, используя mxArray *mxCreateSparse(mwSize m, mwSize n, mwSize nzmax, mxComplexity ComplexFlag);
а затем установить массивы pr, ir, jc (используя mxGetPr
, mxGetIr
, mxGetJc
). Pr соответствует массиву значений в cusp, ir - column_indices и jc - row_offsets. Если матрица находится в памяти устройства, скопируйте ее, используя cudaMemcpy
с cudaMemcpyDeviceToHost
, Вот несколько примеров использования разреженных матриц (это для Octave, но должно работать и для Matlab).