このコードの並列化に問題があります。クリティカル節を使用する必要があると思いますが、方法がわかりません...
#include <stdio.h>
#include <sys/time.h>
#define N4 5000
#define N5 5000
#define PIXMAX 10
#define NUM_THREADS 4
int i, j, k;
int histo[PIXMAX], image[N4][N5];
void calculate_histo(int *array, int matrix[N4][N5]) {
for(i=0; i<PIXMAX; i++) array[i] = 0;
#pragma omp parallel
{
int array_private[PIXMAX];
for(i=0; i<PIXMAX; i++) array_private[i] = 0;
#pragma omp for
for(i=0; i<N4; i++)
for(j=0; j<N5; j++) {
array_private[matrix[i][j]]++;
}
#pragma omp critical
{
for(i=0; i<PIXMAX; i++) {
array[i] += array_private[i];
}
}
}
}
main ()
{
omp_set_num_threads(NUM_THREADS);
for(i=0; i<N4; i++)
for(j=0; j<N5; j++)
{
if(i%3) image[i][j] = (i+j) % PIXMAX;
else image[i][j] = (i+i*j) % PIXMAX;
}
calculate_histo(histo,image);
for (k=0; k<PIXMAX; k++) printf("%9d", histo[k]);
}
実行するたびに異なる結果が得られます.5回の実行での出力:
1.- 3424378 1765911 2356499 1767451 2354765 2123619 2355686 1767270 2355937 1762464
2.- 3359050 1728213 2310171 1727858 2309947 2094584 2309402 1727705 2310021 1726228
3.- 3479377 1782549 2373773 1783920 2372319 2153420 2374614 1785481 2375290 1781468
4.- 3459613 1781119 2362956 1783067 2362662 2154083 2360726 1781994 2362982 1779394
5.- 3434711 1751408 2349619 1750327 2348681 2104916 2348510 1750427 2350599 1747760
問題が解決し、すべて正常に動作しました。助けてくれてありがとう! 私が使用する最終的なコードは次のとおりです。
グローバル変数を使用しない、matrix[i][j] の代わりに matrix[i* 5000 + j] を使用するなど、詳細についてはコメントを参照してください。
#include<stdio.h>
#include<sys/time.h>
#include<omp.h>
#define N4 5000
#define N5 5000
#define PIXMAX 10
#define NUM_THREADS 4
int histo[PIXMAX], image[N4][N5];
int i,j,k;
void calculate_histo(int *array, int matrix[N4][N5]) {
for(i=0; i<PIXMAX; i++) array[i] = 0;
#pragma omp parallel private(i,j)
{
int array_private[PIXMAX];
for(i=0; i<PIXMAX; i++)
array_private[i] = 0;
#pragma omp for
for(i=0; i<N4; i++)
for( j=0; j<N5; j++) {
array_private[matrix[i][j]]++;
}
#pragma omp critical
{
for( i=0; i<PIXMAX; i++) {
array[i] += array_private[i];
}
}
}
}
int main () {
omp_set_num_threads(NUM_THREADS);
for( i=0; i<N4; i++)
for( j=0; j<N5; j++) {
if(i%3)
image[i][j] = (i+j) % PIXMAX;
else
image[i][j] = (i+i*j) % PIXMAX;
}
for ( k=0; k<PIXMAX; k++)
printf("%9d", histo[k]);
printf("\n");
calculate_histo(histo,image);
for ( k=0; k<PIXMAX; k++)
printf("%9d", histo[k]);
printf("\n");
return 0;
}