Durch Compiler-pragmas kann die Parallelisierung durch den Programmierer noch zusätzlich untersützt werden. Diese Anweisungen müssen direkt vor derjenigen Schleife stehen, auf die sie angewendet werden sollen. (Die Ausnahme davon: #pragma no concurrentize und #pragma concurrentize wirken entweder auf das gesamte file oder eine Funktion)
void sub1(int n) {
int i;
extern int a[], b[];
for(i=0; i<n; i++) {
a[b[i]] = i;
}
#pragma permutation (b)
for(i=0; i<n; i++) {
a[b[i]] = i;
}
}
#pragma permutation (array_name) wirkt sich auf alle Schleifen in
einer Funktion aus. Im obiogen Beispiel also auch auf die erste
for-Schleife.
Diese Direktive wird dazu verwendet, dass Arrays indirekt adressiert werden
können.
#include <stdio.h>
#define SIZE 4
int main() {
int i, j, k;
float matrix1[SIZE][SIZE], matrix2[SIZE][SIZE], result[SIZE][SIZE];
#pragma prefer concurrent
for (i=0; i<SIZE; i++) {
matrix1[i][j] = i;
matrix2[i][j] = j;
result[i][j] = 0;
}
printf("matrix1:\n");
for (i=0; i<SIZE; i++) {
for (j=0; j<SIZE; j++)
printf("%f ", matrix1[i][j]);
printf("\n");
}
printf("matrix2:\n");
for (i=0; i<SIZE; i++) {
for (j=0; j<SIZE; j++)
printf("%f ", matrix2[i][j]);
printf("\n");
}
#pragma prefer concurrent
for (i=0; i<SIZE; i++)
for (j=0; j<SIZE; j++)
for (k=0; k<SIZE; k++)
result[i][j] += matrix1[k][j] * matrix2[i][k];
printf("result:\n");
for (i=0; i<SIZE; i++) {
for (j=0; j<SIZE; j++)
printf("%f ", result[i][j]);
printf("\n");
}
return(0);
}