Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> memcpy, реализация под VS (2010) 
:(
    Опции темы
boostcoder
Дата 7.9.2011, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(volatile @  7.9.2011,  00:09 Найти цитируемый пост)
погоду в скорости копирования вносит не столько сам код, сколько попадания/промахи кеша. (верней разных кешей).

поясни. откуда такие выводы?
PM WWW   Вверх
volatile
Дата 7.9.2011, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(boostcoder @  7.9.2011,  00:33 Найти цитируемый пост)
поясни. откуда такие выводы? 

Почитайте последний пост на первой странице. От простой перестановки вызовов функций, скорость меняется в 3 раза.

Впрочем, возможно скоро займусь этим вопросом поближе, и сам все тщательно проверю.
О результатах сообщу, если будет интересно.

PM MAIL   Вверх
boostcoder
Дата 7.9.2011, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(volatile @  7.9.2011,  00:40 Найти цитируемый пост)
Почитайте последний пост на первой странице.

тот пост подтверждает пользу привносимую кешированием самой ОС. но никак не кешем проца. ибо я понял что ты говоришь про именно про него.
PM WWW   Вверх
ForceKeeper
Дата 7.9.2011, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.3.2010
Где: Минск

Репутация: нет
Всего: нет



Цитата(volatile @  7.9.2011,  00:33 Найти цитируемый пост)
А это кто писал, или это было не из родного memcpy ?

Это был не я. 

Кстате, вот касательно выделения памяти. Когда ковырял свой тестирующий код и поменял местами выполнение своего цикла и родного memcpy так, чтобы дефолтная функция шла первой, так ее отработка стала медленнее (но все равно быстрее моего цикла). После этого я прямо перед ней кинул цикл, в котором пробегал весь массив и кидал туда числа - скорость отработки memcpy стала преждней (т.е. быстрой)
Код

int* mas = new int[1000000];

for(int i = 0; i < 1000000; ++i)
    mas[i] = i;

LARGE_INTEGER beforeMemcpy, afterMemcpy;
QueryPerformanceCounter(&beforeMemcpy);
TestMemcpy(mas);
QueryPerformanceCounter(&afterMemcpy);

LARGE_INTEGER beforeMemcpy_my, afterMemcpy_my;
QueryPerformanceCounter(&beforeMemcpy_my);
TestMemcpy_MY(mas);
QueryPerformanceCounter(&afterMemcpy_my);

delete[] mas;


Почему неинициализированный мусор медленнее копируется?

P.S.
Пока писал пост, тут уже успели упомянуть кэш операционки...

Это сообщение отредактировал(а) ForceKeeper - 7.9.2011, 01:01
PM MAIL WWW   Вверх
volatile
Дата 7.9.2011, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(ForceKeeper @  7.9.2011,  00:56 Найти цитируемый пост)
Это был не я. 

ForceKeeper, упс, сорри. спутал вас. действительно сорри!! 

Цитата(boostcoder @  7.9.2011,  00:49 Найти цитируемый пост)
тот пост подтверждает пользу привносимую кешированием самой ОС. но никак не кешем проца. ибо я понял что ты говоришь про именно про него. 

Я вообще говорю о разных кешах. И о том что правильно измерить скорость очень трудно.
Сам не раз убеждался что от простой перестановки функций, скорость может меняться в 3-4 раза.
Поэтому судить о скорости по единичному измерениию не стоит.

ForceKeeper, еще раз сорри!
PM MAIL   Вверх
boostcoder
Дата 7.9.2011, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(ForceKeeper @  7.9.2011,  00:56 Найти цитируемый пост)
Почему неинициализированный мусор медленнее копируется?

уже ответил.

Цитата(volatile @  7.9.2011,  01:09 Найти цитируемый пост)
Я вообще говорю о разных кешах.

ты знаешь...из последних нескольких постов, сложно понять о каком кеше ты говоришь smile 
PM WWW   Вверх
volatile
Дата 7.9.2011, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(boostcoder @  7.9.2011,  01:19 Найти цитируемый пост)
сложно понять о каком кеше ты говоришь   

я говорю просто о других (кроме кода) причинах (и кеши в том числе) влияющих на скорость.

PM MAIL   Вверх
xvr
Дата 8.9.2011, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(boostcoder @  7.9.2011,  00:00 Найти цитируемый пост)
а почему не сразу из источника в 8 регистров? 

Видимо что бы не забить каналы чтения в память. Их ограниченное число и если запустить чтений больше, чем каналов, то те команды, на которые не хватило каналов, будут остановлены.

PM MAIL   Вверх
boostcoder
Дата 8.9.2011, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(xvr @  8.9.2011,  12:26 Найти цитируемый пост)
если запустить чтений больше, чем каналов, то те команды, на которые не хватило каналов, будут остановлены

не знал о таком. точнее - не задумывался.
PM WWW   Вверх
ForceKeeper
Дата 8.9.2011, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.3.2010
Где: Минск

Репутация: нет
Всего: нет



В итоге я наковырял такую функцию, она хоть и значительно быстрее простого цикла, но все равно на ПК медленнее где-то на 30-40%, а на нетбуке на 50-70% чем memcpy из VS2010
Код

static void TestMemcpy_sse(void* pDest, void* pSrc, int numOfBytes)
{
    if(numOfBytes < CACHE_LINE_SIZE)
    {
        _asm
        {
            mov    ecx, numOfBytes
            mov edi, pDest
            mov esi, pSrc
            rep movsb
        }
        return;
    }
    int destOffset = (int)pDest % 16;
    if(destOffset > 0)
    {
        _asm
        {
            mov    ecx, destOffset
            mov    edi, numOfBytes
            sub edi, ecx
            mov numOfBytes, edi
            mov    edi, pDest
            mov    esi, pSrc
            rep    movsb
            add    edi, destOffset
            add    esi, destOffset
            mov    pDest, edi
            mov    pSrc, esi
        }
    }
    if((int)pSrc % 16 == 0)
    {
        _asm
        {
            mov esi, pSrc
            prefetchnta [esi]
            mov ecx, numOfBytes
            mov edi, pDest

            cmp ecx, 128
            jb A64
A128:
            prefetchnta XMMWORD PTR[esi + 16 * 4]
            movdqa xmm0, XMMWORD PTR[esi]
            movdqa xmm1, XMMWORD PTR[esi + 16 * 1]
            movdqa xmm2, XMMWORD PTR[esi + 16 * 2]
            movdqa xmm3, XMMWORD PTR[esi + 16 * 3]
            movdqa XMMWORD PTR[edi], xmm0
            movdqa XMMWORD PTR[edi + 16 * 1], xmm1
            movdqa XMMWORD PTR[edi + 16 * 2], xmm2
            movdqa XMMWORD PTR[edi + 16 * 3], xmm3

            prefetchnta XMMWORD PTR[esi + 16 * 8]
            movdqa xmm4, XMMWORD PTR[esi + 16 * 4]
            movdqa xmm5, XMMWORD PTR[esi + 16 * 5]
            movdqa xmm6, XMMWORD PTR[esi + 16 * 6]
            movdqa xmm7, XMMWORD PTR[esi + 16 * 7]
            movdqa XMMWORD PTR[edi + 16 * 4], xmm4
            movdqa XMMWORD PTR[edi + 16 * 5], xmm5
            movdqa XMMWORD PTR[edi + 16 * 6], xmm6
            movdqa XMMWORD PTR[edi + 16 * 7], xmm7

            add esi, 128
            prefetchnta [esi]
            add edi, 128
            sub ecx, 128
            cmp ecx, 128
            jae A128
A64:
            cmp ecx, 64
            jb  A32
            prefetchnta XMMWORD PTR[esi]
            sub ecx, 64

            movdqa xmm0, XMMWORD PTR[esi]
            movdqa xmm1, XMMWORD PTR[esi + 16 * 1]
            movdqa xmm2, XMMWORD PTR[esi + 16 * 2]
            movdqa xmm3, XMMWORD PTR[esi + 16 * 3]
            movdqa XMMWORD PTR[edi], xmm0
            movdqa XMMWORD PTR[edi + 16 * 1], xmm1
            movdqa XMMWORD PTR[edi + 16 * 2], xmm2
            movdqa XMMWORD PTR[edi + 16 * 3], xmm3

            add esi, 64
            add edi, 64
A32:
            prefetchnta XMMWORD PTR[esi]
            cmp ecx, 32
            jb  A16
            sub ecx, 32

            movdqa xmm4, XMMWORD PTR[esi]
            movdqa xmm5, XMMWORD PTR[esi + 16 * 1]
            movdqa XMMWORD PTR[edi], xmm4
            movdqa XMMWORD PTR[edi + 16 * 1], xmm5

            add esi, 32
            add edi, 32
A16:
            cmp ecx, 16
            jb  A
            sub ecx, 16
            movdqa xmm6, XMMWORD PTR[esi]
            movdqa XMMWORD PTR[edi], xmm6
A:
            sfence
        }
    }
    else
    {
        _asm
        {
            mov ecx, numOfBytes
            mov esi, pSrc
            prefetchnta [esi]
            mov edi, pDest

            cmp ecx, 128
            jb U64
U128:
            prefetchnta XMMWORD PTR[esi + 16 * 4]
            movdqu xmm0, XMMWORD PTR[esi]
            movdqu xmm1, XMMWORD PTR[esi + 16 * 1]
            movdqu xmm2, XMMWORD PTR[esi + 16 * 2]
            movdqu xmm3, XMMWORD PTR[esi + 16 * 3]
            movdqu XMMWORD PTR[edi], xmm0
            movdqu XMMWORD PTR[edi + 16 * 1], xmm1
            movdqu XMMWORD PTR[edi + 16 * 2], xmm2
            movdqu XMMWORD PTR[edi + 16 * 3], xmm3

            prefetchnta XMMWORD PTR[esi + 16 * 8]
            movdqu xmm4, XMMWORD PTR[esi + 16 * 4]
            movdqu xmm5, XMMWORD PTR[esi + 16 * 5]
            movdqu xmm6, XMMWORD PTR[esi + 16 * 6]
            movdqu xmm7, XMMWORD PTR[esi + 16 * 7]
            movdqu XMMWORD PTR[edi + 16 * 4], xmm4
            movdqu XMMWORD PTR[edi + 16 * 5], xmm5
            movdqu XMMWORD PTR[edi + 16 * 6], xmm6
            movdqu XMMWORD PTR[edi + 16 * 7], xmm7

            add esi, 128
            prefetchnta [esi]
            add edi, 128
            sub ecx, 128
            cmp ecx, 128
            jae U128
U64:
            cmp ecx, 64
            jb  U32
            prefetchnta XMMWORD PTR[esi]
            sub ecx, 64

            movdqu xmm0, XMMWORD PTR[esi]
            movdqu xmm1, XMMWORD PTR[esi + 16 * 1]
            movdqu xmm2, XMMWORD PTR[esi + 16 * 2]
            movdqu xmm3, XMMWORD PTR[esi + 16 * 3]
            movdqu XMMWORD PTR[edi], xmm0
            movdqu XMMWORD PTR[edi + 16 * 1], xmm1
            movdqu XMMWORD PTR[edi + 16 * 2], xmm2
            movdqu XMMWORD PTR[edi + 16 * 3], xmm3
 
            add esi, 64
            add edi, 64
U32:
            prefetchnta XMMWORD PTR[esi]
            cmp ecx, 32
            jb  U16
            sub ecx, 32

            movdqu xmm4, XMMWORD PTR[esi]
            movdqu xmm5, XMMWORD PTR[esi + 16 * 1]
            movdqu XMMWORD PTR[edi], xmm4
            movdqu XMMWORD PTR[edi + 16 * 1], xmm5

            add esi, 32
            add edi, 32
U16:
            cmp ecx, 16
            jb  U
            sub ecx, 16

            movdqu xmm6, XMMWORD PTR[esi]
            movdqu XMMWORD PTR[edi], xmm6
U:
            sfence
        }
    }
    int residue = numOfBytes % 16;
    if(residue > 0)
    {
        _asm
        {
            mov ecx, residue
            mov ebx, numOfBytes
            mov edi, pDest
            add edi, ebx
            sub edi, ecx
            mov esi, pSrc
            add esi, ebx
            sub esi, ecx
            rep movsb
        }
    }

    return;
}

PM MAIL WWW   Вверх
boostcoder
Дата 8.9.2011, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



фигасе функция smile 
PM WWW   Вверх
ForceKeeper
Дата 8.9.2011, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.3.2010
Где: Минск

Репутация: нет
Всего: нет



Основной цикл копирования моей функции в результирующем бинарнике идентичен тому, что в мемцпу (равзе что у меня счетчик в ecx, а в родной функции в edx) Но ощутимое отстование в скорости все равно есть, хотя во всем остальном коде есть еще только 3 цикла и то, они каждый на 64, 16 и 16 соотвественно итераций макисмум.

P.S.
наверно родная функция еще что-то делает с данными, т.к. при увеличение объема копируемой информации разрыв в скорости растет, а основной цикл копирования идентичен, в то время как весь окруающий его код в моей функции можно принять сложность за константу

Это сообщение отредактировал(а) ForceKeeper - 8.9.2011, 22:45
PM MAIL WWW   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1212 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.