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); }