Как современные компиляторы используют mmx/3dnow/sse инструкции?

Используя numpy:

list(np.reshape(df.values, -1, order='F'))

Ваш df имеет форму (10,3), а вам нужна форма (30,). Вы можете достичь этого с помощью numpy.

-1 - просто сокращение для (30,) в этом случае.

order='F' гарантирует, что вы получите значения «по столбцам», как было представлено в желаемом выводе.

Используя методы NumPy через tolist , вы можете использовать:

df.values.reshape(-1, order='F').tolist()

20
задан thecoop 18 May 2009 в 00:10
поделиться

4 ответа

Обычно их используют немногие компиляторы. GCC и Visual Studio обычно не могут использовать инструкции SIMD. Если вы включите SSE в качестве флага компилятора, он будет использовать скалярные инструкции SSE для обычных операций с плавающей запятой, но, как правило, не ожидайте, что векторизованные команды будут использоваться автоматически. Последние версии GCC могли использовать их в некоторых случаях, но не работали в последний раз, когда я пытался. Компилятор Intel C ++ - единственный известный мне крупный компилятор, который может автоматически векторизовать некоторые циклы.

В общем, вам придется использовать их самостоятельно. Либо в сыром ассемблере, либо с использованием встроенных функций компилятора. В общем, я бы сказал, что встроенные функции - лучший подход, поскольку они лучше позволяют компилятору понимать код и, таким образом, планировать и оптимизировать, но на практике я знаю, что MSVC по крайней мере не t всегда генерирует очень эффективный код из встроенных функций, поэтому простой asm может быть лучшим решением. Поэкспериментируйте, посмотрите, что работает. Но не ожидайте, что компилятор будет использовать эти инструкции за вас, если вы 1) не используете правильный компилятор и 2) напишете довольно простые циклы, которые можно тривиально векторизовать.

Обновление 2012 г.
Хорошо, так что у вас есть три года. прошло с тех пор, как я написал этот ответ. GCC может автоматически векторизовать (простой) код уже пару лет, и в VS2012 MSVC , наконец, получает такую ​​же возможность. Конечно, основная часть моего ответа по-прежнему применима: компиляторы могут векторизовать только довольно тривиальный код. Для чего-то более сложного вам придется возиться с встроенными функциями или встроенным asm.

Но не ожидайте, что компилятор будет использовать эти инструкции за вас, если вы 1) не используете правильный компилятор и 2) напишете довольно простые циклы, которые можно тривиально векторизовать.

Обновление 2012 г.
Хорошо, так что у вас есть три года. прошло с тех пор, как я написал этот ответ. GCC может автоматически векторизовать (простой) код уже пару лет, и в VS2012 MSVC , наконец, получает такую ​​же возможность. Конечно, основная часть моего ответа по-прежнему применима: компиляторы могут векторизовать только довольно тривиальный код. Для чего-то более сложного вам придется возиться с встроенными функциями или встроенным asm.

Но не ожидайте, что компилятор будет использовать эти инструкции за вас, если вы 1) не используете правильный компилятор и 2) напишете довольно простые циклы, которые можно тривиально векторизовать.

Обновление 2012 г.
Хорошо, так что у вас есть три года. прошло с тех пор, как я написал этот ответ. GCC может автоматически векторизовать (простой) код уже пару лет, и в VS2012 MSVC , наконец, получает такую ​​же возможность. Конечно, основная часть моего ответа по-прежнему применима: компиляторы могут векторизовать только довольно тривиальный код. Для чего-то более сложного вам придется возиться с встроенными функциями или встроенным asm.

GCC может автоматически векторизовать (простой) код уже пару лет, и в VS2012 MSVC , наконец, получает такую ​​же возможность. Конечно, основная часть моего ответа по-прежнему применима: компиляторы могут векторизовать только довольно тривиальный код. Для чего-то более сложного вам придется возиться с встроенными функциями или встроенным asm.

GCC может автоматически векторизовать (простой) код уже пару лет, и в VS2012 MSVC , наконец, получает такую ​​же возможность. Конечно, основная часть моего ответа по-прежнему применима: компиляторы могут векторизовать только довольно тривиальный код. Для чего-то более сложного вам придется возиться с встроенными функциями или встроенным asm.

23
ответ дан 30 November 2019 в 00:09
поделиться

Mono может использовать расширения SIMD, если вы используете его классы для векторы. Вы можете прочитать об этом здесь: http://tirania.org/blog/archive/2008/Nov-03.html

GCC должен выполнить автоматическую векторизацию, если вы используете -O3 или конкретный флаг. У них есть информационная страница здесь: http://gcc.gnu.org/projects/tree-ssa/vectorization.html

9
ответ дан 30 November 2019 в 00:09
поделиться

Вопрос о том, как использовать SSE и другие небольшие векторные блоки автоматически (без указаний программиста в виде специальных языковых конструкций или специально благословленных "внутренностей" компилятора) некоторое время был предметом изучения компиляторов. Большинство результатов, кажется, специализируются на конкретной проблемной области, такой как цифровая обработка сигналов . Я не следил за литературой по этой теме, но то, что я прочитал , предполагает, что использование модуля вектора (SSE) все еще является темой для исследования, и что у человека не должно быть никаких ожиданий от универсального назначения. компиляторы, обычно используемые в этой области.

Предлагаемый термин для поиска: векторизирующий компилятор

4
ответ дан 30 November 2019 в 00:09
поделиться

Если вы используете компилятор векторных паскалей, вы получите эффективный код SIMD для типов, для которых SIMD дает преимущество. В основном это что-либо длиной менее 64 бит. (для 64-битных реалов на самом деле делать SIMD медленнее). Последние версии компилятора также будут автоматически распараллеливать ядра

0
ответ дан 30 November 2019 в 00:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: