OpenDX
> вероятно .L пишет программный раситеризатор =)
ну да, очередной : )
sb3d
> но тут что-то странное.
да. я не корректно сравнил. Дело в том, что без очистки у меня 900-1000 фпс (выполняется только SetDIBitsToDevice) но на шарпе у меня было примерно 1400 фпс, это факт. Надо смотреть в чём дело.
По теме - много интересных методов заполнения памяти увидел, всем большое спасибо!
Pushkoff
> скорость заполнения равна 1 Гбайт/с, че там с пропускными способностями?
А, хм... Да, мало даже для первой ddr.
.L, тогда вывод прост. Что-то другое тормозит. Вывод на экран, например, ещё что-то. Собери консольный тест, одинаковый для обоих случаев.
.L
> ну да, очередной : )
Ну тагда используй аппаратный блиттинг наверно. Или у тебя даже блиттинг софтварный( как у меня =) )?
Pushkoff
>хотя буфер должен почти целиком на кеш леч...
Когда пишешь в кеш, он не ждет, когда ты его целиком забьешь, а начинает стримить в оперативку где-то на уровне 1..4 кБ.
Был такой журнал "Программист", - там была статья по этому поводу, - автор пришел к двум выводам 1) Копировать нужно по 4 байта, начиная с адреса, кратного 16ти - оставляя начальные байты (если они будут) на последок 2) Можно использовать предвыборку данных в кэш, с помощью SSE инструкций.
Используя эти методы - автор добился ускорения от 1.8 до 3.5 (если память мне не изменяет) раз. Все остальные "типа советы" никого выигрыша в скорости memcpy не дают.
oistalker
> скорости memcpy
да да как то видел, если память не изменяет то был Крисс Касперски, но у него было копирование памяти а не заполнение. У меня этот memset на 600*600*4 занимает 6,79/8 ms.
oistalker
> ускорения от 1.8 до 3.5 (если память мне не изменяет)
всё верно, но вот только в процентах ))
помниться давно на Cyrix233 пытался разогнать копирование\очистку на mmx - так обломался :)
году в 2005\2006 на этом форуме часто пытались ускорить копирование, поищите старые темы... но насколько я помню быстрее memcpy ничего не изобрели...
oistalker
> Можно использовать предвыборку данных в кэш, с помощью SSE инструкций.
в лучшем случае догонишь memcpy
потестил
//dst и src с выравниванием по 16 байт void __forceinline __fastcall __stream_cpy(char *dst, char *src) { __asm { mov eax, [src] mov edx, [dst] _emit 0xF _emit 0x28 _emit 0x0 _emit 0xF _emit 0x2B _emit 0x2 } } void mymemset( char *p, char *val) { for ( a = 0; a < SIZE; a += 16) { __stream_cpy( p, val); p += 16; } }
вроде как быстрее обычного memset, но тут надо ещё навесить всяких IF-ов для проверки размера кратного 16 + поправку на выравнивание и прочее.
oistalker
> Можно использовать предвыборку данных в кэш, с помощью SSE инструкций.
или 3DNow! :)
.L, а у тебя адрес выравнен по 16-ти? может в шарпе выровнен и шарповская memcpy или как его там, выбирает более быстрый алгоритм из-за 16-ти кратности адреса?
Smouking
> вроде как быстрее обычного memset
На сколько процентов?
memset щас кофе попьет, вернется и всех - порвет...
OpenMP в memset? и как оно работает с небольшими данными?
Тема в архиве.