Как я могу распараллелить этот код, используя OpenMP? - PullRequest
0 голосов
/ 10 января 2019

У меня есть функция, компьютер_а. Я хочу распараллелить этот код в 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);
    }
}
...