Paralléliser imbriqués pour la boucle avec openMP

Je suis en train d'optimiser le imbriqués pour la boucle dans la fonction generate_histogram() ci-dessous avec openMP. J'ai essayé beaucoup avec les différentes combinaisons de pragmas fondée sur ce que j'ai lu dans cela SE post.

Le problème est que le imbriqués pour la boucle effectue plus rapidement sans openMP qu'avec openMP!

Si j'essaie de paralléliser mon code avec réduction de la place de la atomique pragma, je me retrouve avec netchunk échoue. Quelqu'un sait d'une fantaisie tweak pour ce que c'est? Je suis en train de données d'emplacement dans un histogramme. Ainsi, le histogramme est de taille variable dans le code réel, contrairement à l'extrait ci-dessous.

#include<stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define float_t float
#include <time.h>
#include <omp.h>
float_t generate_histogram(float_t **matrix, int *histogram, int mat_size, int hist_size)
{
int i,j,k,count;
float_t max = 0.;
float_t sum;
//set histogram to zero everywhere
for(i = 0; i < hist_size; i++)
histogram[i] = 0;
//matrix computations
#pragma omp parallel for private(i) shared(histogram,j,k,max) schedule(dynamic)
//#pragma omp parallel for schedule(runtime)
for (i = 1; i < (mat_size-1); i++)
{
#pragma omp parallel for private(j,k) shared(histogram,max) schedule(dynamic)
//pragma omp prallel for schedule(dynamic)
for(j = 1; j < (mat_size-1); j++)
{
//assign current matrix[i][j] to element in order to reduce memory access
sum = fabs(matrix[i][j]-matrix[i-1][j]) + fabs(matrix[i][j] - matrix[i+1][j])
+ fabs(matrix[i][j]-matrix[i][j-1]) + fabs(matrix[i][j] - matrix[i][j+1]);
//compute index of histogram bin
k = (int)(sum * (float)mat_size);
#pragma omp atomic
histogram[k] += 1;
//keep track of largest element
if(sum > max)
max = sum;
}//end inner for
}//end outer for
return max;
}
main()
{
int i,j,N,boxes;
N = 10000;
float_t **matrix;
int* histogram;
boxes = N / 2;
//allocate a matrix with some numbers
matrix = calloc(N, sizeof(float_t **));
for(i = 0; i < N; i++)
matrix[i] = calloc(N, sizeof(float_t *));
for(i = 0; i < N; i++)
for(j = 0; j < N; j++)
matrix[i][j] = 1./(float_t) N * (float_t) i;
histogram = malloc(boxes * sizeof(int));
generate_histogram(matrix, histogram, N, boxes);
}
Qu'entendez-vous par double? Je ne peux pas vous saisir but.
J'ai édité. Désolé, c'était totalement flou. Mieux maintenant?

OriginalL'auteur seb | 2013-05-25