का उपयोग करके विशाल सी सरणी के साथ स्पीड समस्या मुझे बफर (लगभग 20gig) में बड़ी मात्रा में डेटा पढ़ने की आवश्यकता है। मेरे पास 1 9 2 जीबी बहुत तेज डीडीआरएम उपलब्ध है, इसलिए स्मृति आकार के साथ कोई समस्या नहीं है। हालांकि, मुझे लगता है कि निम्न कोड धीमा और धीमा चलता है और आगे बफर में आता है। विजुअल सी प्रोफाइलर मुझे बताता है कि 12 मिनट के निष्पादन समय का 68% myFunc() में लूप के अंदर 2 बयानों में है। मैं 2 सीपीयू, 6 भौतिक कोर प्रत्येक (24 लॉजिकल कोर) के साथ बहुत तेज डेल पर 647, 64 बिट चला रहा हूं, और इसे चलाने के दौरान सभी 24 कोर पूरी तरह से अधिकतम हो गए हैं।64 बिट विज़ुअल सी
#define TREAM_COUNT 9000
#define ARRAY_SIZE ONE_BILLION
#define offSet(a,b,c,d) (((size_t) ARRAY_SIZE * (a)) + ((size_t) TREAM_COUNT * 800 * (b)) + ((size_t) 800 * (c)) + (d))
void myFunc(int dogex, int ptxIndex, int xtreamIndex, int carIndex)
{
short *ptx = (short *) calloc(ARRAY_SIZE * 20, sizeof(short));
#pragma omp parallel for
for (int bIndex = 0; bIndex < 800; ++bIndex)
doWork(dogex, ptxIndex, carIndex);
}
void doWork(int dogex, int ptxIndex, int carIndex)
{
for (int treamIndex = 0; treamIndex < ONE_BILLION; ++treamIndex)
{
short ptxValue = ptx[ offSet(dogex, ptxIndex, treamIndex, carIndex) ];
short lastPtxValue = ptx[ offSet(dogex, ptxIndex-1, treamIndex, carIndex) ];
// ....
}
}
आप गुणाओं से छुटकारा पाने के द्वारा कोड को अनुकूलित कर सकते हैं (या तो स्थानांतरित या जोड़कर)। लेकिन फिर भी वह लूप की धीमी गति से आपकी समस्या को हल नहीं कर सकता है। – thumbmunkeys
आप लूप में ptxValue और lastPtxValue क्यों निर्दिष्ट कर रहे हैं? दोनों असाइनमेंट लूपिंग से स्वतंत्र प्रतीत होते हैं। – ArjunShankar
मेरी माफ़ी ... कोड को सरल बनाने की कोशिश में, मुझे यह गलत मिला (संपादित संस्करण ऊपर है)। 'फॉर' लूप के अंदर एक बदलती हुई कीमत है, यही कारण है कि कैल्क्स को बार-बार किया जाना चाहिए। – PaeneInsula