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

Как быстрее очистить большой кусок памяти? (C++) (4 стр)

Страницы: 13 4 5 69 Следующая »
#45
0:20, 16 янв 2011

OpenDX
> вероятно .L пишет программный раситеризатор =)
ну да, очередной : )

sb3d
> но тут что-то странное.
да.  я не корректно сравнил.  Дело в том, что без очистки у меня 900-1000 фпс (выполняется только SetDIBitsToDevice) но на шарпе у меня было примерно 1400 фпс, это факт.  Надо смотреть в чём дело.

По теме - много интересных методов заполнения памяти увидел, всем большое спасибо!

#46
4:08, 16 янв 2011

Pushkoff
> скорость заполнения равна 1 Гбайт/с, че там с пропускными способностями?
А, хм... Да, мало даже для первой ddr.

.L, тогда вывод прост. Что-то другое тормозит. Вывод на экран, например, ещё что-то. Собери консольный тест, одинаковый для обоих случаев.

#47
6:48, 16 янв 2011

.L
> ну да, очередной : )

Ну тагда используй аппаратный блиттинг наверно. Или у тебя даже блиттинг софтварный( как у меня =) )?

#48
13:17, 16 янв 2011

Pushkoff
>хотя буфер должен почти целиком на кеш леч...
Когда пишешь в кеш, он не ждет, когда ты его целиком забьешь, а начинает стримить в оперативку где-то на уровне 1..4 кБ.

#49
14:24, 16 янв 2011

Был такой журнал "Программист", - там была статья по этому поводу,  - автор пришел к двум выводам 1) Копировать нужно по 4 байта, начиная с адреса, кратного 16ти - оставляя начальные байты (если они будут) на последок 2) Можно использовать предвыборку данных в кэш, с помощью SSE инструкций.

Используя эти методы - автор добился ускорения от 1.8 до 3.5 (если память мне не изменяет) раз. Все остальные "типа советы" никого выигрыша в скорости memcpy не дают.

#50
14:42, 16 янв 2011

oistalker
> скорости memcpy
да да как то видел, если память не изменяет то был Крисс Касперски, но у него было копирование памяти а не заполнение. У меня этот memset на 600*600*4 занимает 6,79/8 ms.

oistalker
> ускорения от 1.8 до 3.5 (если память мне не изменяет)
всё верно, но вот только в процентах ))

#51
18:12, 16 янв 2011

помниться давно на Cyrix233 пытался разогнать копирование\очистку на mmx - так обломался :)

#52
2:06, 17 янв 2011

году в 2005\2006 на этом форуме часто пытались ускорить копирование, поищите старые темы... но насколько я помню быстрее memcpy ничего не изобрели...

#53
2:27, 17 янв 2011

oistalker
> Можно использовать предвыборку данных в кэш, с помощью SSE инструкций.
в лучшем случае догонишь memcpy

#54
4:06, 17 янв 2011

потестил

//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 + поправку на выравнивание и прочее.

#55
5:22, 17 янв 2011

oistalker
> Можно использовать предвыборку данных в кэш, с помощью SSE инструкций.
или 3DNow! :)

#56
5:29, 17 янв 2011

.L, а у тебя адрес выравнен по 16-ти? может в шарпе выровнен и шарповская memcpy или как его там, выбирает более быстрый алгоритм из-за 16-ти кратности адреса?

#57
6:00, 17 янв 2011

Smouking
> вроде как быстрее обычного memset
На сколько процентов?

#58
11:05, 17 янв 2011

memset щас кофе попьет, вернется и всех - порвет...

#59
11:27, 17 янв 2011

OpenMP в memset? и как оно работает с небольшими данными?

Страницы: 13 4 5 69 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.