نقل قول نوشته شده توسط دانشجوmf مشاهده تاپیک
سلام من این کد به C++‎‎‎‎‎‎‎‎‎‎‎‎ رو دارم و می خوام با openmp موازی اش کنم (کد مرتب سازی درختی هست) ولی متاسفانه طبق قانون موازی سازی بعد از اجرای موازی کاملا اعداد به هم ریخته نشون میده میشه راهنمایی کنید
#include "pch.h"
#include <iostream>
#include<string.h>
#include<new>
#include<omp.h>
#include<stdC++‎‎‎‎‎‎‎‎‎‎‎‎.h >

using namespace std;
struct Node
{
int key;
struct Node *left, *right;
};

struct Node *left, *right;
struct Node *newNode(int item)
{
struct Node *temp = new Node;
temp->key = item;
temp->left = temp->right = NULL;
return temp;

}
void storesorted(Node *root, int arr[], int &i)
{
if (root != NULL)
{
storesorted(root->left, arr, i);
arr[i++] = root->key;
storesorted(root->right, arr, i);
}
}
Node* insert(Node* node, int key)
{
if (node == NULL)return newNode(key);
if (key < node->key)
node->left = insert(node->left, key);
else if (key > node->key)
node->right = insert(node->right, key);
return node;

}
void treeSort(int arr[], int n)
{
struct Node *root = NULL;
root = insert(root, arr[0]);
for (int i = 1; i < n; i++)
insert(root, arr[i]);
int i = 0;
storesorted(root, arr, i);

}

int main()
{



//create input array
int arr[] = { 5, 4, 7, 2, 11 };
int n = sizeof(arr) / sizeof(arr[0]);

treeSort(arr, n);

#pragma omp parallel
{

int n = omp_get_num_threads();

for (int i = 0; i < n; i++)
cout << arr[i] << " ";

}

return 0;








}



این نمایش کامپیوتر قبل از موازی سازی هستش




و این هم بعد از نوشتن همون خط openmp
خوب این که طبیعی شما تعداد نخ های فعال تو ناحیه موازی سازی را به عنوان رفرنس تکرار حلقه استفاده کردید


int n = omp_get_num_threads();
این یعنی به تعداد تمام نخ هایی که ناحیه موازی سازی ایجاد کرده حلقه شما اجرا میشه و هرکدوم از نخ ها دارند حلقه خودشون را اجرا میکنن که همین باعث تکراری شدن مقادیر آرایه میشه! کلا مبحث موازی سازی را اشتباه برداشت کردید.
زمانی هم که از ناحیه موازی سازی استفاده نمیکنید هم که کاملا مشخص که باید درست باشه چون توی یک نخ هست و تعداد تکرار حلقه هم براساس تعداد آرایه ها می باشد.
تکنیک های موازی سازی که نکات data collision , race condition و... را رعایت نکرده باشند نه تنها موازی سازی معنی نداره بلکه باعث تولید خروجی های اشتباه هم می شود.