Автогекторизация: убедить компилятора в том, что проверка псевдонима не требуетсяC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Автогекторизация: убедить компилятора в том, что проверка псевдонима не требуется

Сообщение Anonymous »

Я выполняю некоторую обработку изображений, для которой я получаю пользу от векторизации.
У меня есть функция, которая векторизует 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;
}
}
}
Единственный способ убедить компилятор не выполнять проверку псевдонима, - это если я помещаю внутренний цикл в отдельную функцию, в которой указатели определяются как __retrict __ аргументы. Если я объявляю эту внутреннюю функцию как вставленную, опять же, проверка псевдонима активируется. /> edit: < /strong>

Проблема решена !! (См. Ответ ниже)

с использованием GCC 4.9.2, вот полный пример. Обратите внимание на использование флага компилятора -fopt-info-vec-optimized вместо замены -ftree-vectorizer-verbose = n .

Итак, для GCC используйте #pragma gcc ivdep и наслаждайтесь! :)

Подробнее здесь: https://stackoverflow.com/questions/259 ... -necessary
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»