2013-06-13 4 views
-2

je le code suivantoptimiser le code en courant alternatif sur la boucle imbriquée

for(i=0;i<16;i++) 
    for(j=0;j<16;j++) 
    { 
    in=(i+u*j+rl+rc)&15; 
    jn=(v*i+(u*v+1)*j+rc)&15; 
    x1[i*16+j]=x2[in*16+jn]; 
    } 

des notes:

  1. rl, rc, u et v sont des valeurs Randome vont de 0 à 15
  2. x1 et x2 sont des tableaux de 256 valeurs, la plage de chaque valeur de tableau est comprise entre 0 et 255
  3. si je veux mettre en œuvre ce code en utilisant la table de consultation est nécessaire 16MB et cette grande mémoire
+1

Quelle est la question ici? – fayyazkl

+2

Travail à domicile? Si non, ne vous embêtez pas - un compilateur moderne le comprendra. Gardez le code lisible jusqu'à ce que vous le profilez lorsque vous avez du temps libre ou des problèmes de performance suspects. C'est ce qu'on appelle le code source parce que les humains le lisent. – amn

+2

Pourquoi fermer? Je pense que c'est une question valable, pas très bien posée. Je pense qu'il y a une marge d'optimisation ici. Une combinaison de LUT et de mathématiques plus intelligentes. Je n'ai pas encore trouvé la solution. – detunized

Répondre

2

Une certaine idée, vous pouvez essayer:

Vous pouvez construire une table de consultation pour toutes les combinaisons de u et v, qui nécessiteraient que 64k de mémoire. rl et rc fonctionnent comme des décalages constants horizontalement et verticalement (ils peuvent être déplacés à la dernière instruction et ne doivent pas participer au calcul de in et jn). Cela réduirait la quantité de maths que vous avez à faire.

Comme avec toutes les autres optimisations de performances, vous devez d'abord voir si c'est vraiment le goulot d'étranglement. Il se pourrait que la mémoire soit beaucoup plus lente et que l'introduction d'une grande table de consultation ne ferait que ralentir les choses.

4

Voici une idée:

Essayez d'extraire des parties du calcul qui ne changent pas à l'extérieur au moins l'intérieur boucle. Par exemple, i + rl + rc du calcul in n'a pas besoin d'être à l'intérieur de la boucle. Une fois que vous avez cela, vous réalisez que la valeur de in augmente de u à chaque itération, modulo 16 bien sûr. Donc, au lieu de faire une multiplication, vous pouvez faire une addition.

Le calcul jn a aussi quelques citations à extraire. Bien sûr, cela suppose que vous sachiez qu'il s'agit d'un goulot d'étranglement au niveau des performances (profile it!) Et que le compilateur n'est pas assez intelligent pour effectuer une telle optimisation. En cas de doute, inspectez l'ensemble.

+1

Je suis sûr que le compilateur ferait cela pour vous. – detunized

+2

Il pourrait - ou il pourrait ne pas. J'ai été tenté de dire que ce serait le cas, mais il semble que l'affiche fonctionne dans un système embarqué, et je ne crois pas les compilateurs pour ceux-ci. –

+0

Je suis à peu près sûr que même un compilateur pour les microcontrôleurs les plus bas de gamme fera cette optimisation. Le résultat de 'i + rl + rc' sera temporairement placé dans un registre ou sur la pile. Mais bien sûr, c'est encore un autre exemple de pourquoi _it n'a pas de sens pour optimiser manuellement le code sans rien savoir sur le matériel prévu. – Lundin