On Friday 30 August 2002 10:36, Marc SCHAEFER wrote:

> PS: pour revenir à l'idée de division entière et de modulo, il ne faut pas
>     oublier que beaucoup de processeurs ont une opération de division qui
>     fait les deux à la fois.

Et le résultat se trouve dans deux registres séparés ? 

>  Je l'ai utilisé une fois pour gagner un
>     temps précieux pour du RAID0 à multiple de 3 disques dans un
>     contrôleur hard, avec distribution par secteur (chunk_size = 1
>     secteur). (la division pour connaître le numéro physique du secteur,
>     le modulo pour connaître le numéro du disque physique).

(Ce qui suit n'est pas une réponse destinée à Marc, mais une explication 
complémetaire d'une technique souvent ignorée mais très pratique)

Oui, très pratique pour "packer" des valeurs dans un mot de N bits :-) Mais, 
en l'absence de preuves formelles, je pense que l'opération qui consiste à 
faire un décalage de 8 bits (shift) devrait être traduite par une seule 
instruction CPU effectuée en un seul cycle. Alors que la division est plus 
coûteuse; à moins que le compilateur détecte que la constant utilisée est une 
puissance de deux et ne le transforme en équivalent "shift". Certains CPU ont 
un instruction de division sur des entiers mais je doute que ce soit plus 
rapide qu'un "shift". Dans le cas qui nous intéresse, le modulo se résume à 
masquer les bits de poid fort. On peut donc écrire (pour deux valeurs de 16 
bits à stoker dans un mot de 32 bits)

unsigned int Source;
...
Source = SectorNumber * 65536 + DiskNumber;     /* (65536 == 2^16) */
...
DiskNumber = Source & (65536 -1 );      /* bits 0-15 */
SectorNumber = Source >> 16;            /* bits 16-31 */

Mais cela est nettement moins lisible (sans doute plus lent) que :

DiskNumber = Source % 65536;
SectorNumber = Source / 65536;

Daniel



--
http://www-internal.alphanet.ch/linux-leman/ avant de poser
une question. Ouais, pour se désabonner aussi.

Répondre à