با توجه به اینکه نسخه 2010 ویژوال استودیو C++ از کتابخانه OpenMP نسخه 2.0 فقط خارجی ترین حلقه رو می تونه موازی کنه. ولی یه راه هست.
***(در نسخه 3.0 و بعد تر با اضافه کردن عبارت colaps(i) به عبارت pragma omp for می شه عمق موازی سازی رو مشخص کرد. بجای i باید عدد بذاریم مثلا 3. یعنی تا عمق 3 حلقه های تو در تو رو موازی اجرا کنه)****
طریقه ایجاد حلقه تو در تو در OpenMP نسخه 2.0 (از نسخه 3.0 به بعد حلقه های تو در تو پشتیبانی می شن.)
یک راه جالب توی کتاب OpenMP پیدا کردم دوتا حلقه تو در تو رو می شه به یکی از این دو شیوه موازی کرد نمی دونم حلقه سوم رو هم با همین شیوه می شه موازی کرد یا نه اما همینم غنیمته.
شیوه اول:
#pragma omp parallel default (shared)
{
#pragma omp for
for(i=0;i<n;i++)
{
#pragma omp parallel shared(i,n)
{
#pragma omp for
for(j=0;j<n;j++)
work(i,j);
}
}
}
شیوه دوم:
#pragma omp parallel default (shared)
{
#pragma omp for
for(i=0;i<n;i++)
work1(i,n);
}
void work1(int 1, int n)
{
int j;
#pragma omp for
for(j=0;j<n;j++)
work2(i,j);
}
راه اندازی openMP رو در ویژوال استودیو C++ 2010 از این لینک ببینید