«cygwin_exception :: open_stackdumpfile error» во время выполнения кода openmp - PullRequest
0 голосов
/ 25 июня 2019

Я получил следующую ошибку и трассировку стека во время выполнения прикрепленного кода OpenMP.

Exception: STATUS_STACK_OVERFLOW at rip=00100401966
rax=00000000014EB6A0 rbx=00000000FFFFCC50 rcx=00000000FFE03C00
rdx=00000000FFFFCC50 rsi=000000018027FB40 rdi=00000000FFFFCC7A
r8 =00000006000280A0 r9 =0000000000000000 r10=0000000000000040
r11=0000000000000000 r12=0000000180248C20 r13=00000000FFFFCC7B
r14=0000000000000000 r15=00000000FFFFCC7B
rbp=00000000FFFFCCD0 rsp=00000000FFFFCBE8
program=some_dir...\example.exe, pid 134, thread 
cs=0033 ds=002B es=002B fs=0053 gs=002B ss=002B

0 [] example 134 cygwin_exception::open_stackdumpfile: Dumping stack trace to example.exe.stackdump

Stack trace:
Frame        Function    Args
000FFFFCCD0  00100401966 (0010040108B, 000FFFFCCD0, 0018004A816, 000FFFFCC7B)
000FFFFCCD0  000016E36A0 (000FFFFCCD0, 0018004A816, 000FFFFCC7B, 00000000020)
000FFFFCCD0  00000000001 (0018004A816, 000FFFFCC7B, 00000000020, FF0700010302FF00)
000FFFFCCD0  0010040108B (00000000020, FF0700010302FF00, 0018004A7AA, 00000000000)
000FFFFCCD0  0018004A816 (00000000000, 00000000000, 00000000000, 00000000000)
00000000000  00180048353 (00000000000, 00000000000, 00000000000, 00000000000)
000FFFFFFF0  00180048404 (00000000000, 00000000000, 00000000000, 00000000000)
End of stack trace

Я не думаю, что есть проблемы с компилятором, так как компилятор работает нормально без OpenMP.Я искал на онлайн-форумах, где у большинства из них были проблемы с динамическим размещением, которые не помогли мне.

Я знаю, что это грязный код, но я считаю, что эта ошибка связана с объявлением,процессоров. Line 16: omp_set_num_threads(); может выдавать ошибки.Опять же, это некоторые идеи с моим ограниченным опытом.Любая помощь будет принята с благодарностью.

#include<stdio.h>
#include<complex.h>
#include<stdlib.h>
#include<math.h>
#include<omp.h>
#include<string.h>

# define n 1000

int main(){


    printf("\n Start of the program\n");
    //printf("\nA random number %f", rand());

    omp_set_num_threads(16);
    int max;

    int k;
    double M[n][n], L[n][n], temp, A[n][n];

    printf("\n1.\n");
    //Generating a random 'n x n' matrix
    for (int i = 0; i<n; i++)
        for(int j = 0; j<n; j++){
            A[i][j] = 1 / (2*(n - i+1 - j+1 + 1.5));
        }   


    double start_time = omp_get_wtime();

    for (k = 0; k < n-1; k++) {
        #pragma omp parallel
        {
            int i;
            temp = 0.0;

            //Finding max in 'k' column
            #pragma omp for schedule(auto) private(i)
                for (i = k; i < n; i++) {
                    if (A[i][k] > temp) {
                        #pragma omp critical
                            temp = A[i][k];
                            max = i;
                        }
                    }
            #pragma omp barrier


            //Swapping A matrix
            #pragma omp for schedule(auto) private(temp)
                for (int i = 0; i < n; i++) {
                    temp = A[k][i];
                    A[k][i] = A[max][i];
                    A[max][i] = temp;
                }
            #pragma omp barrier
        }

            /* Swapping B matrix
            temp = B[k];
            B[k] = B[max];
            B[max] = temp;*/

            #pragma omp parallel
            {
                int i, j, m;
                temp = 0.0;
                if (k == 0)
                {
                    #pragma omp for schedule(auto) private(i,j)
                    for (i = 0; i < n; i++)
                        for (j = 0; j < n; j++) {
                            if (i == j)
                                L[i][j] = 1.0;
                            else
                                L[i][j] = 0.0;
                        }
                #pragma omp barrier
                }

                //Creating and updating Multipliers, M
                #pragma omp for schedule(auto) private(i,j)
                    for (i = k+1; i < n; i++){
                        M[i][k] = A[i][k] / A[k][k];
                    }
                #pragma omp barrier

                //Updating A matrix
                #pragma omp for schedule(auto) private(i,j)
                    for (i = k + 1; i<n; i++)
                        for (j = k; j<n; j++){
                            A[i][j] = A[i][j] - M[i][k] * A[k][j];
                        }
                #pragma omp barrier

                //Updating L matrix
                #pragma omp for schedule(auto) private(i,j)
                    for (i = k+1;i<n; i++)
                        for (j = k; j<n; j++){
                            L[i][j] = L[i][j] + M[i][k] * L[k][j];
                        }
                #pragma omp barrier

                /* Updating B matrix
                #pragma omp for schedule(auto) private(i)
                    for (i = k+1; i<row; i++) {
                        B[i] = B[i] - M[i][k] * B[k];
                    }
                #pragma omp barrier*/  
            }

    }


    printf("\n\nExecution time: %.9f\n", omp_get_wtime() - start_time);


    return 0;
}

1 Ответ

0 голосов
/ 26 июня 2019

Проблема в Exception: STATUS_STACK_OVERFLOW at rip=00100401966.

Возможно, виновник double M[1000][1000], L[1000][1000], temp, A[1000][1000].

Вопрос «почему?».

В: Какую версию компилятора / компилятора вы используете?Какая версия OpenMP?

ВОЗМОЖНЫЕ РАБОТЫ:

В: Что произойдет, если вы уменьшите значение до omp_set_num_threads(8)?

В: Что произойдет, если вы снизитесь до #define n 250?

В: Что произойдет, если вы выделите свои массивы с помощью malloc () вместо их объявления в стеке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...