Я пытаюсь заставить GCC 4.7 автоматически векторизовать некоторые части моего кода, чтобы обеспечить увеличение скорости, однако это кажется трудным.
Вот некоторый код, который я хотел бы векторизовать:
void VideoLine::WriteOut(unsigned short * __restrict__ start_of_line, const int number_of_sub_pixels_to_write)
{
unsigned short * __restrict__ write_pointer = (unsigned short *)__builtin_assume_aligned (start_of_line, 16);
unsigned short * __restrict__ line = (unsigned short *)__builtin_assume_aligned (_line, 16);
for (int i = 0; i < number_of_sub_pixels_to_write; i++)
{
write_pointer[i] = line[i];
}
}
Я использую следующие переключатели GCC:
-std=c++0x \
-o3 \
-msse \
-msse2 \
-msse3 \
-msse4.1 \
-msse4.2 \
-ftree-vectorizer-verbose=5\
-funsafe-loop-optimizations\
-march=corei7-avx \
-mavx \
-fdump-tree-vect-details \
-fdump-tree-optimized \
Я знаю, что некоторые отвергают другие.
Я вообще не получаю никакого вывода от векторизатора, однако, глядя на файл .optomized, я вижу, что он не использовал векторизацию. Кто-нибудь может указать мне правильный путь, чтобы заставить это векторизовать?
Редактировать: Выяснилось, что проблема заключалась в использовании -o3, а не -O3.
попытаться гарантировать, что number_of_sub_pixels_to_write
кратно 4, маскируя его так, как это делается здесь:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dht0002a/ch01s04s03.html
Компилятор может делать то, что ему нравится. Поэтому, если вы действительно хотите использовать функциональность SIMD (а не полагаться на компилятор), вам следует использовать функции (см. руководство).