मैं एक मैट्रिक्स 2 डी सरणी और समारोह प्रोटोटाइप के रूप में प्रतिनिधित्व में एक विकर्ण अंतर खोजने के लिएकैश इलाके के साथ सी फ़ंक्शन प्रदर्शन में सुधार करें?
int diagonal_diff(int x[512][512])
मैं एक 2d सरणी का उपयोग करना है, और डेटा 512x512 है। यह एक एसपीएआरसी मशीन पर परीक्षण किया जाता है: मेरा वर्तमान समय 6ms है लेकिन मुझे 2ms से कम होने की आवश्यकता है।
नमूना डेटा:
[3][4][5][9]
[2][8][9][4]
[6][9][7][3]
[5][8][8][2]
अंतर है:
|4-2| + |5-6| + |9-5| + |9-9| + |4-8| + |3-8| = 2 + 1 + 4 + 0 + 4 + 5 = 16
आदेश है कि, मैं निम्नलिखित कलन विधि का उपयोग करने के लिए:
int i,j,result=0;
for(i=0; i<4; i++)
for(j=0; j<4; j++)
result+=abs(array[i][j]-[j][i]);
return result;
लेकिन इस एल्गोरिथ्म तक पहुँचने रहता है कॉलम, पंक्ति, कॉलम, पंक्ति, आदि जो कैश का अक्षम उपयोग करते हैं।
मेरे कार्य में सुधार करने के लिए एक रास्ता है?
आप बेंचमार्क या इस प्रोफाइल किया? असली matrices कितने बड़े हैं? कोई भी 4 से 4 मैट्रिक्स कैश में फिट होगा और यह अप्रासंगिक है कि आप किस ऑर्डर को एक्सेस करते हैं। –
भले ही आप प्रति सेकंड 50,000,000 बार करते हैं, यहां तक कि एक कम अंत आधुनिक सीपीयू भी पसीना तोड़ देगा। यहां तक कि 'abs() 'पर फ़ंक्शन कॉल को अधिकांश कंपाइलर्स (जीसीसी और वीसी ++ सहित) द्वारा आंतरिक रूप से ऑप्टिमाइज़ किया जाएगा। –
सरणी का आकार 512x512 है और मुझे 2 डी सरणी का उपयोग करना होगा। इंटरफ़ेस विनिर्देशों को ठीक किया गया है, मुझे बस कार्यान्वयन.int diagonal_diff (int x [512] [512], int y [512] [512]) –