Собственная итерация по внутреннему итератору в разреженной матрице с SIMD - PullRequest
0 голосов
/ 05 июня 2018

Применить simd к собственному внутреннему итератору разреженной матрицы:

for(auto i = 0; i < smat.outerSize(); i++){
    #pragma omp simd
    for(SMat::InnerIterator iter(smat,i); it; ++it){
        it.valueRef() = value;
    }
}

Это не работает из-за ошибки с инициализацией в скобках в цикле for несовместимо с simd.Затем я пытаюсь:

    SMat::InnerIterator iter(smat,i);
    #pragma omp simd
    for(;it;++it){ // error, declaration or initialization expected

    for(it;it;++it){ // error, declaration or initialization expected

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

Далее я проверяю и обнаруживаю, что Eigen имеет только три вызова на omp ввесь код.Значит ли это, что Eigen зависит от флагов компилятора для активации simd?

Наконец, я пытаюсь изменить цикл на каноническую форму (согласно комментарию ниже) и получаю другую ошибку:

for(auto it = typename SMat::InnerIterator(smat,i); it; ++it)

// error: '#pragma omp simd' used with class iteration variable 'it'

Каков ожидаемый способ запуска или итерации по внутреннему векторув Eigen::SparseMatrix<double> с simd?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Если вы хотите изменить каждую запись, и ваша матрица находится в сжатой форме, вы можете использовать функцию-член .coeffs():

smat.coeffs() = value;

Итерация по отдельным столбцам будетнемного сложнее, но вы можете узнать начало каждого столбца, посмотрев на smat.outerIndexPtr()[col] (начало col+1 - это конец col).

0 голосов
/ 06 июня 2018

Невозможно применить #pragma omp simd в этом контексте.Согласно спецификациям OpenMP (2.6 Canonical Loop Form), «в конструкции simd единственными разрешенными типами итераторов произвольного доступа [...] являются типы указателей».Вовлеченные итераторы явно не являются указателями.Можно было бы изменить их на такое, чтобы разрешить цикл simd OpenMP, но для этого потребовалось бы понимание реализаций и структуры данных участвующих типов.

...