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

Поиск:

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


Бывалый
*


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

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



Реализация в VS 2010 на ASM. Влезьте внутрь, все увидите.
PM MAIL   Вверх
volatile
Дата 6.9.2011, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Estranged @  6.9.2011,  14:56 Найти цитируемый пост)
Влезьте внутрь, все увидите. 

Estranged, куда влезать то? В бинарник? Дык там конечно асмовые инструкции.
Просто приведите исходник, все исходники CRT идут со студией.

2010 студии под рукой нет, просто интуитивно, не думаю что в 2010 стали переписывать стандартные библиотеки на асме, времена не те...
PM MAIL   Вверх
voral
Дата 6.9.2011, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вон, что гугл наше на микрософтовом сайте http://research.microsoft.com/en-us/um/red...rt/memcpy.c.htm
Правда есть и такое C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\intel\memcpy.asm

Это сообщение отредактировал(а) voral - 6.9.2011, 16:22
PM MAIL WWW   Вверх
Silent
Дата 6.9.2011, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А ведь есть еще великий и могучий SSE - никто не пользовался MOVDQA (sse2) или MOVNTDQA (sse4)?
PM MAIL   Вверх
boostcoder
Дата 6.9.2011, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



вот: http://stackoverflow.com/questions/269408/...4-bit-processes
говорят что 2Гб/сек smile 
PM WWW   Вверх
volatile
Дата 6.9.2011, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(voral @  6.9.2011,  16:20 Найти цитируемый пост)
Правда есть и такое C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\intel\memcpy.asm

Да действительно, асмовая версия тоже есть.
Видимо подставляются разные в зависимости от способа вызова (intrinsic/ not intrinsic), и от ключей оптимизации.

Добавлено через 5 минут и 48 секунд
Цитата(Silent @  6.9.2011,  21:07 Найти цитируемый пост)
А ведь есть еще великий и могучий SSE 

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

PM MAIL   Вверх
ForceKeeper
Дата 6.9.2011, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Насчет ассемблера, открыл в Олли откомпиленый под релизом экзеншник, зашел в memcpy и вот, какой цикл там нашел
Код

MOVDQA XMM0,DQWORD PTR DS:[ESI]
MOVDQA XMM1,DQWORD PTR DS:[ESI+10]
MOVDQA XMM2,DQWORD PTR DS:[ESI+20]
MOVDQA XMM3,DQWORD PTR DS:[ESI+30]
MOVDQA DQWORD PTR DS:[EDI],XMM0
MOVDQA DQWORD PTR DS:[EDI+10],XMM1
MOVDQA DQWORD PTR DS:[EDI+20],XMM2
MOVDQA DQWORD PTR DS:[EDI+30],XMM3
MOVDQA XMM4,DQWORD PTR DS:[ESI+40]
MOVDQA XMM5,DQWORD PTR DS:[ESI+50]
MOVDQA XMM6,DQWORD PTR DS:[ESI+60]
MOVDQA XMM7,DQWORD PTR DS:[ESI+70]
MOVDQA DQWORD PTR DS:[EDI+40],XMM4
MOVDQA DQWORD PTR DS:[EDI+50],XMM5
MOVDQA DQWORD PTR DS:[EDI+60],XMM6
MOVDQA DQWORD PTR DS:[EDI+70],XMM7
LEA ESI,[ESI+80]
LEA EDI,[EDI+80]
DEC EDX
JNE SHORT 72980A72
 
P.S.
Цитата
(игрушку делал)

Та же история)

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


pattern`щик
****


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

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



Цитата(ForceKeeper @  6.9.2011,  23:37 Найти цитируемый пост)
и вот, какой цикл там нашел

значит с этим все в порядке.


ForceKeeper, покажи этот же асм-код но только с адресами.

Цитата(volatile @  6.9.2011,  23:28 Найти цитируемый пост)
(чуть ли не в разы)

повторюсь. я тоже копал в этом направлении. но оказалось, что стандартная функция работает быстрее всех реализаций использующих MMX/3DNow которые я нашел. я показал почему ;)

Добавлено через 5 минут и 21 секунду
только что обратил внимание на такой момент.
MMX регистров восемь.
но оба кода(последний и тот что я приводил из исходников linux-kernel) работают следующим образом:
1. из источника копируется в 4 регистра.
2. из этих регистров в приемник.
3. из источника копируется в остальные 4 регистра.
4. из них в приемник.

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


Эксперт
****


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

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



Цитата(ForceKeeper @  6.9.2011,  23:37 Найти цитируемый пост)
зашел в memcpy и вот, какой цикл там нашел

ForceKeeper, ну раз так, то это в очередной раз показывает, что погоду в скорости копирования вносит не столько сам код, сколько попадания/промахи кеша. (верней разных кешей).
У вас ведь этот код работал медленней вашей самодельной, насколько я понял?
PM MAIL   Вверх
boostcoder
Дата 7.9.2011, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(volatile @  7.9.2011,  00:09 Найти цитируемый пост)
У вас ведь этот код работал медленней вашей самодельной, насколько я понял?

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


Бывалый
*


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

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



Кстати  у Страуструпа есть примерно следующая реализация копирования массива. Реально дает прирост по отношению к простому поэлементному копированию. (обсуждали както на киберфоруме)
Код

void mcpy (int *to, int *from, int count)
{
  int n = (count + 7) / 8;
  swith (count % 8)
  {
    case 0: do { *to++ = *from++;
    case 7:      *to++ = *from++;
    case 6:      *to++ = *from++;
    case 5:      *to++ = *from++;
    case 4:      *to++ = *from++;
    case 3:      *to++ = *from++;
    case 2:      *to++ = *from++;
    case 1:      *to++ = *from++;
            } while (--n > 0);
  }
}

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


Эксперт
****


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

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



Цитата(boostcoder @  7.9.2011,  00:13 Найти цитируемый пост)
запутался 

Ну он говорил, что системная работает медленней (почти в 2 раза) чем самодельная (с шортами)
Цитата(Silent @  6.9.2011,  09:38 Найти цитируемый пост)
Time1: 79
Tim2: 46


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


Новичок



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

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



Цитата(boostcoder @  7.9.2011,  00:00 Найти цитируемый пост)
покажи этот же асм-код но только с адресами

Адреса команд этого кода в памяти?
Код

72980A72  |  MOVDQA XMM0,DQWORD PTR DS:[ESI]
72980A76  |  MOVDQA XMM1,DQWORD PTR DS:[ESI+10]
72980A7B  |  MOVDQA XMM2,DQWORD PTR DS:[ESI+20]
72980A80  |  MOVDQA XMM3,DQWORD PTR DS:[ESI+30]
72980A85  |  MOVDQA DQWORD PTR DS:[EDI],XMM0
72980A89  |  MOVDQA DQWORD PTR DS:[EDI+10],XMM1
72980A8E  |  MOVDQA DQWORD PTR DS:[EDI+20],XMM2
72980A93  |  MOVDQA DQWORD PTR DS:[EDI+30],XMM3
72980A98  |  MOVDQA XMM4,DQWORD PTR DS:[ESI+40]
72980A9D  |  MOVDQA XMM5,DQWORD PTR DS:[ESI+50]
72980AA2  |  MOVDQA XMM6,DQWORD PTR DS:[ESI+60]
72980AA7  |  MOVDQA XMM7,DQWORD PTR DS:[ESI+70]
72980AAC  |  MOVDQA DQWORD PTR DS:[EDI+40],XMM4
72980AB1  |  MOVDQA DQWORD PTR DS:[EDI+50],XMM5
72980AB6  |  MOVDQA DQWORD PTR DS:[EDI+60],XMM6
72980ABB  |  MOVDQA DQWORD PTR DS:[EDI+70],XMM7
72980AC0  |  LEA ESI,[ESI+80]
72980AC6  |  LEA EDI,[EDI+80]
72980ACC  |  DEC EDX
72980ACD  |  JNE SHORT 72980A72


Цитата(volatile @  7.9.2011,  00:09 Найти цитируемый пост)
У вас ведь этот код работал медленней вашей самодельной, насколько я понял?

Код в моих последних двух постах из родного memcpy и он работал многократно быстрее, чем мой примитивный тапок, копирующий по словам.
PM MAIL WWW   Вверх
boostcoder
Дата 7.9.2011, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(ForceKeeper @  7.9.2011,  00:24 Найти цитируемый пост)
Адреса команд этого кода в памяти?

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


Эксперт
****


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

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



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


А это кто писал, или это было не из родного memcpy ?
Цитата(Silent @ 6.9.2011,  09:38)
Решил проверить, делая ставку на стандартную memcpy:
Код

#include <stdio.h>
#include <memory.h>
#include <Windows.h>
const int N = 70000000;

short mas[N];
short mas2[N];
short * dest = (short*)&mas,
      * source = (short*)&mas2;

void copy1()
{
    memcpy(dest,source,N*sizeof(short));
}

void copy2()
{
    for (int i = 0; i < N; i++)
        dest[i] = source[i];
}

int main()
{
    for (int i = 0; i < N; i++) source[i] = i+1;
    int time = GetTickCount();
    copy1();
    int end = GetTickCount();
    copy2();
    int end2 = GetTickCount();
    printf("Time1: %d\nTime2: %d\n",end-time,end2-end);
    return 0;
}


Результат неожиданный: 
Код

Time1: 79
Tim2: 46


Конфигурация - VS2010, WinXP SP3, i3, 2Gb. Проверил на VS2008 - результат аналогичный.



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

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

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

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

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


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

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


 




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


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

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