में अजीब प्रदर्शन मेरे पास सी ++ में लिखा गया यह लूप है, जिसे MSVC2010 के साथ संकलित करने में काफी समय लगता है। (300 मि.से)सी ++ (वीसी 2010)
for (int i=0; i<h; i++) {
for (int j=0; j<w; j++) {
if (buf[i*w+j] > 0) {
const int sy = max(0, i - hr);
const int ey = min(h, i + hr + 1);
const int sx = max(0, j - hr);
const int ex = min(w, j + hr + 1);
float val = 0;
for (int k=sy; k < ey; k++) {
for (int m=sx; m < ex; m++) {
val += original[k*w + m] * ds[k - i + hr][m - j + hr];
}
}
heat_map[i*w + j] = val;
}
}
}
यह मेरे लिए थोड़ा अजीब लग रहा था, इसलिए मैं कुछ परीक्षण तो विधानसभा इनलाइन करने के लिए कुछ बिट्स बदल दिया: (विशेष रूप से, कोड है कि योग "वैल")
for (int i=0; i<h; i++) {
for (int j=0; j<w; j++) {
if (buf[i*w+j] > 0) {
const int sy = max(0, i - hr);
const int ey = min(h, i + hr + 1);
const int sx = max(0, j - hr);
const int ex = min(w, j + hr + 1);
__asm {
fldz
}
for (int k=sy; k < ey; k++) {
for (int m=sx; m < ex; m++) {
float val = original[k*w + m] * ds[k - i + hr][m - j + hr];
__asm {
fld val
fadd
}
}
}
float val1;
__asm {
fstp val1
}
heat_map[i*w + j] = val1;
}
}
}
अब यह आधा समय, 150 एमएमएस में चलता है। यह बिल्कुल वही काम करता है, लेकिन यह दो बार जल्दी क्यों है? दोनों स्थितियों में इसे रिलीज मोड में ऑप्टिमाइज़ेशन के साथ चलाया गया था। क्या मैं अपने मूल सी ++ कोड में कुछ गलत कर रहा हूं?
क्या आपने दोनों मामलों में जेनरेट किए गए असेंबली कोड की तुलना करने का प्रयास किया था ... –