2013-06-18 1 views
0

J'ai un simple code Fortran qui effectuent la multiplication de matrices et il est parallélisée avec OpenMP comme celui-cimorceau OpenMP et la taille du cache

!$OMP PARALLEL DO PRIVATE(...) SHARED(...) SCHEDULE(STATIC,N/128) 

Pour la taille du morceau relativement grand et le nombre de morceaux multiples de nombre de processeurs (4 , 8,16, etc.)

Cependant, lorsque la taille de la matrice devient très importante, il semble plus logique de définir une taille de segment plus petite que la taille du cache (au moins, cela vaut la peine d'essayer). Existe-t-il un moyen simple d'écrire un code portable qui prenne en compte la taille du cache du processeur? Ou ce n'est pas supporté par OpenMP?

+0

Je vous suggère de mettre en place un petit test au début de votre programme. Il exécutera une version réduite de votre tâche pour plusieurs tailles de blocs et déterminera la taille optimale en fonction de l'heure de l'horloge. –

Répondre

1

Cela dépend vraiment de votre algorithme et de votre problème. Je vous suggère de rechercher des algorithmes en mosaïque et de boucler des mosaïques que vous configurez vous-même pour avoir la bonne taille. J'utilise quelque chose comme ça pour les calculs de pochoir de différence finie:

!$omp do 
    do bk = 1,nz,tilenz 
    do bj = 1,ny,tileny 
    do bi = 1,nx,tilenx 
     do k = bk,min(bk+tilenz-1,nz) 
     do j = bj,min(bj+tileny-1,ny) 
     do i = bi,min(bi+tilenx-1,nx) 
      do something with array element A(i,j,k) and its neighbours 

tilenx, tileny et tilenz sont les x, y et z dimensions de la tuile.

Il existe des moyens plus avancés d'organiser le calcul dans la littérature.

+0

Je voudrais vraiment jouer avec différentes tailles de carreaux. Le problème, cependant, c'est que des benchmarks je sais que la bande passante de mémoire est le goulot d'étranglement de l'algorithme et pour jouer avec des nombres je dois prendre en compte la taille et la disposition du cache de processeur. Ce que je ne sais pas faire de manière portable. – Misha

+0

Mais c'est exactement ce que vous faites pour les problèmes de bande passante mémoire limitée! Le but du pavage est de concentrer votre fil sur une petite partie de la mémoire à la fois - la tuile - qui rentre dans le cache. –

+0

Pour le problème de bande passante mémoire, vous cassez la mémoire continue en morceaux aussi petits que possible? Tu fais vraiment ça? – Misha

Questions connexes