Сумма элементов матрицы по параллельной области, в результате которых на неправильные ответы на технологии OpenMP

Я делала операции в моем университете, что требует для заполнения матрицы [2000][2000] элементов, а затем вычислить сумму всех элементов, кратных 5 параллельно.

Сначала я пытался использовать матрицу 5 х 5, я сделал частичный сумма (отстойник) элементов и их я добавил Все элементы на переменную сумму в критической области.

На моем компьютере университета с частичным сумму получает трэш значений (36501) в случаях, когда значения должны быть меньше, чем 100; я отметил, что это произошло только на [0][я] (нулевая линия) матрицы.

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>

#define N 5


int main() {
    int i, j, k, l;
    int sum = 0;
    int sumP = 0;
    int A[N][N]; 
    printf("sumP : %%i\n", sumP );
    printf("sum: %%i\n", sum);
    #pragma omp parallel shared (A) private (i, j)
    {
        #pragma omp for
        for (i = 0; i < N; i++) {
            for(j = 0; j < N; j++){
            A[i][j] = i%%5;
            printf("Number: %%i, pos[%%i][%%i]\n", A[i][j], i, j);
            }
        }
    }

    #pragma omp parallel shared(A, sum) private (k, l, sumP)
    {               
        #pragma omp for
        for (k = 0; k < N; k++) {
            for (l = 0; l < N; l++){
                if (A[l][k] %% 5 == 0 && A[l][k] != 0){
                sumP = sumP + A[k][l];
                printf("numero: %%i, pos [%%i],[%%i] sumP: %%i\n", A[k][l], k, l, sumP);
                }
            }   
        }
        #pragma omp critical
        sum += sumP;

    }
        //printf("sumP: %%i\n", sumP);
        printf("sum: %%i\n", sum);

    return (0);
}

Я тестировал его объявлении стоимости поддона до 0 Между "за" statemants, и это сработало:

#pragma omp parallel shared(A, soma) private (k, l, somap2)
    {               
        #pragma omp for
        for (k = 0; k < N; k++) {
                        sumP = 0;
            for (l = 0; l < N; l++){

когда я тестировал его дома, он работал без того, чтобы объявить отстойник как 0 (на частичный сумма "отстойник"), как я сделал выше, но конечный результат складывается не правильное...

+1
2019-09-18 04:08:16
источник
3 ответа

Вот функция, чтобы проверить, если дата (или если не указано, уже сегодня) в течение первых х рабочих дней:

Function date_is_in_X_days(firstXdays As Integer, Optional dt As Date) As Boolean

    If dt = 0 Then dt = Date

    date_is_in_X_days = False

    With WorksheetFunction
        For t = 1 To firstXdays
            If dt = .WorkDay(.EoMonth(dt, -1), t) Then
                date_is_in_X_days = True
                Exit For
            End If
        Next
    End With

End Function

Чтобы проверить это:

Sub test_function()
    If date_is_in_X_days(3) Then MsgBox "1st, 2nd or 3rd day of month"
End Sub
+0
2019-09-18 06:15:17

Другой способ, используя DAY, так как @Warcupine предложил.

Public Function date_is_in_X_days(DayNumber As Long, Optional DateValue As Date) As Boolean

    If DateValue = 0 Then DateValue = Date

    date_is_in_X_days = Day(DateValue) < DayNumber 'Compare the two values which returns TRUE or FALSE

End Function

Это может быть использован в качестве:

Public Sub Test()

    Debug.Print date_is_in_X_days(4) 'False if today is >= 4th.
    Debug.Print date_is_in_X_days(2, DateValue("3-Sep-19")) 'False as 3rd is later than 2nd.
    Debug.Print date_is_in_X_days(4, DateValue("3-Sep-19")) 'True as 3rd is earlier than 4th.

End Sub  

или в виде формулы, где А1 содержит дату:

=date_is_in_X_days(5,$A$1)
+0
2019-09-18 06:15:17

Вы должны перейти к anroidx как журнал ошибок говорит. Попробуйте это.

андроид/градля.свойства

android.useAndroidX=true
android.enableJetifier=true
+3
2019-09-18 13:04:09

Посмотрите другие вопросы по меткам