Сумма элементов матрицы по параллельной области, в результате которых на неправильные ответы на технологии 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 (на частичный сумма "отстойник"), как я сделал выше, но конечный результат складывается не правильное...
Вот функция, чтобы проверить, если дата (или если не указано, уже сегодня) в течение первых х рабочих дней:
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
Другой способ, используя 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)
Вы должны перейти к anroidx как журнал ошибок говорит. Попробуйте это.
андроид/градля.свойства
android.useAndroidX=true
android.enableJetifier=true
Посмотрите другие вопросы по меткам c gcc parallel-processing openmp