[LLVMdev] issue with profiling in LLVM 3.1
apala guha
aguha at uchicago.edu
Thu Dec 13 18:30:04 PST 2012
Hi,
I am using the profiling feature of LLVM 3.1. Mostly, it works well, but
seems to be wrong in a few cases. For example, I have found that the
number of times a function executed is reported as less than the number
of times that the basic block calling this function executed (the
difference was about 25x!). I am copying out the exact functions below.
The relevant parts are in bold font:
*------------*
*SOURCE :
------------*
//accumulate error at a given edge sample point (round to nearest
integral point)
*inline void SampleEdgePoint(float xf, float yf, const FlexImage8u
&EdgeMap, int &error, int &samplePoints)
{
int x = int(xf + 0.5f), y = int(yf + 0.5f);
if((x >= 0) && (x < EdgeMap.Width()) && (y >= 0) && (y <
EdgeMap.Height())) //check image bounds
{ int e = 255 -
EdgeMap(x,y);
//get value from image map and compute difference
error += (e *
e);
//sum squared error values
samplePoints++;
//count points sampled
}
}*
//Generate Samples for points along the non-joint edges of the cylinder
*void ImageMeasurements::EdgeError(const ProjectedCylinder &ProjCyl,
const FlexImage8u &EdgeMap, float &error, int &samplePoints)*
{
int ErrorSSD = 0;
const Point &p1 = ProjCyl.mPts[0];
Point
s1;
//get direction vector of side 1 of the 2D cylinder projection
s1.Set(ProjCyl.mPts[1].x - p1.x, ProjCyl.mPts[1].y - p1.y);
int n1 = max((int)(mag(s1) / mStep + 0.5),
4); //compute number of
points sampled (sample at least 4)
float d1 = 1.0f /
(float)n1++;
//get fraction of side length per sample
const Point &p2 = ProjCyl.mPts[2];
Point
s2;
//repeat for side 2 of cylinder
s2.Set(ProjCyl.mPts[3].x - p2.x, ProjCyl.mPts[3].y - p2.y);
int n2 = max((int)(mag(s2) / mStep + 0.5), 4);
float d2 = 1.0f / (float)n2++;
float delta = 0;
for(int i = 0; i < n1;
i++)
//generate sample points along each side of cylinder projection
{ float x = p1.x + delta * s1.x;
float y = p1.y + delta * s1.y;
*SampleEdgePoint(x, y, EdgeMap, ErrorSSD, samplePoints);
* //accumulate error at computed edge points on side 1
delta += d1;
}
delta = 0;
for(int i = 0; i < n2; i++)
{ float x = p2.x + delta * s2.x;
float y = p2.y + delta * s2.y;
*SampleEdgePoint(x, y, EdgeMap, ErrorSSD,
samplePoints);* //accumulate error at comptued
edge points on side 2
delta += d2;
}
error += (float)ErrorSSD / (255.0f * 255.0f);
}
*---------------------------*
*Call instructions in IR:
---------------------------
invoke void @_Z15SampleEdgePointffRK9FlexImageIhLi1EERiS3_(float %109,
float %110, %class.FlexImage* %111, i32* %ErrorSSD, i32* %112)
to label %113 unwind label %124
invoke void @_Z15SampleEdgePointffRK9FlexImageIhLi1EERiS3_(float %150,
float %151, %class.FlexImage* %152, i32* %ErrorSSD, i32* %153)
to label %154 unwind label %124*
Thanks.
-Apala
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121213/67600707/attachment.html>
More information about the llvm-dev
mailing list