Войти
ПрограммированиеФорумОбщее

SIMD оптимизации (21 стр)

Страницы: 120 21 22 2326 Следующая »
#300
22:03, 21 ноя. 2018

FROL
> Другое дело что ИМХО идеологически всё-таки более правильно использовать средство непосредственно для этого предназначенное -- reinterpret_cast.
Насколько я знаю, оно не просто не предназначено для этого, это, в принципе, ошибка (UB). Кажется, там есть какие-то исключения для char *, но это не наш случай.
Единственно правильный способ по стандарту — это использовать memcpy.

> А memcpy всё-таки вызов функции.
Одна из основных фич C++ — это то, что он умеет функции инлайнить.


#301
22:15, 21 ноя. 2018

}:+()___ [Smile]
+1

Ссылки про strict aliasing:
https://cellperformance.beyond3d.com/articles/2006/06/understandi… aliasing.html
https://blog.regehr.org/archives/1307
https://gist.github.com/shafik/848ae25ee209f698763cffee272a58f8

#302
(Правка: 22:37) 22:37, 21 ноя. 2018
Хваленый интеловский компайлер до недавнего времени генерил чушь на memcpy, кстати https://godbolt.org/z/22EjM8
#303
9:30, 22 ноя. 2018

return [](){};
> Хваленый интеловский компайлер до недавнего времени генерил чушь на memcpy,
> кстати https://godbolt.org/z/22EjM8

Не надо фигню самому писать, и тогда компайлер не будет её генерить. memcpy для одного float это криворучие программиста. Особенно когда компилятор даже отдельную серию a = b; умеет превращать в movaps.

#304
(Правка: 13:34) 13:33, 22 ноя. 2018

С одной стороны я люблю строгую типизацию. И вообще говоря конкретно для указателей я поддерживаю запрет на каст.
Да, это правильно. Только так надо было делать с самого начала, как в Аде. Нельзя и всё.
А если очень надо -- работаем со специальным типом Address.

А теперь вот на пол пути идти на попятную уже поздно.
И потом, векторные типы ИМХО не то же самое что указатели.
И ссылки тоже -- не совсем то же самое.

Пожалуй, в этом споре я поддержу Truthfinder.
С++ совсем в говно превратился.
Сначала ввели reinterpret_cast а теперь говорят что это ошбика.
Ввели оператор new, а теперь хотят его запретить.

Абсолютно нормальный с точки зрения здравого смысла код

static inline int   as_int(float x) { return reinterpret_cast<int&>  (x); }
static inline float as_float(int x) { return reinterpret_cast<float&>(x); }

Перестаёт быть валидным, потому что в каком-то долбанном стандарте решили определить это как "undefined behaviour" по религиозным соображениям (__restrict ведь никто не отменял для оптимизаций).
И при этом по старому уже делать нельзя, а std::bin_cast ещё нет, поэтому, мол, пользуйтесь трюком с memcpy.
Да пошли они все далеко и надолго!!!

Перехожу на чистый Си и Аду!

#305
(Правка: 18:57) 18:56, 22 ноя. 2018

return [](){};
> Хваленый интеловский компайлер
Кто его хвалил, кроме самого интела?

FROL
> Перехожу на чистый Си
В чистом C это тоже UB, вроде.

#306
(Правка: 22:53) 22:51, 22 ноя. 2018

}:+()___ [Smile]
> Кто его хвалил, кроме самого интела?
Ну явно лучше студии, с gcc правда все не так однозначно

#307
23:53, 22 ноя. 2018

}:+()___ [Smile]
> > Перехожу на чистый Си
> В чистом C это тоже UB, вроде.
То есть к void* и memcpy можно, а напрямую нельзя ? Как-то это слегка странно..... хотя наверное всё так.
void* это эквивалент Address. Есть о чём задуматься )

#308
0:23, 23 ноя. 2018

FROL
> То есть к void* и memcpy можно, а напрямую нельзя ?
Это не каст нельзя, это нельзя объект одного типа интерпретировать как другой.
Ты можешь сколько угодно кастовать указатели, но разыменовывать указатель на int можно только если он содержит адрес int объекта.

#309
0:42, 23 ноя. 2018
}:+()___ [Smile]
> но разыменовывать указатель на int можно только если он содержит адрес int объекта.
Здесь тонна мелкого шрифта про совместимые типы, которые есть в C, но не в C++, но в целом ага.
#310
4:55, 23 ноя. 2018

> А memcpy всё-таки вызов функции.
А это разве не инструкция lodsb/stosb и иже с ними?

#311
12:03, 23 ноя. 2018

Dimich
Сейчас memcpy через них реализуют только в достаточно специфичных случаях, и даже там профит неоднозначен.

#312
(Правка: 14:54) 14:53, 23 ноя. 2018

FordPerfect
> даже там профит неоднозначен.
Профит я видел у одного чувака на ютубе, который писал блиттер на sse, у него memcpy дал больше фпс, чем копирование через sse регистры. И асм выхлоп был именно stosb.

#313
(Правка: 15:21) 15:20, 23 ноя. 2018

Dimich
> Профит я видел у одного чувака на ютубе, который писал блиттер на sse, у него
> memcpy дал больше фпс, чем копирование через sse регистры. И асм выхлоп был
> именно stosb.

Отлично. А он умеет? А как он это делал? А какие были инструкции с SSE? А там xmm или ymm? x86 или x64? Intel или AMD? А выравнивание было учтено? А там movaps или movups? А архитектура какая вообще проца? А xmm - ymm пенальти там не было? А prefetch он использовал? А какой длины были блоки памяти? А как тестировал? И так далее, и тому подобное ...

#314
15:24, 23 ноя. 2018

Вроде оно https://www.youtube.com/watch?v=GwII1AJzKN4

Страницы: 120 21 22 2326 Следующая »
ПрограммированиеФорумОбщее