- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
void sort8(uint64_t a[8])
{
uint64_t a0;
uint64_t a1;
uint64_t a2;
uint64_t a3;
uint64_t a4;
uint64_t a5;
uint64_t a6;
uint64_t a7;
SORT2(a[0], a[1], a0, a1);
SORT2(a[2], a[3], a2, a3);
SORT2(a[4], a[5], a4, a5);
SORT2(a[6], a[7], a6, a7);
uint64_t a_tmp[8];
MERGE_2_4(a0, a1, a2, a3, a_tmp[0], a_tmp[1], a_tmp[2], a_tmp[3]);
MERGE_2_4(a4, a5, a6, a7, a_tmp[4], a_tmp[5], a_tmp[6], a_tmp[7]);
uint64_t *ptra1 = &a_tmp[0];
uint64_t *ptra2 = &a_tmp[4];
for (size_t i = 0; i < 4; i++)
{
if (*ptra1 < *ptra2)
{
a[i] = *ptra1;
ptra1++;
}
else
{
a[i] = *ptra2;
ptra2++;
}
}
for (size_t i = 4; i < 8; i++)
{
if (ptra1 == &a_tmp[4])
{
while (ptra2 != &a_tmp[8])
{
a[i++] = *ptra2;
ptra2++;
}
break;
}
if (ptra2 == &a_tmp[8])
{
while (ptra1 != &a_tmp[4])
{
a[i++] = *ptra1;
ptra1++;
}
break;
}
if (*ptra1 < *ptra2)
{
a[i] = *ptra1;
ptra1++;
}
else
{
a[i] = *ptra2;
ptra2++;
}
}
}
Мерж сорт, специализированный на 8 элементов. Вот доказательство корректности https://paste.debian.net/hidden/cce6d31a/
j123123 13.01.2019 15:02 # +1
Эта херня по итогам уделывает в скорости std::sort, если им сортировать куски по 8 элементов.
gpyrou_nemyx 13.01.2019 15:07 # 0
bormand 13.01.2019 15:12 # +2
j123123 13.01.2019 15:13 # +1
guest8 13.01.2019 15:19 # −999
guest8 13.01.2019 15:24 # −999
gpyrou_nemyx 13.01.2019 15:31 # 0
А, внутри if'а. Сорре.
bormand 13.01.2019 15:33 # 0
guest8 13.01.2019 15:35 # −999
guest8 13.01.2019 15:16 # −999
bormand 13.01.2019 15:13 # 0
j123123 13.01.2019 15:15 # 0
j123123 13.01.2019 16:43 # 0
miheich 13.01.2019 17:55 # 0
guest8 06.06.2019 22:19 # −999
j123123 13.01.2019 16:05 # 0
Кто-нибудь сможет быстрее сортировку на восемь uint64_t сделать (можно даже попробовать какое-нибудь SSE, если оно чем-то сможет помочь)? std::sort отстает от этого кода на GCC.
bormand 13.01.2019 18:34 # +1
Подстраховался от эсэсёбства? :)
bormand 13.01.2019 19:15 # 0
j123123 14.01.2019 00:42 # 0
Если последнюю стадию улучшить (наанроллить) в моем варианте, можно быстрей перфоманс сделать.
j123123 14.01.2019 00:42 # 0
Да, если с PGO оптимизировать обычный std::sort, он оба варианта уделывает по пирфомансу
https://paste.debian.net/hidden/eadc947e/ - вот код для тестов, если интересно
j123123 14.01.2019 04:41 # +1
Теперь std::sort опять проигрывает, даже с PGO. Видимо этот std::sort по дизайну так запилен, чтоб частично сортированнные массивы досортировывать (досортировывать массивы из одних нулей - легко!), а если еще PGO использовать, то тогда вообще супер быстро получается.
https://paste.debian.net/hidden/368b30a7/
j123123 14.01.2019 07:49 # +1
https://paste.debian.net/hidden/d6c6cd71/ тестовый код
Вывод времени
time = 154968303
time = 149922928
time = 151220900
time = 150623575
Для GCC-8 всё сильно медленней:
time = 381412656
time = 381636722
time = 381310683
time = 379839114
j123123 14.01.2019 07:56 # 0
(тогда можно будет увидеть саму функцию в ненаанролленом виде).
И что же мы видим в случае clang?
куча сравнений и условных мувов.
Что же касается GCC:
Мы видим кучу меток и условных переходов, тут явно какой-то косяк компилятора. Надо будет в багзиллу GCC ченить накатать по этому поводу.
j123123 14.01.2019 08:27 # 0
bormand 14.01.2019 08:35 # 0
j123123 14.01.2019 09:02 # 0
bormand 14.01.2019 09:08 # 0
j123123 14.01.2019 09:11 # 0
bormand 14.01.2019 09:45 # 0
bormand 14.01.2019 09:45 # +1
sssssssssse3
j123123 14.01.2019 10:40 # 0
bormand 14.01.2019 13:28 # 0
Кстати можно на stm'ке с NEONом попробовать.
gpyrou_nemyx 14.01.2019 14:50 # 0
http://www.greenarraychips.com/home/documents/greg/PB001-100503-GA144-1-10.pdf
HoBorogHuu_nemyx 14.01.2019 16:55 # 0
... можно срать в два унитаза в сорок тысяч раз быстрей.
bormand 14.01.2019 08:40 # 0
bormand 14.01.2019 11:18 # 0
guest8 14.01.2019 17:51 # −999
guest8 14.01.2019 17:52 # −999
bormand 14.01.2019 21:25 # 0
guest8 14.01.2019 21:35 # −999
bormand 14.01.2019 21:25 # −1
bormand 15.01.2019 00:05 # 0
С 256-битными интринсиками получилось вроде красиво (каждый сортирующий слой из cmpgt + blend + blend и между ними небольшие перестановки по 1-2 инструкции), но почему-то на треть медленнее невекторизованной битонки. Неужели AVX такой тормозной?
bormand 15.01.2019 00:22 # 0
bormand 15.01.2019 00:45 # 0
bormand 14.01.2019 14:38 # 0
oa = a < b ? a : b;
ob = a < b ? b : a;
j123123 14.01.2019 15:00 # 0
HoBorogHuu_nemyx 14.01.2019 15:08 # 0
j123123 14.01.2019 15:14 # 0
guest8 14.01.2019 15:17 # −999
HoBorogHuu_nemyx 14.01.2019 15:25 # 0
Серьёзно, производители кококонпеляторов знают про «SSE» и «AVX», но игнорируют «CMOV»?
guest8 14.01.2019 15:29 # −999
gpyrou_nemyx 14.01.2019 15:32 # +2
HoBorogHuu_nemyx 14.01.2019 15:35 # +1
Хотя с другой стороны, в 32- и 64-битном режимах с появлением s-i-b (scale-index-base) она и вправду стала не нужна.
guest8 14.01.2019 15:36 # −999
HoBorogHuu_nemyx 14.01.2019 15:39 # +2
То ли дело «PDP-11», у которого любую инструкцию можно было использовать с любым набором регистров (было всего несколько исключений для спецрегистров).
Даже «ARM» кококококонсистентнее, потому что у него предикаты есть у всех инструкций, а не только у «CMOV».
guest8 14.01.2019 15:49 # −999
HoBorogHuu_nemyx 14.01.2019 15:52 # 0
guest8 14.01.2019 17:10 # −999
guest8 14.01.2019 15:16 # −999
HoBorogHuu_nemyx 14.01.2019 15:26 # 0
guest8 14.01.2019 15:30 # −999
gpyrou_nemyx 14.01.2019 15:59 # +3
guest8 14.01.2019 17:11 # −999
HoBorogHuu_nemyx 14.01.2019 17:14 # 0
guest8 14.01.2019 17:18 # −999
HoBorogHuu_nemyx 14.01.2019 17:26 # 0
guest8 14.01.2019 17:35 # −999
HoBorogHuu_nemyx 14.01.2019 17:46 # 0
Погуглил... Я проспал появление «Моста Песочка» и «Ускоренной единицы обработки».
guest8 14.01.2019 17:59 # −999
HoBorogHuu_nemyx 14.01.2019 18:32 # +1
guest8 14.01.2019 19:11 # −999
gpyrou_nemyx 14.01.2019 19:38 # +2
bormand 14.01.2019 19:46 # 0
6800 и 68000.
HoBorogHuu_nemyx 14.01.2019 19:47 # 0
guest8 14.01.2019 19:53 # −999
guest8 14.01.2019 19:52 # −999
guest8 14.01.2019 19:51 # −999
HoBorogHuu_nemyx 14.01.2019 20:04 # 0
Были серии с укороченным названием T34, Т36, Т37 (вместо длинных КР580, К1810).
Были микропроцессоры с буквами ВП, ВЕ, ИК, ХЛ вместо ВМ.
У «Эльбрусов» и сейчас такие наименования: 1891ВМ10Я, 1891ВМ11Я.
guest8 14.01.2019 20:28 # −999
bormand 14.01.2019 20:35 # 0
Да почти у всех чипов ебанистические названия, на самом деле. Тут скорее пекашные процы - исключение.
gpyrou_nemyx 14.01.2019 20:07 # 0
guest8 14.01.2019 20:25 # −999
HoBorogHuu_nemyx 14.01.2019 20:31 # 0
HoBorogHuu_nemyx 14.01.2019 20:36 # +1
• Операционная система: OS/2.
• Интерпретатор скриптов: PL/1.
• Система управления базами данных: DB/2.
guest8 14.01.2019 20:37 # −999
gpyrou_nemyx 14.01.2019 20:39 # +1
PL/0 есть. Вообще у PL/1 много диалектов.
HoBorogHuu_nemyx 14.01.2019 20:43 # 0
roman-kashitsyn 14.01.2019 20:54 # 0
Programming Language for Division by Zero?
guest8 14.01.2019 21:08 # −999
HoBorogHuu_nemyx 15.01.2019 11:37 # 0
http://govnokod.ru/24481#comment420978
http://govnokod.xyz/_24481/#comment-376917
guest8 14.01.2019 20:56 # −999
HoBorogHuu_nemyx 14.01.2019 21:02 # 0
>> In the third and last edition of his book on compiler construction, Wirth replaced PL/0 with Oberon-0.
Интересно, существовала ли Модула-0 или Ада-0.
guest8 14.01.2019 21:06 # −999
guest8 14.01.2019 21:08 # −999
1024-- 14.01.2019 21:02 # 0
Ох, а то я уж подумал, что на таком настоящие программы писали.
Современные школьники наверно уже и языки без замыканий считают говном.
guest8 14.01.2019 21:06 # −999
gpyrou_nemyx 14.01.2019 21:08 # 0
guest8 14.01.2019 21:17 # −999
1024-- 14.01.2019 21:41 # 0
guest8 14.01.2019 21:45 # −999
1024-- 14.01.2019 22:06 # +1
Слишком очевидно, что это одно и то же, названное разными словами. Аргумент - это фактический параметр.
Тонкости нужны только в лямбда-исчислении и при построении трансляторов.
guest8 14.01.2019 22:31 # −999
1024-- 14.01.2019 22:37 # 0
guest8 14.01.2019 23:11 # −999
1024-- 15.01.2019 00:26 # +1
guest8 15.01.2019 00:36 # −999
gost 15.01.2019 00:45 # +1
guest8 15.01.2019 00:48 # −999
1024-- 15.01.2019 01:35 # 0
guest8 15.01.2019 01:43 # −999
1024-- 15.01.2019 01:49 # +1
А это уже сомнительная фича.
Ну то есть хорошо бы два режима - "скалярный", когда она включена и "векторный", когда выключена, по умолчанию - "векторный"
(Это я исходя из опыта работы с JS, где можно в переменной хранить сначала число, потом - после усложнения логики программы - массив или объект, что вызовет глюки, если "скалярный" режим работает по умолчанию)
gost 15.01.2019 01:53 # +1
https://wandbox.org/permlink/IxOATTwP2gBcbNwE
А ещё есть прикольный «std::tie()», но он ебанутый.
gpyrou_nemyx 14.01.2019 21:06 # 0
bormand 14.01.2019 19:54 # 0
То ли дело EP4CE22F17C6N.
1024-- 14.01.2019 19:59 # 0
guest8 14.01.2019 20:15 # −999
HoBorogHuu_nemyx 14.01.2019 20:07 # +2
bormand 14.01.2019 20:09 # 0
А что там помнить? LUT'ы, регистры, умножители, память, PLL'ки, I/O блоки. Она по структуре проще многих контроллеров, на самом деле.
guest8 14.01.2019 20:24 # −999
bormand 14.01.2019 20:28 # 0
Это ж не проц... Напишешь - будут (если влезут, конечно).
guest8 14.01.2019 20:45 # −999
bormand 14.01.2019 20:52 # 0
guest8 14.01.2019 21:07 # −999
bormand 14.01.2019 20:02 # 0
guest8 14.01.2019 20:16 # −999
guest8 14.01.2019 20:18 # −999
guest8 14.01.2019 20:16 # −999
roman-kashitsyn 14.01.2019 17:36 # 0
j123123 14.01.2019 17:50 # 0
То ли дело SoftICE (RIP)
guest8 14.01.2019 17:59 # −999
j123123 15.01.2019 05:54 # +1
j123123 15.01.2019 05:59 # +1
guest8 14.01.2019 17:52 # −999
j123123 14.01.2019 16:14 # +2
j123123 14.01.2019 16:17 # +2
j123123 15.02.2019 13:27 # +1
https://godbolt.org/z/yLGWmR - использована опция "-x c" - если ее убрать, cmov-ы пропадут. Поэтому я за Си.
j123123 16.01.2019 05:44 # 0
на случайных данных будет оччень малая вероятность, что на первом же 64-битном куске оба числа будут одинаковы (если быть точным, вероятность эта равна 1/18446744073709551616 - вероятность случайно угадать 64-битное число)
а процедура обмена двух uint1024_t уже будет достаточно дорогой. Но можно не менять сами uint1024_t, а хранить некий вспомогательный массив индексов
А потом уже в конце можно пораспихивать все эти массивчики через этот говномассив с перестановками, но если мы сортируем большой массив (а не кусочками по 8 штук) то у нас от прыганья по этим индексам будет промахи кэша, в общем тут много чего можно понапридумывать с этим говном