الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تنفيذ البرنامج بشكل متوازي على معالجين بنفس الجهاز ارجو الافادة

بدأه aboazoz2004 في 17 مايو 2010 · 35 رد · 3,075 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ارجو مساعدتكم

عندي برنامج يوجد البرايم نمبر في مصفوفة من مليون عنصر من 1 -1000000 يقوم بايجاد الاعداد الاوليه في المصفوفة ويطبعهم

لكن اريد ان يقوم بتنفيذ البرنامج بشكل متوازي بحيث يتنفذ على حسب المعالجات على جهازك مثلا معالجين في جهازك ينفذ نصف المصفوفة على معالج والنصف الاخر على معالج اخر

ارجو مساعدتي ولك جزيل الشكر

#2

راجع هذا الدرس يفيدك ان شاء الله

دروس البرمجه بأستخدام الopenmp

tvquran_6.gif

#3

بارك الله فيك لكني لم اتخيله حتى الان لانني لست قويا في البرمجة

ارجو التعديل على هذا الكود ليشتغل على اكثر من معالج وهل هذه الخاصية موجودة في سي شارب

#include <iostream> 
using namespace std; 
int main () 
** 
int prime, range=1000; 
int n; 
for ( prime = 2; prime<=range; prime++ ) 
** 
for ( n=2; n < prime; n++ ) 


if (prime%n==0 ) 
break; 
if ( n==prime ) 
cout << prime << endl; 
} 
return 0; 
}
#4

المشرف القدير فهد

من خلال فهمي انه يوجد جزئين لتنفيذ البرنامج اما تسلسلي او جزء متوازي تحط الكود اللي تبغاه يتنفذ متوازي في الجزء المتوازي

لكن هنا انا اريد نصف المصفوفة يتنفذ على معالج والنصف الاخر على معالج اخر بنفس الجهاز وتطبع النتيجة

#5

أكثر من معالج لعملية بسيطة كهذه :huh:

هل المقصد هو تعلم الـ Multiprocessing أم تريد إنتاج الأعداد الأولية من واحد إلى كذا؟

بالمناسبة, عملية إنتاج الأعداد الأولية ليس من السهل عمل Parallelization لها.

#6

لا اريد انتاج اعداد اوليه

بل ايجاد الاعداد الاوليه في مصفوفة من مليون عنصر والمقصد هو تعليم multiprocessing

#7

ارجو المساعدة اذا تكرمتم

#8

اخي الكريم بأستخدام ال OpenMP سيسهل الامور كثيراً عليك

لانك لن تشغل نفسك بتقسيم الامور على المعلجات بل انها ستوزع العمل بتساوي على ال processors .

اليك هذا المثل يطبع الاعداد الاوليه بمصفوفه الف عنصر بحيث ان كل processor سيكون مسؤل عن مجموعه عناصر بالمصفوفه

#include<iostream>
#include <stdio.h>
#include <conio.h> 
#include <omp.h>
using namespace std;
int main()
{
	int Array[1000];
		for (int i=0;i<1000;i++)		
		Array=rand();
#pragma omp parallel
	{				
		bool IsPrime;
		#pragma omp for ordered 
		for (int i=0;i<1000;i++)
		{
			IsPrime=true;
			for(int j=2;j<=Array/2;j++)
			if(Array%j==0)
			{
				IsPrime=false;
				break;
			}
			if(IsPrime)
				printf("%d\n",Array);
		}; 
	}
	getch();
}
#9

بارك الله فيك اخي الكريم وجزيت خيرا

انا اريد ان يقوم بتقسيم نصف المصفوفة يعني من 1-500000 على معالج والباقي على معالج اخر

#10
aboazoz2004 كتب:

بارك الله فيك اخي الكريم وجزيت خيرا

انا اريد ان يقوم بتقسيم نصف المصفوفة يعني من 1-500000 على معالج والباقي على معالج اخر

لماذا تقسم ؟؟!! ال openmp تلقائياً يقسم ال for loop على عدد المعالجات بتساوي

#11

نفذت البرنامج واعطاني خطا

1> Add directive to 'stdafx.h' or rebuild precompiled header

1>.\primess.cpp(32) : fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?

1>Generating Code...

1>Build log was saved at "file://c:\Documents and Settings\usera\My Documents\Visual Studio 2008\Projects\primess\Debug\BuildLog.htm"

1>primess - 1 error(s), 4 warning(s)

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

#12
aboazoz2004 كتب:

نفذت البرنامج واعطاني خطا

1> Add directive to 'stdafx.h' or rebuild precompiled header

1>.\primess.cpp(32) : fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?

1>Generating Code...

1>Build log was saved at "file://c:\Documents and Settings\usera\My Documents\Visual Studio 2008\Projects\primess\Debug\BuildLog.htm"

1>primess - 1 error(s), 4 warning(s)

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

اخي الكريم اذا كنت قد عملت مشروع من نوع CLR Console Application فلابد من اضافه ال stdafx.h اما اذا كان المشروع فارغ من نوع win32 Console فلا تحتاج ال stdfx

يعني اول برنامجك اضف

#include"stdafx.h"
#13

بعد التعديل باقي خطا واحد

1>------ Build started: Project: prim, Configuration: Debug Win32 ------

1>Compiling...

1>q1.cpp

1>.\q1.cpp(5) : fatal error C1083: Cannot open include file: 'omp.h': No such file or directory

1>Build log was saved at "file://c:\Documents and Settings\usera\My Documents\Visual Studio 2008\Projects\prim\Debug\BuildLog.htm"

1>prim - 1 error(s), 0 warning(s)

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

انا شغال على 2008

#14
aboazoz2004 كتب:

بعد التعديل باقي خطا واحد

1>------ Build started: Project: prim, Configuration: Debug Win32 ------

1>Compiling...

1>q1.cpp

1>.\q1.cpp(5) : fatal error C1083: Cannot open include file: 'omp.h': No such file or directory

1>Build log was saved at "file://c:\Documents and Settings\usera\My Documents\Visual Studio 2008\Projects\prim\Debug\BuildLog.htm"

1>prim - 1 error(s), 0 warning(s)

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

انا شغال على 2008

قد تكون نسخدك هي Express edition ولا اعلم اذا كانت تأتتي بهذه المكتبه ولكن يمكنك البحث بالنت على هذه المكتبه.

انا اعمل على نفس الفيجيول ستديو ولكن professional Edition 

#15

نعم نسختي هي microsoft visual c++ 2008 express edition

لكن ماهي المشكلة بالضبط

#16

الا يمكن تعديل الكود وخاصة في الفور لوب بحيث يحسب الى جذر العدد وليس كل الاعداد ليوجد البرايم نمبر

#17

لماذا يظهر هذا الخطا

fatal error C1083: Cannot open include file: 'omp.h': No such file or directory

#18

من خلال البحث وجدت ان oph.m غير مشمول في النسخة التى استخدمها 2008 express

ما العمل يا احبائي

#20

الاخوة الاعزاء

تم التغيير الى النسخة المحترفه برو وتم تنفيذ الكود ولكن النتيجة خطا حيث كانت بهذا الشكل

post-30879-1274948650278_thumb.jpg

#21

ماهو الخطأ أخي الكريم, أعتقد أن الكود يعمل بشكل سليم, لأن الأعداد كلها أولية!

كل ما في الأمر هو أنك تحتاج لقراءة فصل في أحد كتب أنظمة التشغيل عن الـ Multiprocessing, لتدرك أن ما حصل هو نتيجة طبيعية لأن الـ Threads تعمل بالتوازي,

و هذا يعني أن كل thread ستطبع بالتوازي مع الآخرين. الحقيقة أن هناك خطأ ينتج عنه Race Condition في الكود الذي وضعه الأخوة, و لمن يعرفه له 1+ على طول :cool:

و لكنه ليس الخطأ المفترض الذي تتكلم عنه أخي العزيز,

#22

هل يمكن تعديل الخطا

ولماذا الاعداد مختلفة

صحيح يفترض ان تطلع الاعداد الاوليه لكن ليست بنفس الترتيب

تم تعديل هذه المشاركة بواسطة aboazoz2004 في 27 مايو 2010 في 14:07

#23
Khaled.Alshaya كتب:

ماهو الخطأ أخي الكريم, أعتقد أن الكود يعمل بشكل سليم, لأن الأعداد كلها أولية!

كل ما في الأمر هو أنك تحتاج لقراءة فصل في أحد كتب أنظمة التشغيل عن الـ Multiprocessing, لتدرك أن ما حصل هو نتيجة طبيعية لأن الـ Threads تعمل بالتوازي,

و هذا يعني أن كل thread ستطبع بالتوازي مع الآخرين. الحقيقة أن هناك خطأ ينتج عنه Race Condition في الكود الذي وضعه الأخوة, و لمن يعرفه له 1+ على طول :cool:

و لكنه ليس الخطأ المفترض الذي تتكلم عنه أخي العزيز,

يبدو انك يا اخي الكريم لا تعلم عن ال openmp لانه لا يوجد مشاكل Race Condition هنا لان كل core مسؤول عن جزء محدد من ال array فلا يوجد تداخل فيما بينهم او تشارك باي variable . ثانيا كل thread سوف يعمل على core منفصل.

#24

نعم انا لا اعلم واريد افادتك لي ولك جزيل الشكر

القصد من الكود هو كيف يشتغل ملتي بروسيسور

اريد سؤالك هل الاعداد التي طبعت اوليه ام لا

وحتى لو كان هناك عمل متوازي يفترض النتيجة لا تتغير

اين بقية الاعداد الاوليه اذن

#25
اقتباس
يبدو انك يا اخي الكريم لا تعلم عن ال openmp لانه لا يوجد مشاكل Race Condition هنا لان كل core مسؤول عن جزء محدد من ال array فلا يوجد تداخل فيما بينهم او تشارك باي variable . ثانيا كل thread سوف يعمل على core منفصل.

معك حق, أنا لا أعلم عن OpenMP, و لكن هناك Syncronization Problem في الكود الذي وضعته, لأن جميع الـ Threads التي سوف تظهر تتشارك في شيء, ماهو هذا الشي؟!

أنا أسميها Multiproblems بدلاً من Mutliprocessing

1+ لأول شخص يخبرنا :)

تحياتي...

مواضيع مشابهة