Commit 5866263d authored by Andrey Filippov's avatar Andrey Filippov
Browse files

debugging geometry_correction - was corrupting last tiles

parent 705a2e85
Loading
Loading
Loading
Loading
+44 −48
Original line number Original line Diff line number Diff line
@@ -281,6 +281,32 @@ extern "C" __global__ void calc_rot_deriv(
}
}




extern "C" __global__ void calculate_tiles_offsets(
		struct tp_task     * gpu_tasks,
		int                  num_tiles,          // number of tiles in task
		struct gc          * gpu_geometry_correction,
		struct corr_vector * gpu_correction_vector,
		float *              gpu_rByRDist, // length should match RBYRDIST_LEN
		trot_deriv   * gpu_rot_deriv)
{
	dim3 threads_geom(NUM_CAMS,TILES_PER_BLOCK_GEOM, 1);
	dim3 grid_geom   ((num_tiles+TILES_PER_BLOCK_GEOM-1)/TILES_PER_BLOCK_GEOM, 1, 1);
	if (threadIdx.x == 0) { // always 1
    	get_tiles_offsets<<<grid_geom,threads_geom>>> (
    			gpu_tasks,               // struct tp_task     * gpu_tasks,
				num_tiles,               // int                  num_tiles,          // number of tiles in task list
				gpu_geometry_correction, //	struct gc          * gpu_geometry_correction,
				gpu_correction_vector,   //	struct corr_vector * gpu_correction_vector,
				gpu_rByRDist,            //	float *              gpu_rByRDist)      // length should match RBYRDIST_LEN
				gpu_rot_deriv);          // union trot_deriv   * gpu_rot_deriv);

	}
//	__syncthreads();// __syncwarp();
//	cudaDeviceSynchronize();
//	cudaDeviceSynchronize();
}


/*
/*
 * blockDim.x = NUM_CAMS
 * blockDim.x = NUM_CAMS
 * blockDim.y = TILES_PER_BLOCK_GEOM
 * blockDim.y = TILES_PER_BLOCK_GEOM
@@ -295,12 +321,7 @@ extern "C" __global__ void get_tiles_offsets(
		trot_deriv   * gpu_rot_deriv)
		trot_deriv   * gpu_rot_deriv)
{
{
	int task_num = blockIdx.x * blockDim.y + threadIdx.y; //  blockIdx.x * TILES_PER_BLOCK_GEOM + threadIdx.y
	int task_num = blockIdx.x * blockDim.y + threadIdx.y; //  blockIdx.x * TILES_PER_BLOCK_GEOM + threadIdx.y
	if (task_num >= num_tiles){
		return;
	}
	int thread_xy = blockDim.x * threadIdx.y + threadIdx.x;
	int thread_xy = blockDim.x * threadIdx.y + threadIdx.x;
	int ncam = threadIdx.x;
	// threadIdx.x - numcam, used for per-camera
	__shared__ struct gc geometry_correction;
	__shared__ struct gc geometry_correction;
	__shared__ float rByRDist [RBYRDIST_LEN];
	__shared__ float rByRDist [RBYRDIST_LEN];
	__shared__ struct corr_vector extrinsic_corr;
	__shared__ struct corr_vector extrinsic_corr;
@@ -355,6 +376,10 @@ extern "C" __global__ void get_tiles_offsets(
		}
		}
	}
	}
	__syncthreads();
	__syncthreads();
	int ncam = threadIdx.x;
	if (task_num >= num_tiles){
		return;
	}
	int imu_exists = // todo - calculate once with rot_deriv?
	int imu_exists = // todo - calculate once with rot_deriv?
			(extrinsic_corr.imu_rot[0] != 0.0) ||
			(extrinsic_corr.imu_rot[0] != 0.0) ||
			(extrinsic_corr.imu_rot[1] != 0.0) ||
			(extrinsic_corr.imu_rot[1] != 0.0) ||
@@ -511,9 +536,6 @@ extern "C" __global__ void get_tiles_offsets(
	__syncthreads();// __syncwarp();
	__syncthreads();// __syncwarp();
#endif // DEBUG21
#endif // DEBUG21




	//	float rvi[3];
	float drvi_daz [3]; // drvi_daz = deriv_rots[i][0].times(vi);
	float drvi_daz [3]; // drvi_daz = deriv_rots[i][0].times(vi);
	float drvi_dtl [3]; // drvi_dtl = deriv_rots[i][1].times(vi);
	float drvi_dtl [3]; // drvi_dtl = deriv_rots[i][1].times(vi);
	float drvi_drl [3]; // drvi_drl = deriv_rots[i][2].times(vi);
	float drvi_drl [3]; // drvi_drl = deriv_rots[i][2].times(vi);
@@ -570,7 +592,6 @@ extern "C" __global__ void get_tiles_offsets(
	__syncthreads();// __syncwarp();
	__syncthreads();// __syncwarp();
#endif // DEBUG21
#endif // DEBUG21



	// now first column of 2x2 dd1 - x, y components of derivatives by disparity, second column - derivatives by ortho to disparity (~Y in 2d correlation)
	// now first column of 2x2 dd1 - x, y components of derivatives by disparity, second column - derivatives by ortho to disparity (~Y in 2d correlation)
	// unity vector in the direction of radius
	// unity vector in the direction of radius
	float c_dist = pXci/rNDi;
	float c_dist = pXci/rNDi;
@@ -618,7 +639,6 @@ extern "C" __global__ void get_tiles_offsets(
	__syncthreads();// __syncwarp();
	__syncthreads();// __syncwarp();
#endif // DEBUG21
#endif // DEBUG21



	gpu_tasks[task_num].disp_dist[ncam][0] = disp_dist[0];
	gpu_tasks[task_num].disp_dist[ncam][0] = disp_dist[0];
	gpu_tasks[task_num].disp_dist[ncam][1] = disp_dist[1];
	gpu_tasks[task_num].disp_dist[ncam][1] = disp_dist[1];
	gpu_tasks[task_num].disp_dist[ncam][2] = disp_dist[2];
	gpu_tasks[task_num].disp_dist[ncam][2] = disp_dist[2];
@@ -629,17 +649,6 @@ extern "C" __global__ void get_tiles_offsets(
	//	float imu_move[3]; // dx/dt, dy/dt, dz/dt 16..19 geometry_correction.imu_move
	//	float imu_move[3]; // dx/dt, dy/dt, dz/dt 16..19 geometry_correction.imu_move
	// ERS linear does not yet use per-port rotations, probably not needed
	// ERS linear does not yet use per-port rotations, probably not needed
	if (imu_exists){
	if (imu_exists){
		/*
		float delta_t = disp_dist[2] * disparity * geometry_correction.line_time; // positive for top cameras, negative - for bottom //disp_dist[2]=dd2.get(1, 0)
		float ers_Xci =	delta_t * (
				dpXci_dtilt * extrinsic_corr.imu_rot[0] +
				dpXci_dazimuth * extrinsic_corr.imu_rot[1]  +
				dpXci_droll * extrinsic_corr.imu_rot[2]);
		float ers_Yci =	delta_t* (
				dpYci_dtilt * extrinsic_corr.imu_rot[0] +
				dpYci_dazimuth * extrinsic_corr.imu_rot[1] +
				dpYci_droll * extrinsic_corr.imu_rot[2]);
		 */
		float ers_x =
		float ers_x =
				dpXci_dtilt * extrinsic_corr.imu_rot[0] +
				dpXci_dtilt * extrinsic_corr.imu_rot[0] +
				dpXci_dazimuth * extrinsic_corr.imu_rot[1]  +
				dpXci_dazimuth * extrinsic_corr.imu_rot[1]  +
@@ -649,11 +658,8 @@ extern "C" __global__ void get_tiles_offsets(
				dpYci_dazimuth * extrinsic_corr.imu_rot[1] +
				dpYci_dazimuth * extrinsic_corr.imu_rot[1] +
				dpYci_droll * extrinsic_corr.imu_rot[2];
				dpYci_droll * extrinsic_corr.imu_rot[2];




#ifdef DEBUG21
#ifdef DEBUG21
		if ((ncam == DBG_CAM)  && (task_num == DBG_TILE)){
		if ((ncam == DBG_CAM)  && (task_num == DBG_TILE)){
//			printf("delta_t = %f,  ers_Xci = %f,  ers_Yci = %f\n", delta_t, ers_Xci, ers_Yci);
			printf("ers_x = %f,  ers_y = %f\n", ers_x, ers_y);
			printf("ers_x = %f,  ers_y = %f\n", ers_x, ers_y);
		}
		}
		__syncthreads();// __syncwarp();
		__syncthreads();// __syncwarp();
@@ -666,14 +672,6 @@ extern "C" __global__ void get_tiles_offsets(
			dpXci_pYci_imu_lin[1][1] =  wdisparity / k; // dpy/ dworld_Y
			dpXci_pYci_imu_lin[1][1] =  wdisparity / k; // dpy/ dworld_Y
			dpXci_pYci_imu_lin[0][2] =  (xyz[0] / k) * dwdisp_dz; // dpx/ dworld_Z
			dpXci_pYci_imu_lin[0][2] =  (xyz[0] / k) * dwdisp_dz; // dpx/ dworld_Z
			dpXci_pYci_imu_lin[1][2] =  (xyz[1] / k) * dwdisp_dz; // dpy/ dworld_Z
			dpXci_pYci_imu_lin[1][2] =  (xyz[1] / k) * dwdisp_dz; // dpy/ dworld_Z
			/*
			ers_Xci += delta_t* (
					dpXci_pYci_imu_lin[0][0] * extrinsic_corr.imu_move[0] +
					dpXci_pYci_imu_lin[0][2] * extrinsic_corr.imu_move[2]);
			ers_Yci += delta_t* (
					dpXci_pYci_imu_lin[1][1] * extrinsic_corr.imu_move[1] +
					dpXci_pYci_imu_lin[1][2] * extrinsic_corr.imu_move[2]);
			*/
			ers_x += dpXci_pYci_imu_lin[0][0] * extrinsic_corr.imu_move[0] +
			ers_x += dpXci_pYci_imu_lin[0][0] * extrinsic_corr.imu_move[0] +
					dpXci_pYci_imu_lin[0][2] * extrinsic_corr.imu_move[2];
					dpXci_pYci_imu_lin[0][2] * extrinsic_corr.imu_move[2];
			ers_y += dpXci_pYci_imu_lin[1][1] * extrinsic_corr.imu_move[1] +
			ers_y += dpXci_pYci_imu_lin[1][1] * extrinsic_corr.imu_move[1] +
@@ -700,8 +698,6 @@ extern "C" __global__ void get_tiles_offsets(
	// copy results to global memory pXY,  disp_dist
	// copy results to global memory pXY,  disp_dist
	gpu_tasks[task_num].xy[ncam][0] = pXY[0];
	gpu_tasks[task_num].xy[ncam][0] = pXY[0];
	gpu_tasks[task_num].xy[ncam][1] = pXY[1];
	gpu_tasks[task_num].xy[ncam][1] = pXY[1];


}
}


extern "C" __global__ void calcReverseDistortionTable(
extern "C" __global__ void calcReverseDistortionTable(
+9 −0
Original line number Original line Diff line number Diff line
@@ -149,6 +149,15 @@ extern "C" __global__ void get_tiles_offsets(
		float *              gpu_rByRDist, // length should match RBYRDIST_LEN
		float *              gpu_rByRDist, // length should match RBYRDIST_LEN
		trot_deriv   * gpu_rot_deriv);
		trot_deriv   * gpu_rot_deriv);


extern "C" __global__ void calculate_tiles_offsets(
		struct tp_task     * gpu_tasks,
		int                  num_tiles,          // number of tiles in task
		struct gc          * gpu_geometry_correction,
		struct corr_vector * gpu_correction_vector,
		float *              gpu_rByRDist, // length should match RBYRDIST_LEN
		trot_deriv   * gpu_rot_deriv);


// uses NUM_CAMS blocks, (3,3,3) threads
// uses NUM_CAMS blocks, (3,3,3) threads
extern "C" __global__ void calc_rot_deriv(
extern "C" __global__ void calc_rot_deriv(
		struct corr_vector * gpu_correction_vector,
		struct corr_vector * gpu_correction_vector,
+9 −0
Original line number Original line Diff line number Diff line
@@ -739,6 +739,7 @@ int main(int argc, char **argv)
    		sdkResetTimer(&timerGEOM);
    		sdkResetTimer(&timerGEOM);
    		sdkStartTimer(&timerGEOM);
    		sdkStartTimer(&timerGEOM);
    	}
    	}
/*
    	get_tiles_offsets<<<grid_geom,threads_geom>>> (
    	get_tiles_offsets<<<grid_geom,threads_geom>>> (
    			gpu_tasks,               // struct tp_task     * gpu_tasks,
    			gpu_tasks,               // struct tp_task     * gpu_tasks,
				tp_task_size,            // int                  num_tiles,          // number of tiles in task list
				tp_task_size,            // int                  num_tiles,          // number of tiles in task list
@@ -746,6 +747,14 @@ int main(int argc, char **argv)
				gpu_correction_vector,   //	struct corr_vector * gpu_correction_vector,
				gpu_correction_vector,   //	struct corr_vector * gpu_correction_vector,
				gpu_rByRDist,            //	float *              gpu_rByRDist)      // length should match RBYRDIST_LEN
				gpu_rByRDist,            //	float *              gpu_rByRDist)      // length should match RBYRDIST_LEN
				gpu_rot_deriv);          // union trot_deriv   * gpu_rot_deriv);
				gpu_rot_deriv);          // union trot_deriv   * gpu_rot_deriv);
				*/
    	calculate_tiles_offsets<<<1,1>>> (
    			gpu_tasks,               // struct tp_task     * gpu_tasks,
				tp_task_size,            // int                  num_tiles,          // number of tiles in task list
				gpu_geometry_correction, //	struct gc          * gpu_geometry_correction,
				gpu_correction_vector,   //	struct corr_vector * gpu_correction_vector,
				gpu_rByRDist,            //	float *              gpu_rByRDist)      // length should match RBYRDIST_LEN
				gpu_rot_deriv);          // union trot_deriv   * gpu_rot_deriv);


    	getLastCudaError("Kernel failure");
    	getLastCudaError("Kernel failure");
    	checkCudaErrors(cudaDeviceSynchronize());
    	checkCudaErrors(cudaDeviceSynchronize());
+2 −2
Original line number Original line Diff line number Diff line
@@ -93,8 +93,8 @@


//#define DBG_TILE_X     40
//#define DBG_TILE_X     40
//#define DBG_TILE_Y     80
//#define DBG_TILE_Y     80
#define DBG_TILE_X     162 // 151 // 161 // 49
#define DBG_TILE_X     32 // 162 // 151 // 161 // 49
#define DBG_TILE_Y     121 // 69  // 111 // 66
#define DBG_TILE_Y     88 // 121 // 69  // 111 // 66


#define DBG_TILE    (DBG_TILE_Y * 324 + DBG_TILE_X)
#define DBG_TILE    (DBG_TILE_Y * 324 + DBG_TILE_X)
#undef DBG_MARK_DBG_TILE
#undef DBG_MARK_DBG_TILE