У меня есть функция, которая векторизует OK, но для которой я не могу убедить компилятора, что входной и выходной буфер не перекрывается, и поэтому нет проверки псевдонима. Прибыв в качестве аргумента функции, нет никакого способа убедить компилятора, что я абсолютно уверен, что 2 буфера никогда не будут перекрываться. < /p>
Это функция: < /p>
Код: Выделить всё
__attribute__((optimize("tree-vectorize","tree-vectorizer-verbose=6")))
void threshold(const cv::Mat& inputRoi, cv::Mat& outputRoi, const unsigned char th) {
const int height = inputRoi.rows;
const int width = inputRoi.cols;
for (int j = 0; j < height; j++) {
const uint8_t* __restrict in = (const uint8_t* __restrict) inputRoi.ptr(j);
uint8_t* __restrict out = (uint8_t* __restrict) outputRoi.ptr(j);
for (int i = 0; i < width; i++) {
out[i] = (in[i] < valueTh) ? 255 : 0;
}
}
}
Проблема решена !! (См. Ответ ниже)
с использованием GCC 4.9.2, вот полный пример. Обратите внимание на использование флага компилятора -fopt-info-vec-optimized вместо замены -ftree-vectorizer-verbose = n .
Итак, для GCC используйте #pragma gcc ivdep и наслаждайтесь!
Подробнее здесь: https://stackoverflow.com/questions/259 ... -necessary
Мобильная версия