GCC / CLANG Авто-векторизация на двухмерных массивах, работающих на int, а не на char - PullRequest
0 голосов
/ 06 апреля 2019

Кто-нибудь может объяснить, почему эта функция хорошо векторизована для int, short, float, но не для 8-битных числовых типов, таких как char или unsigned char?Код из https://godbolt.org/z/0UIMt7:

typedef int S; // Try with char
void test_add(S **  A, S ** B, S ** C,
             const int nrows, const int ncols)
{
  for (int r = 0; r < nrows; r++)
    for (int c = 0; c < ncols; c++)
      A[r][c] = B[r][c] + C[r][c];
}

int main(){}

Вы должны быть в состоянии воспроизвести это с помощью clang или gcc:

clang++ ./bug_report.cc -O3 -Rpass-analysis=loop-vectorize -Rpass=loop-vectorize -Rpass-missed=loop-vectorize 

Для информации, clang ++ даст мне это сообщение с 8-битными типами:

remark: loop not vectorized: cannot identify array bounds
      [-Rpass-analysis=loop-vectorize]
    for (int c = 0; c < ncols; c++)

Если я добавлю __restrict__ к трем параметрам указателя, это будет векторизовано, но это невозможно в моем приложении, где A, B, C являются объектами opencv cv::Mat_, а не char**.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...