I am using opencl module provided by opencv on Qualcomm Snapdragon 805 Inforce 6501 on android. The problem is that the time taken for the execution of a particular function increases after some iterations. In my case I am using opencv's remap function with oclMat and if I call this function for say about 20 iterations the time taken is around 300 microseconds but if I call it for 50 iteration execution time rises to 50ms after around 25 iterations. I want to know the reason behind this and how can I avoid it. My JNI code is as follows
oclMat oclXMap,oclYMap;
oclMat oclSrc;
oclMat oclDst1;
oclMat oclDst2;
JNIEXPORT void JNICALL Java_com_qualcomm_andor_a360_MainActivity_Upload(JNIEnv * jenv, jclass )
{
DPRINTF ("JNI call start - v1.36!");
DevicesInfo devices;
cv::ocl::getOpenCLDevices(devices);
DPRINTF("Device Size %d ",devices.size());
for(int i=0; i<devices.size();i++)
DPRINTF("Device ID %d ",devices[i]->deviceVendorId);
setDevice(devices[0]);
cv::ocl::PlatformsInfo platforms;
Mat imageSrc = cv::imread("/storage/sdcard0/DCIM/Camera/2048.jpg");
FileStorage fsx("/storage/sdcard0/DCIM/Camera/FishEyeConversionXmap4.yml",FileStorage::READ);
FileStorage fsy("/storage/sdcard0/DCIM/Camera/FishEyeConversionYmap4.yml",FileStorage::READ);
fsx["xMap"] >> xMap1;
fsy["yMap"] >> yMap1;
fsx.release();
fsy.release();
oclSrc = imageSrc;
oclDst1 = oclSrc.clone();
oclDst2 = oclSrc.clone();
oclXMap= xMap1;
oclYMap= yMap1;
}
JNIEXPORT void JNICALL Java_com_qualcomm_andor_a360_MainActivity_OpencvRemap()
{
unsigned long long t1 = GetTime();
remap(oclSrc,oclDst1,oclXMap,oclYMap,CV_INTER_LINEAR,BORDER_CONSTANT);
remap(oclSrc,oclDst2,oclXMap,oclYMap,CV_INTER_LINEAR,BORDER_CONSTANT);
unsigned long long t2 = GetTime();
DPRINTF("Time taken remap : %llu microseconds for %f ms\n", t2-t1,(float)((t2-t1)/(1000)));
//usleep(30*1000);
}
JNIEXPORT void JNICALL Java_com_qualcomm_andor_a360_MainActivity_WriteImage()
{
Mat dst;
oclDst1.download(dst);
DPRINTF("Creating output");
imwrite("/storage/sdcard0/DCIM/Camera/remapDst.jpg",dst);
}
The java code is as follows
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Upload();
for(int i=0; i<100; i++)
OpencvRemap();
WriteImage();
}
private native void Upload();
private native void OpencvRemap();
private native void WriteImage();
And following are the debug messages
Time taken remap : 135277 microseconds for 135.000000 ms
Time taken remap: 257 microseconds for 0.000000 ms
Time taken remap: 362 microseconds for 0.000000 ms
Time taken remap: 304 microseconds for 0.000000 ms
Time taken remap: 248 microseconds for 0.000000 ms
Time taken remap: 287 microseconds for 0.000000 ms
Time taken remap: 220 microseconds for 0.000000 ms
Time taken remap: 297 microseconds for 0.000000 ms
Time taken remap: 230 microseconds for 0.000000 ms
Time taken remap: 285 microseconds for 0.000000 ms
Time taken remap: 223 microseconds for 0.000000 ms
Time taken remap: 292 microseconds for 0.000000 ms
Time taken remap: 230 microseconds for 0.000000 ms
Time taken remap: 568 microseconds for 0.000000 ms
Time taken remap: 233 microseconds for 0.000000 ms
Time taken remap: 224 microseconds for 0.000000 ms
Time taken remap: 224 microseconds for 0.000000 ms
Time taken remap: 228 microseconds for 0.000000 ms
Time taken remap: 222 microseconds for 0.000000 ms
Time taken remap: 228 microseconds for 0.000000 ms
Time taken remap: 226 microseconds for 0.000000 ms
Time taken remap: 227 microseconds for 0.000000 ms
Time taken remap: 224 microseconds for 0.000000 ms
Time taken remap: 224 microseconds for 0.000000 ms
Time taken remap: 226 microseconds for 0.000000 ms
Time taken remap: 227 microseconds for 0.000000 ms
Time taken remap: 231 microseconds for 0.000000 ms
Time taken remap: 20266 microseconds for 20.000000 ms
Time taken remap: 293 microseconds for 0.000000 ms
Time taken remap: 230 microseconds for 0.000000 ms
Time taken remap: 26705 microseconds for 26.000000 ms
Time taken remap: 232 microseconds for 0.000000 ms
Time taken remap: 26894 microseconds for 26.000000 ms
Time taken remap: 243 microseconds for 0.000000 ms
Time taken remap: 55111 microseconds for 55.000000 ms
Time taken remap: 54212 microseconds for 54.000000 ms
Time taken remap: 54384 microseconds for 54.000000 ms
Time taken remap: 53455 microseconds for 53.000000 ms
Time taken remap: 54261 microseconds for 54.000000 ms
Time taken remap: 54104 microseconds for 54.000000 ms
Time taken remap: 54478 microseconds for 54.000000 ms
Time taken remap: 54125 microseconds for 54.000000 ms
Time taken remap: 53147 microseconds for 53.000000 ms
Time taken remap: 54190 microseconds for 54.000000 ms
Time taken remap: 53998 microseconds for 53.000000 ms
Time taken remap: 55259 microseconds for 55.000000 ms
Time taken remap: 54153 microseconds for 54.000000 ms
Time taken remap: 54445 microseconds for 54.000000 ms
Time taken remap: 54369 microseconds for 54.000000 ms
Time taken remap: 53930 microseconds for 53.000000 ms