У меня есть функция, компьютер_а. Я хочу распараллелить этот код в OpenMP, но я не знаю, что не так с кодом. Когда итерации циклов увеличиваются с помощью изменения нижней / верхней границ циклов, что-то пошло не так без ошибок!
Я хочу распараллелить один цикл a, b, c или d. Я думаю, что лучшим будет цикл а. Пожалуйста, поправьте меня, если я ошибаюсь.
Не могли бы вы рассказать мне об ошибках, которые я допустил в коде?
void compute_a(int al, int au, int bl, int bu, int cl, int cu, int dl, int du, float *var, float *cv, float *sdi, float *sdeg, int *cc)
{
#pragma omp parallel for
for(int a=al; a<=au; a++)
{
int up[n][5];
int down[n][5];
int up_i=0;
int down_i=0;
for(int b=bl; b<=bu; b++)
{
for(int c=cl; c<=cu; c++)
{
for(int d=dl; d<=du; d++)
{
float result[n];
for(int i=0; i<n; i++)
{
result[i]=a*(1-var[i])+b*(1-cv[i])+c*sdi[i]+d*sdeg[i];
}
int ccc[n]
for(int kk=0; kk<n; kk++)
ccc[kk]=cc[kk];
quickSortd2(result, ccc, 0, n-1);
int count_of_ones=0;
for(int ii=0; ii<1000; ii++)
if(ccc[ii]==1)
count_of_ones++;
if(count_of_ones>150)
{
up[up_i][0]=a;
up[up_i][1]=b;
up[up_i][2]=c;
up[up_i][3]=d;
up[up_i++][4]=count_of_ones;
}
else if(count_of_ones<121)
{
down[down_i][0]=a;
down[down_i][1]=b;
down[down_i][2]=c;
down[down_i][3]=d;
down[down_i++][4]=count_of_ones;
}
}
}
}
FILE *fpup;
FILE *fpdown;
char* path_up_p1="ResultUp150forA (";
char* path_up_p2=").csv";
char* path_down_p1="ResultDn121forA (";
char* path_down_p2=").csv";
char *path_up;
char *path_down;
char str_file_number[5];
itoa(a, str_file_number, 10);
path_up=(char*)malloc(strlen(path_up_p1)+strlen(str_file_number)+strlen(path_up_p2)+1);
path_up[0]='\0';
strcat(path_up,path_up_p1);
strcat(path_up,str_file_number);
strcat(path_up,path_up_p2);
fpup=fopen(path_up, "w");
for(int t=0; t<up_i; t++)
fprintf(fpup, "%d,%d,%d,%d,%d\n", up[t][0], up[t][1], up[t][2], up[t][3], up[t][4]);
fclose(fpup);
path_down=(char*)malloc(strlen(path_down_p1)+strlen(str_file_number)+strlen(path_down_p2)+1);
path_down[0]='\0';
strcat(path_down,path_down_p1);
strcat(path_down,str_file_number);
strcat(path_down,path_down_p2);
fpdown=fopen(path_down, "w");
for(int t=0; t<up_i; t++)
fprintf(fpdown, "%d,%d,%d,%d,%d\n", down[t][0], down[t][1], down[t][2], down[t][3], down[t][4]);
fclose(fpdown);
}
}