Осторожно: _mm256_fmadd_ps
не является частью AVX1. FMA3 имеет свой собственный бит функции и был представлен только на Intel с Haswell. AMD представила FMA3 с Piledriver (AVX1 + FMA4 + FMA3, без AVX2).
На уровне asm, если вы хотите получить восемь 32-битных элементов в целочисленные регистры, на самом деле быстрее хранить стек, а затем выполнять скалярные нагрузки. pextrd
представляет собой 2-юп-инструкцию для семейства SnB и семейства Bulldozer. (и Nehalem и Silvermont, которые не поддерживают AVX).
Единственным процессором, где vextractf128
+ 2x movd
+ 6x pextrd
не страшно, является AMD Jaguar. (дешевый pextrd
и только один порт нагрузки.) (см. таблицы insner Agner Fog )
Широкое ориентированное хранилище может переходить на перекрывающиеся узкие нагрузки. (Конечно, вы можете использовать movd
для получения элемента low, поэтому у вас есть соединение с портом загрузки и портом ALU).
Конечно, вы, кажется, извлекаете float
s, используя целочисленный экстракт, а затем преобразовывая его обратно в float. Это кажется ужасным.
Что вам действительно нужно, каждый float
в нижнем элементе собственного xmm-регистра. vextractf128
, очевидно, способ начать, приведя элемент 4 к нижней части новой xmm reg. Тогда 6x AVX shufps
может легко получить остальные три элемента каждой половины. (Или movshdup
и movhlps
имеют более короткие кодировки: нет непосредственного байта).
7 shuffle uops заслуживают рассмотрения против 1 магазина и 7 загрузочных дисков, но не если вы собираетесь проливать вектор для вызова функции.
Вы находитесь в Windows, где xmm6-15 защищены от вызова (только low128; верхние половины ymm6 -15 сбрасываются с помощью вызова). Это еще одна причина для начала работы с vextractf128
.
В SysV ABI все регистры xmm / ymm / zmm вызываются вызовом, поэтому для каждой функции print()
требуется пролитие / перезагрузка. Единственное, что нужно сделать, - сохранить память в памяти и вызвать print
с исходным вектором (т. Е. Напечатать нижний элемент, потому что он будет игнорировать остальную часть регистра). Затем movss xmm0, [rsp+4]
и называть print
на втором элементе и т. Д.
Вам нехорошо получить все 8 поплавков, красиво распакованных в 8 векторных рег, потому что все они должны разливаться отдельно так или иначе перед первым вызовом функции!
if (any == System.DBNull.Value) ...
Я предпочитаю, что один, просто потому что я считал, что как сравнение значений, не вводит.
Я склонен использовать
if (DBNull.Value.Equals(value)) {
//
}
или
if (Convert.IsDBNull(value)) {
//
}
is
не использует отражение, как говорит Kevlar623. Это отображается на isinst
операция в IL. На том уровне, сравнивая производительность совершенно глупо, если Вы не работаете над ракетной системой наведения.
Я использую value is DBNull
. Это просто звучит правильным и как параноидальный разработчик, я не могу положить, что единственное значение, когда-либо существующее, DBNull.Value
. Ошибки происходят.
Мне нравится, "Система. DBNull" больше, потому что я ненавижу идею сравнить что-то с ПУСТЫМ УКАЗАТЕЛЕМ и иметь его быть верным. Много других синтаксисов (что, черт возьми, множественное число этого?) имел бы что-либо ==, ПУСТОЙ УКАЗАТЕЛЬ возвращает ПУСТОЙ УКАЗАТЕЛЬ.
Я понимаю, что существует DBNull. Значение по причине. Я знаю. Я перечисляю свое ПРЕДПОЧТЕНИЕ :)
Это - хороший пример формы, следует за функцией. Какой бы ни каждый выполняется, более эффективно способ пойти. То, на что это похоже, читает как, или плохие имена, которые это звонит Вам, не важны. Используйте язык эффективно, не прессуйте язык в новый.
если Вы находитесь в c#, необходимо использовать ==
; is
отражение использования, которое является более дорогим для вычислений, тем более, что существует только когда-либо один экземпляр System.DBNull
.