रोकता मैं OpenMP के लिए नया हूँ और मैं OpenMP का उपयोग कर निम्न कोड paralelize कोशिश कर रहा हूँ:OpenMP paralelization vectorization
#pragma omp parallel for
for(int k=0;k<m;k++)
{
for(int j=n-1;j>=0;j--)
{
outX[k+j*m] = inB2[j+n * k]/inA2[j*n + j];
for(int i=0;i<j;i++)
{
inB2[k*n+i] -= inA2[i+n * j] * outX[k + m*j];
}
}
}
Paralelize बाहरी चक्र बहुत सीधी-सपाट है, लेकिन यह अनुकूलन करने के लिए, मैं paralelize करना चाहता था आंतरिक-चक्र (मैं एक पर पुनरावृत्ति) भी। लेकिन जब मैं ऐसा करने के लिए इस तरह का प्रयास करें:
#pragma omp parallel for
for(int i=0;i<j;i++)
{
inB2[k*n+i] -= inA2[i+n * j] * outX[k + m*j];
}
संकलक आंतरिक चक्र ("पाश संभव अलियासिंग की वजह से vectorization के लिए संस्करणीकृत") है, जो यह धीमी चलाने बनाता vectorize नहीं है। मैंने इसे gcc -ffast-math -std=c++11 -fopenmp -O3 -msse2 -funroll-loops -g -fopt-info-vec prog.cpp
किसी भी सलाह के लिए धन्यवाद का उपयोग करके संकलित किया!
संपादित करें: मैं सरणी के लिए __restrict कीवर्ड का उपयोग कर रहा हूं।
EDIT2: दिलचस्प बात यह है कि जब मैं आंतरिक चक्र में केवल प्रगति रखता हूं और इसे बाहरी से हटा देता हूं, तो जीसीसी इसे सदिश बना देगा। तो समस्या केवल तभी होती है जब मैं दोनों चक्रों को paralelize करने की कोशिश करता हूं।
EDIT3: जब मैं सिमड के लिए #pragma omp समानांतर का उपयोग करता हूं तो संकलक लूप को सदिशित करेगा। लेकिन यह अभी भी आंतरिक लूप को समानांतर किए बिना धीमा है।
समांतरता से मैन्युअल रूप से सदिश बनाना आसान है। ऐसा क्यों न करें? (और स्वचालित समांतरता रखें) –