在我的主持人计划中,我检查了创建图像的时间。
只需创建而不复制需要0.03秒。
为什么会发生这种事情需要比某些内核的执行时间更长的时间?
fmt.image_channel_order=CL_RG;
fmt.image_channel_data_type =CL_FLOAT;
clock_gettime(CLOCK_REALTIME, &time_start_temp);
cl::Image2D test_image=cl::Image2D(gContext,CL_MEM_WRITE_ONLY,fmt,width,height,0,NULL);//width= 2560 height=1440
clock_gettime(CLOCK_REALTIME, &time_end_temp);
time_elapsed = getTimeElapsed(time_end_temp, time_start_temp);
LOGI("image copy TIME, %f ", time_elapsed);
float getTimeElapsed(struct timespec end, struct timespec start) {
struct timespec temp;
float res;
temp.tv_sec = end.tv_sec - start.tv_sec - 1;
if ((end.tv_nsec - start.tv_nsec) < 0) {
temp.tv_nsec = 1e9 + end.tv_nsec - start.tv_nsec;
} else {
temp.tv_sec = end.tv_sec - start.tv_sec;
temp.tv_nsec = end.tv_nsec - start.tv_nsec;
}
res = ((float) temp.tv_sec) + ((float) temp.tv_nsec / 1e9);
return res;
}
答案 0 :(得分:1)
您没有显示所有代码,但如果在创建映像之前有clEnqueue调用,某些运行时将在创建映像之前执行隐式clFinish,因此您的30 ms可能包含那。这是因为图像和缓冲区分配和空闲调用是同步的,而命令队列功能是异步的,并且驱动程序不是最佳的。如果你在测试之前放了一个clFinish,时间是否会改变?你使用什么运行时?