__restrict
От: Шахтер Интернет  
Дата: 10.10.05 16:04
Оценка:
Майкрософт вводит в C++ ключевое слово __restrict (аналог restrict из С99).
То о чем так долго говорили большевики наконец-то свершилось.
Больше не нужно будет копировать массивы PODов memcpy явно.
Пример.

template <class T>
void Copy(T *__restrict dst,const T *__restrict src,size_t N)
 {
  for(; N ;N--,dst++,src++) *dst=*src;
 }
 
void IntCopy(int *__restrict dst,const int *__restrict src,size_t N) 
 {
  Copy(dst,src,N);
 }
 
struct Test
 {
  int x;
  int y;
  int z;
 }; 

void TestCopy(Test *__restrict dst,const Test *__restrict src,size_t N) 
 {
  Copy(dst,src,N);
 }


Разворачивается это как и должно в memcpy.


??$Copy@H@@YAXPIAHPIBHI@Z PROC                ; Copy<int>, COMDAT

; 51   :   for(; N ;N--,dst++,src++) *dst=*src;

    mov    ecx, DWORD PTR _N$[esp-4]
    test    ecx, ecx
    je    SHORT $LN3@Copy
    push    esi
    mov    esi, DWORD PTR _src$[esp]
    push    edi
    mov    edi, DWORD PTR _dst$[esp+4]
    rep movsd
    pop    edi
    pop    esi
$LN3@Copy:

; 52   :  }

    ret    0
??$Copy@H@@YAXPIAHPIBHI@Z ENDP                ; Copy<int>



??$Copy@UTest@@@@YAXPIAUTest@@PIBU0@I@Z PROC        ; Copy<Test>, COMDAT

; 51   :   for(; N ;N--,dst++,src++) *dst=*src;

    mov    eax, DWORD PTR _N$[esp-4]
    test    eax, eax
    je    SHORT $LN3@Copy@2
    push    esi
    mov    esi, DWORD PTR _src$[esp]
    lea    ecx, DWORD PTR [eax+eax*2]
    add    ecx, ecx
    push    edi
    mov    edi, DWORD PTR _dst$[esp+4]
    add    ecx, ecx
    shr    ecx, 2
    rep movsd
    pop    edi
    pop    esi
$LN3@Copy@2:

; 52   :  }

    ret    0
??$Copy@UTest@@@@YAXPIAUTest@@PIBU0@I@Z ENDP        ; Copy<Test>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re: __restrict
От: MaximE Великобритания  
Дата: 11.10.05 09:19
Оценка:
On Mon, 10 Oct 2005 20:04:51 +0400, Шахтер <23118@users.rsdn.ru> wrote:

> Майкрософт вводит в C++ ключевое слово __restrict (аналог restrict из С99).

> То о чем так долго говорили большевики наконец-то свершилось.
> Больше не нужно будет копировать массивы PODов memcpy явно.
> Пример.

[]

Не факт, что rep movsd быстрее чем обычный цикл:

.L10:
    mov    %eax, DWORD PTR [%edx]
    mov    DWORD PTR [%ecx], %eax
    add    %ecx, 4
    add    %edx, 4
    inc    %ebx
    cmp    %edi, %ebx
    jne    .L10


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[2]: __restrict
От: Шахтер Интернет  
Дата: 11.10.05 11:23
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>On Mon, 10 Oct 2005 20:04:51 +0400, Шахтер <23118@users.rsdn.ru> wrote:


>> Майкрософт вводит в C++ ключевое слово __restrict (аналог restrict из С99).

>> То о чем так долго говорили большевики наконец-то свершилось.
>> Больше не нужно будет копировать массивы PODов memcpy явно.
>> Пример.

ME>[]


ME>Не факт, что rep movsd быстрее чем обычный цикл:


ME>
ME>.L10:
ME>    mov    %eax, DWORD PTR [%edx]
ME>    mov    DWORD PTR [%ecx], %eax
ME>    add    %ecx, 4
ME>    add    %edx, 4
ME>    inc    %ebx
ME>    cmp    %edi, %ebx
ME>    jne    .L10
ME>


ME>--

ME>Maxim Yegorushkin

Это уже фича оптимизатора -- в Майкрософт считают, что memcpy надо инлайнить в rep movsd. Наверно, у них есть для этого какие-то основания.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[2]: __restrict
От: gear nuke  
Дата: 11.10.05 13:41
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Не факт, что rep movsd быстрее чем обычный цикл:


ME>
ME>.L10:
ME>    mov    %eax, DWORD PTR [%edx]
ME>    mov    DWORD PTR [%ecx], %eax
ME>    add    %ecx, 4
ME>    add    %edx, 4
ME>    inc    %ebx
ME>    cmp    %edi, %ebx
ME>    jne    .L10

Для P4 — факт, там аппаратно ускорено. Для других процессоров здесь (подобные алгоритмы применяются в некоторых быстрых библиотечных memcpy, например в intel C++).
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: __restrict
От: Аноним  
Дата: 11.10.05 15:14
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>Майкрософт вводит в C++ ключевое слово __restrict (аналог restrict из С99).

Ш>То о чем так долго говорили большевики наконец-то свершилось.
Ш>Больше не нужно будет копировать массивы PODов memcpy явно.

MS предложило это в качестве дополнения в стандарт или исключительно свои компиляторы оснастит этой фичей?
Re[2]: __restrict
От: Шахтер Интернет  
Дата: 12.10.05 09:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Шахтер, Вы писали:


Ш>>Майкрософт вводит в C++ ключевое слово __restrict (аналог restrict из С99).

Ш>>То о чем так долго говорили большевики наконец-то свершилось.
Ш>>Больше не нужно будет копировать массивы PODов memcpy явно.

А>MS предложило это в качестве дополнения в стандарт или исключительно свои компиляторы оснастит этой фичей?


Нет, это расширения языка, включённое в Майкрософтовский компилятор. Но я думаю, поскольку restrict уже включен в C99, в C++ он тоже должен появиться.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.