Есть ли что-то вроде ключевого слова restrict для C ++, чтобы указать, что _iterators_ не являются псевдонимами - PullRequest
8 голосов
/ 13 февраля 2011

g ++ действительно реализует __restrict__ для указателей, но я не смог найти ничего об итераторах.Мое общее намерение состоит в том, чтобы поощрить компилятор векторизовать циклы stl.

Редактировать:

Даже если компилятор не может векторизовать, ключевое слово __restrict__ должно быть в состояниисообщить компилятору, что в цикле не требуется ненужных перезагрузок.

1 Ответ

6 голосов
/ 13 февраля 2011

Я не знаю ответа на ваш прямой вопрос. Тем не менее, компилятор сможет когда-либо только векторизовать цикл для std::vector, поскольку это единственный контейнер (я думаю), который имеет непрерывное хранилище и не имеет зависимостей между последовательными хранилищами (в отличие, например, std::list). Но я не знаю, как это сделать.

Обновление

После некоторых экспериментов (которые могут относиться или не относиться к общей цели), я обнаружил, что в ICC следующее не векторизация:

typedef std::vector<float> V;

V vec(4096);

for (V::iterator it = vec.begin(); it != vec.end(); ++it)
{
    *it *= *it;
}

тогда как следующее:

V vec(4096);

V::iterator it2 = vec.end();
for (V::iterator it = vec.begin(); it != it2; ++it)
{
    *it *= *it;
}

Так что, очевидно, проблема не столько в итераторах, сколько в вызове vec.end() внутри конструкции цикла, который, по-видимому, не может быть учтен, даже если ясно, что тело цикла не влияет на векторные границы.

В GCC я не мог получить что-либо для векторизации. Это неудивительно, потому что GCC намного хуже, чем ICC в определении возможностей SSE.

...