Кто-нибудь может объяснить, почему эта функция хорошо векторизована для 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**
.