Почему мой Eigen-код не масштабируется с большим количеством потоков - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть код Eigen / C ++, цель которого состоит в том, чтобы выполнить умножение основных разреженных и разреженных основных мажорных строк, оба из которых являются многопоточными в Eigen .

Тем не менее, я обнаружил, что масштабирование выполняется только в мажорной разреженной строке, но не в умножении на мажорной плотности. Почему это? Ниже приведен код и сроки.

/*timer function*/
double getHighResolutionTime(void) {
struct timeval tod;
gettimeofday(&tod, NULL);
double time_seconds = (double) tod.tv_sec + ((double) tod.tv_usec / 1000000.0);
return time_seconds;
}

...

//define Col Major Sparse
Map<SparseMatrix<double,ColMajor> > gcol (m, n, nz, jc_int, ir_int, pr);

//define the same matrix but Row Major
Map<SparseMatrix<double,RowMajor> > grow (m, n, nz, jc_int, ir_int, pr);

//define dense matrix
Map<MatrixXd> G (PR1, M, N );

//define result
Map<MatrixXd> result (PR2, M, N);

//row major sparse - dense product
double tic=getHighResolutionTime();
result=grow*G;
double toc=getHighResolutionTime();
printf("\nsparse-dense time: %f seconds", (toc - tic));

//dense - col major sparse product
tic=getHighResolutionTime();
result=G*gcol;
toc=getHighResolutionTime();
printf("\ndense-sparse time: %f seconds\n", (toc - tic));

Вывод и время с использованием 1,2,4,8 и 16 потоков (на 16-ядерном компьютере). Только разреженные чешуйки, не плотно-разреженные.

Using 1 threads...
sparse-dense time: 5.184886 seconds
dense-sparse time: 3.278560 seconds

Using 2 threads...
sparse-dense time: 2.808550 seconds
dense-sparse time: 3.275191 seconds

Using 4 threads...
sparse-dense time: 1.589596 seconds
dense-sparse time: 3.278983 seconds

Using 8 threads...
sparse-dense time: 1.005600 seconds
dense-sparse time: 3.279466 seconds

Using 16 threads...
sparse-dense time: 0.736803 seconds
dense-sparse time: 3.278893 seconds

Дополнительная информация: Матрицы 7000x7000 случайных, вещественных и двойных. Разреженная матрица является случайной с плотностью 1%. Числовой результат обоих умножений правильный. Я компилирую со следующими флагами:

-fomit-frame-pointer -O3 -DNDEBUG -fopenmp -march=native -fPIC

Edit:

Ответ от ggael прекрасно работает. Вот новые вычисления:

Using 1 threads...
sparse-dense time: 5.070809 seconds
dense-sparse time: 3.270347 seconds

Using 2 threads...
sparse-dense time: 2.786790 seconds
dense-sparse time: 2.070378 seconds

Using 4 threads...
sparse-dense time: 1.580925 seconds
dense-sparse time: 1.243466 seconds

Using 8 threads...
sparse-dense time: 1.000152 seconds
dense-sparse time: 0.887953 seconds

Using 16 threads...
sparse-dense time: 0.898228 seconds
dense-sparse time: 0.909603 seconds

1 Ответ

0 голосов
/ 25 апреля 2018

Вам нужна голова Эйгена (см. Соответствующий коммит ).

...