• # Parce qu'il n'y a pas que Linux / i386 dans la vie...

    Posté par (site web personnel) . En réponse au message Performances de memcpy ???. Évalué à 4.

    Pour apporter quelques points de données supplémentaires, des tests sur d'autres systèmes que les tiens. Sur Linux-sparc64 pas très jeune (machine multi-utilisateurs, avec 512Mo de RAM dont 300 sont réellement utilisés). On constate les mêmes choses :
    fperrin@gadget:~/mbw$ ./mbw 10|grep AVG
    AVG Method: MEMCPY Elapsed: 0.14899 MiB: 10.00000 Copy: 67.116 MiB/s
    AVG Method: DUMB Elapsed: 0.07369 MiB: 10.00000 Copy: 135.695 MiB/s
    AVG Method: MCBLOCK Elapsed: 0.07356 MiB: 10.00000 Copy: 135.940 MiB/s
    Sur FreeBSD (7.2, sur i386) :
    papillon:~% tar -xf mbw-1.1-1.tar.gz
    papillon:~% cd mbw
    papillon:~/mbw% make mbw
    cc -O -Wall -g mbw.c -o mbw
    mbw.c: In function 'worker':
    mbw.c:102: warning: implicit declaration of function 'mempcpy'
    mbw.c:102: warning: incompatible implicit declaration of built-in function 'mempcpy'
    mbw.c:105: warning: incompatible implicit declaration of built-in function 'mempcpy'
    /var/tmp//ccz83HJk.o(.text+0x1f5): In function `worker':
    /home/fred/mbw/mbw.c:102: undefined reference to `mempcpy'
    /var/tmp//ccz83HJk.o(.text+0x247):/home/fred/mbw/mbw.c:105: undefined reference to `mempcpy'
    *** Error code 1
    Stop in /usr/home/fred/mbw.
    zsh: exit 1 make mbw
    papillon:~/mbw% vi mbw.c
    # remplacer mempcpy avec un no-op...
    papillon:~/mbw% make mbw
    cc -O -Wall -g mbw.c -o mbw
    mbw.c: In function 'worker':
    mbw.c:89: warning: unused variable 'c'
    papillon:~/mbw% ./mbw 100 | grep AVG
    AVG Method: MEMCPY Elapsed: 0.17829 MiB: 100.00000 Copy: 560.894 MiB/s
    AVG Method: DUMB Elapsed: 0.14917 MiB: 100.00000 Copy: 670.365 MiB/s
    AVG Method: MCBLOCK Elapsed: 0.00000 MiB: 100.00000 Copy: 62500000.000 MiB/s
    papillon:~/mbw% ./mbw 200 | grep AVG
    AVG Method: MEMCPY Elapsed: 0.33782 MiB: 200.00000 Copy: 592.032 MiB/s
    AVG Method: DUMB Elapsed: 0.28624 MiB: 200.00000 Copy: 698.709 MiB/s
    AVG Method: MCBLOCK Elapsed: 0.00000 MiB: 200.00000 Copy: 133333333.333 MiB/s
    # en enlevant -g
    papillon:~/mbw% gcc -O -Wall mbw.c -o mbw
    mbw.c: In function 'worker':
    mbw.c:89: warning: unused variable 'c'
    papillon:~/mbw% ./mbw 100|grep AVG
    AVG Method: MEMCPY Elapsed: 0.17197 MiB: 100.00000 Copy: 581.484 MiB/s
    AVG Method: DUMB Elapsed: 0.14150 MiB: 100.00000 Copy: 706.733 MiB/s
    AVG Method: MCBLOCK Elapsed: 0.00000 MiB: 100.00000 Copy: 62500000.000 MiB/s
    # avec -O3
    papillon:~/mbw% gcc -O3 -Wall mbw.c -o mbw
    mbw.c: In function 'worker':
    mbw.c:89: warning: unused variable 'c'
    papillon:~/mbw% ./mbw 100|grep AVG
    AVG Method: MEMCPY Elapsed: 0.15598 MiB: 100.00000 Copy: 641.096 MiB/s
    AVG Method: DUMB Elapsed: 0.14457 MiB: 100.00000 Copy: 691.689 MiB/s
    AVG Method: MCBLOCK Elapsed: 0.00000 MiB: 100.00000 Copy: 62500000.000 MiB/s
    Donc : les GNUism, c'est pas génial ; il y a d'autres OS sous lesquels memcpy n'est pas si mauvais que ça ; il faudrait tester wmemcpy ; -O3 semble profiter plus à memcpy qu'à la copie manuelle.