Pull to refresh

Comments 11

В 2015 году было бы неплохо хотя бы упомянуть о alignas. Вместо всяких declspec компиляторозависимых.
Спасибо, очень дельное замечание. Стоит только отметить, что поддержка C++11 тоже весьма ограничена в компиляторах, поэтому проблема при переходе на другой компилятор тоже возникнет, но в будущем более правильное решение для С++. Скажем, alignas начали поддерживать в Intel C++ только с версии 15.0 (aka Intel Parallel Studio XE 2015 Composer Edition for C++).
Вы удивили. В каких компиляторах поддержка C++11 весьма ограничена на сегодня? Если верить инфографике и другим данным, то (по крайней мере) не в 95% самых используемых.
Ну, в таком случае, если верить приведенной вами инфографике и этой статье MSDN, как минимум 41% (36% VS и 5 % Intel) поддерживают alignas только в последних релизах (VS2015, Intel Compiler 15.0). Вряд ли все уже поставили себе VS2015, не правда ли? На gcc даже не смотрел к какой версии стали поддерживать, её попроще достать.
А вообще, учитывая «небесплатность» некоторых компиляторов (в частности от Intel), разработчики далеко не всегда спешат ставить самую последнюю версию, предпочитая оставаться на какой-то одной по 2-3 года. Я к тому, что ещё не у всех стоят версии компиляторов, поддерживающие alignment фичи из С++11. Не вижу в этом ничего удивительного.
Не совсем уловил, так компилятор оптимизирует такие циклы в векторные операции или нет? Я сейчас как раз пытаюсь вручную в своём проекте похожий цикл оптимизировать, используя встроенные векторные функции (compiler intrisincs). Может я зря заморачиваюсь и достаточно включить поддержку SSE/AVX и выровнять данные?
Да, векторизует, и да, вполне вероятно, что этого будет достаточно, нужно только ещё перед циклом сказать компилятору через директиву, что данные выравнены.
Я вспомнил статью, в которой разбирались специфические для GCC нюансы. Ещё нужно явно указывать, что данные не пересекаются помимо выравнивания.
Можно тоже почитать мою статью про векторизацию в Интеловском компиляторе здесь.
Хотелось бы узнать о тех случаях, когда компилятор «не справляется» с автоматической генерацией выровненных инструкций. Помимо случаев, когда размер определяется динамически в рантайме, конечно.
Компилятор часто делает несколько веток или пытается выравнять через peel loop в случаях, когда ничего не знает о выравнивании.
Ну и как я говорил, он не стесняется использовать невыравненные инструкции, потому что по скорости они на современных процессорах не проигрывают выравненным (при условии выравненных данных).
Sign up to leave a comment.