یک برنامه چند داده (SPMD) در علم رایانش یکی از تکنیکهایی است که برای دستیابی به رایانش موازی از آن استفاده میشود. این روش زیر مجموعه روش چند دستور چند داده (MIMD)است. در این روش، کارها تقسیم شده و به صورت موازی در چندین پردازنده با ورودیهای موازی برای دستیابی به نتیجه سریعتر اجرا میگردند. تکنیک SPMD متداولترین روش در پردازش موازی میباشد. این روش همچنین پیشنیاز مفاهیم تحقیقاتی نظیر پیام فعال و حافظه توزیعی به اشتراک گذاشته شده میباشد.
تکنیک SPMD معمولاً به روش انتقال پیامهای برنامه در یک معماری کامپیوتر با استفاده از حافظه توزیع شده اطلاق میشود، یک کامپیوتر با معماری توزیع شده از تعدادی کامپیوتر مستقل تشکیل شده که هر یک از آنها را گره (Node) مینامیم. هر گره برنامه خود را آغاز میکند و از طریق ارسال و دریافت پیام با دیگر گرهها ارتباط برقرار مینماید. با استفاده از فراخوانیهای ارسال/دریافت. امکان پیادهسازی دستوراتی نظیر عدم امکان همگام سازی (Barrier Synchronization) نیز با پیامها وجود دارد. این پیامها با روشهای انتقال اطلاعات مختلف مانند TCP/IP بر روی اترنت و یا روشهای اختصاصی بسیار پرسرعت مانند Myrinet و اتصالات داخلی ابر کامپیوترها قابل پیادهسازی هستند. بخش Serial برنامه از طریق محاسبهگر کاملاً مشابه در تمامی گرهها پیادهسازی شده است و عملاً از روشهایی نظیر محاسبه نتیجه در یک گره و ارسال نتیجه به گرههای دیگر استفاده نمیکند.
در یک ماشین با حافظه اشتراکی، میتوان به یک پیام با ارسال مجدد محتویات آن در یک فضای آدرس اشتراکی دسترسی پیدا نمود. این روش معمولاً بهینهترین روش در برنامهریزی کامپیوترهای با فضای آدرس اشتراکی و تعداد پردازنده بالا میباشد. بخصوص در ماشینهای NUMA که حافظه متعلق به هر پردازنده است و دسترسی به حافظه دیگر پردازندهها به زمان بیشتری نیاز دارد. تکنیک SPMD در ماشینهای حافظه اشتراکی معمولاً بوسیله پروسههای استاندارد بسیار سنگین پیادهسازی میگردد.
بر خلاف SPMD، چندپردازنده با حافظه اشتراکی که به آن چند پردازنده موازی (SMP) نیز اطلاق میگردد، به برنامه نویس امکان استفاده از یک فضای حافظه اشتراکی را میدهد که در آن پروسهها موازی در پردازندههای مختلف و مسیر مجزا اجرا میگردند. برنامه در یک پردازنده شروع میشود و اجرای آن به نواحی موزای تقسیم میگردد که در زمان شروع دستورالعملهای موازی اجرا میشوند. در نواحی موازی، پردازندهها یک برنامه را با دادههای مختلف اجرا مینمایند. یک مثال عمومی، حلقه Do .... Loop میباشد، که در آن پردازندههای مختلف مشغول اجرای بخشهای مختلف آرایههای درون حلقه را بر عهده دارند. در پایان حلقه، نتایج سنکرون میشوند در این زمان تنها یک پردازنده مشغول است و دیگر پردازندهها در حالت انتظار میباشند. رابط استاندارد فعلی برای جندپردازندهای با حافظه مشترک OpenMP نامیده میشود و معمولاً با استفاده از پردازههای غیر پیجیدهای به نام نخ (threads) پیادهسازی میشوند.
کامپیوترهای کنونی امکان ترکیب بسیاری از قوانین و حالتهای موازی را برای دستیابی به حداکثر میزان بهرهوری به برنامهنویس میدهند. یک برنامه توزیع شده حافظه که از MPI استفاده میکند میتواند روی تعداد بسیار زیادی از گرهها اجرا گردد، هر گره میتواند یک کامپیوتر با حافظه اشتراکی باشد و به صورت موازی در چندین پردازنده توسط OpenMP اجرا شود. درون هر پردازنده، دستور العملهای برداری SIMD (معمولا به صورت اتوماتیک توسط کامپایلر اجرا میشوند) و دستورالعملهای Superscalar (که معمولاً توسط CPU به صورت مستقل اجرا میگردند) مانند Pipelining و استفاده از چندین واحد عملیاتی مجزای موازی برای دستیابی به حداکثر سرعت در هر پردازنده استفاده میشوند.
تکنیک SPMD ابتدا در سال ۱۹۸۳ توسط Michel Auguin و Francois Larbey در کامپیوتر موازی OPSILA استفاده شده و سپس در سال ۱۹۸۴ توسط Frederica Darema در IBM برای ماشینهای فوق موازی نظیر RP3 استفاده گردید. بر اساس یکی از مستندات غیر انتشار یافته IBM در دهه ۱۹۸۰ از روشهای غیر استاندارد بسیاری برای انتقال پیامها یاد شده است ولی اولین روش استاندارد SPMD روش PVM بوده است. استاندارد غالب امروز روش MPI میباشد.
تکنیک موازی سازی Cray نسل قبلی روش OpenMP میباشد.