MartinB
2014-05-19, 14:25:45
Ich versuche folgenden C Code, welcher zwei for-Schleifen enthaelt zu parallelisieren. Dies ist bereits getan, indem jede Zeile von einem Thread abgearbeitet wird.
#pragma omp parallel for private(nx, pos2,dy,dx,rlen,pos,xdiff,ydiff,zdiff,vmag,t) reduction (+:pe) shared(n,fx,fy,fz) schedule(static,chunks) num_threads(threads)
for (ny=0;ny<n;ny++){
for (nx=0;nx<n;nx++){
//loop over displacements
for (dy=MAX(ny-delta,0);dy<MIN(ny+delta+1,n);dy++){
for (dx=MAX(nx-delta,0);dx<MIN(nx+delta+1,n);dx++){
// CODE
}
}
}
}
MAX und MIN sind macros die verhindern dass ich an den Grenzen aus dem Array springe.
Das funktioniert auch wunderbar. Nun wuerde ich aber gerne anstatt einer zeilenweise Abarbeitung, das ganze gerne in Bloecke aufteilen. Angenommen n ist 4 und ich habe 4 Threads, dann soll jeder Thread Bloecke der Groesse 2*2 bearbeiten, bei n=16 und 4 Threads, 8*8 Bloecke, usw.
Nur komme ich nicht auf die Loesung.
#pragma omp parallel for private(nx, pos2,dy,dx,rlen,pos,xdiff,ydiff,zdiff,vmag,t) reduction (+:pe) shared(n,fx,fy,fz) schedule(static,chunks) num_threads(threads)
for (ny=0;ny<n;ny++){
for (nx=0;nx<n;nx++){
//loop over displacements
for (dy=MAX(ny-delta,0);dy<MIN(ny+delta+1,n);dy++){
for (dx=MAX(nx-delta,0);dx<MIN(nx+delta+1,n);dx++){
// CODE
}
}
}
}
MAX und MIN sind macros die verhindern dass ich an den Grenzen aus dem Array springe.
Das funktioniert auch wunderbar. Nun wuerde ich aber gerne anstatt einer zeilenweise Abarbeitung, das ganze gerne in Bloecke aufteilen. Angenommen n ist 4 und ich habe 4 Threads, dann soll jeder Thread Bloecke der Groesse 2*2 bearbeiten, bei n=16 und 4 Threads, 8*8 Bloecke, usw.
Nur komme ich nicht auf die Loesung.