Loading src/TileProcessor.cuh +48 −10 Original line number Diff line number Diff line Loading @@ -1109,6 +1109,7 @@ extern "C" __global__ void textures_accumulate( // (8,4,1) (N,1,1) int * woi, // x, y, width,height float ** gpu_clt, // [num_cams] ->[TILES-Y][TILES-X][colors][DTT_SIZE*DTT_SIZE] size_t num_texture_tiles, // number of texture tiles to process int gpu_texture_indices_offset,// add to gpu_texture_indices int * gpu_texture_indices,// packed tile + bits (now only (1 << 7) // TODO: use geometry_correction rXY ! struct gc * gpu_geometry_correction, Loading Loading @@ -1151,7 +1152,7 @@ __device__ int get_textures_shared_size( // in bytes * @param scale1 scale blue (if colors = 3) component before mixing * @param scale2 scale green (if colors = 3) component before mixing * @param fat_zero add this value squared to the sum of squared components before normalization\ * @param gpu_ftasks flattened tasks, 27 floats for quad EO, 99 floats for LWIR16 * @param gpu_ftasks flattened tasks, 29 floats for quad EO, 101 floats for LWIR16 // * @param gpu_tasks array of per-tile tasks (now bits 4..9 - correlation pairs) * @param num_tiles number of tiles int gpu_tasks array prepared for processing * @param tilesx number of tile rows Loading Loading @@ -1190,14 +1191,12 @@ extern "C" __global__ void correlate2D( *pnum_corr_tiles = 0; index_correlate<<<blocks0,threads0>>>( num_cams, // int num_cams, // sel_pairs, // int * sel_pairs, sel_pairs0, // int sel_pairs0, sel_pairs1, // int sel_pairs1, sel_pairs2, // int sel_pairs2, sel_pairs3, // int sel_pairs3, gpu_ftasks, // float * gpu_ftasks, // flattened tasks, 27 floats for quad EO, 99 floats for LWIR16 // gpu_tasks, // struct tp_task * gpu_tasks, gpu_ftasks, // float * gpu_ftasks, // flattened tasks, 29 floats for quad EO, 101 floats for LWIR16 num_tiles, // int num_tiles, // number of tiles in task tilesx, // int width, // number of tiles in a row gpu_corr_indices, // int * gpu_corr_indices, // array of correlation tasks Loading Loading @@ -2062,7 +2061,8 @@ extern "C" __global__ void generate_RBGA( woi, // int * woi, // x, y, width,height gpu_clt, // float ** gpu_clt, // [num_cams] ->[TILES-Y][TILES-X][colors][DTT_SIZE*DTT_SIZE] ntt, // size_t num_texture_tiles, // number of texture tiles to process gpu_texture_indices + ti_offset, // int * gpu_texture_indices,// packed tile + bits (now only (1 << 7) ti_offset, // gpu_texture_indices_offset,// add to gpu_texture_indices gpu_texture_indices, // + ti_offset, // int * gpu_texture_indices,// packed tile + bits (now only (1 << 7) gpu_geometry_correction, // struct gc * gpu_geometry_correction, colors, // int colors, // number of colors (3/1) is_lwir, // int is_lwir, // do not perform shot correction Loading Loading @@ -2789,7 +2789,9 @@ __global__ void convert_correct_tiles( * @param dust_remove do not reduce average weight when only one image differs much from the average (true) * @param texture_stride output stride in floats (now 256*4 = 1024) * @param gpu_texture_tiles output array (number of colors +1 + ?)*16*16 rgba texture tiles) float values. Will not be calculated if null * @param inescan_order 0 low-res tiles have tghe same order, as gpu_texture_indices, 1 - in linescan order * @param gpu_diff_rgb_combo low-resolution output, with per-camera mismatch an each color average. Will not be calculated if null * @param num_tilesx number of tiles in a row */ extern "C" __global__ void textures_nonoverlap( int num_cams, // number of cameras Loading @@ -2810,6 +2812,7 @@ extern "C" __global__ void textures_nonoverlap( // combining both non-overlap and overlap (each calculated if pointer is not null ) size_t texture_stride, // in floats (now 256*4 = 1024) float * gpu_texture_tiles, // (number of colors +1 + ?)*16*16 rgba texture tiles int linescan_order, // 0 low-res tiles have tghe same order, as gpu_texture_indices, 1 - in linescan order float * gpu_diff_rgb_combo, // diff[num_cams], R[num_cams], B[num_cams],G[num_cams] int num_tilesx) // num_tilesx in the end - worked, after num_tiles - did not compile with JIT in Eclipse Loading Loading @@ -2856,6 +2859,7 @@ extern "C" __global__ void textures_nonoverlap( (int *) 0, // int * woi, // x, y, width,height gpu_clt, // float ** gpu_clt, // [num_cams] ->[TILES-Y][TILES-X][colors][DTT_SIZE*DTT_SIZE] *pnum_texture_tiles, // size_t num_texture_tiles, // number of texture tiles to process 0, // gpu_texture_indices_offset,// add to gpu_texture_indices gpu_texture_indices, // int * gpu_texture_indices,// packed tile + bits (now only (1 << 7) gpu_geometry_correction, // struct gc * gpu_geometry_correction, colors, // int colors, // number of colors (3/1) Loading @@ -2873,7 +2877,7 @@ extern "C" __global__ void textures_nonoverlap( (float *) 0, // float * gpu_texture_rbg, // (number of colors +1 + ?)*16*16 rgba texture tiles texture_stride, // size_t texture_stride, // in floats (now 256*4 = 1024) gpu_texture_tiles, // (float *)0);// float * gpu_texture_tiles); // (number of colors +1 + ?)*16*16 rgba texture tiles 1, // int linescan_order, // if !=0 then output gpu_diff_rgb_combo in linescan order, else - in gpu_texture_indices order linescan_order, // int linescan_order, // if !=0 then output gpu_diff_rgb_combo in linescan order, else - in gpu_texture_indices order gpu_diff_rgb_combo, //); // float * gpu_diff_rgb_combo) // diff[num_cams], R[num_cams], B[num_cams],G[num_cams] num_tilesx); } Loading @@ -2892,6 +2896,7 @@ extern "C" __global__ void textures_nonoverlap( * @param woi WoI for the output texture (x,y,width,height of the woi), may be null if overlapped output is not used * @param gpu_clt array of num_cams pointers to the CLT (frequency domain) data [TILES-Y][TILES-X][NUM_COLORS][DTT_SIZE*DTT_SIZE] * @param num_texture_tiles number of texture tiles to process * @param gpu_texture_indices_offset add to gpu_texture_indices * @param gpu_texture_indices array - 1 integer per tile to process * @param gpu_geometry_correction geometry correction structure, used for rXY to determine pairs weight * @param colors number of colors used: 3 for RGB or 1 for monochrome Loading @@ -2918,6 +2923,7 @@ extern "C" __global__ void textures_accumulate( // (8,4,1) (N,1,1) int * woi, // x, y, width,height float ** gpu_clt, // [num_cams] ->[TILES-Y][TILES-X][colors][DTT_SIZE*DTT_SIZE] size_t num_texture_tiles, // number of texture tiles to process int gpu_texture_indices_offset,// add to gpu_texture_indices int * gpu_texture_indices,// packed tile + bits (now only (1 << 7) struct gc * gpu_geometry_correction, int colors, // number of colors (3/1) Loading Loading @@ -2959,7 +2965,7 @@ extern "C" __global__ void textures_accumulate( // (8,4,1) (N,1,1) return; // nothing to do } // get number of tile int tile_code = gpu_texture_indices[tile_indx]; int tile_code = gpu_texture_indices[tile_indx + gpu_texture_indices_offset]; // Added for Java, no DP if ((tile_code & (1 << CORR_TEXTURE_BIT)) == 0){ return; // nothing to do } Loading Loading @@ -3513,11 +3519,25 @@ __global__ void imclt_rbg_all( int woi_theight, const size_t dstride) // in floats (pixels) { // int num_cams = sizeof(gpu_clt)/sizeof(&gpu_clt[0]); dim3 threads_erase8x8(DTT_SIZE, NUM_THREADS/DTT_SIZE, 1); dim3 grid_erase8x8_right_col (1, woi_theight + 1, 1); dim3 grid_erase8x8_bottom_row(woi_twidth + 1, 1, 1); dim3 threads_imclt(IMCLT_THREADS_PER_TILE, IMCLT_TILES_PER_BLOCK, 1); if (threadIdx.x == 0) { // anyway 1,1,1 for (int ncam = 0; ncam < num_cams; ncam++) { // was NUM_CAMS for (int color = 0; color < colors; color++) { // clear right and bottom 8-pixel column and row float *right_col = gpu_corr_images[ncam] + dstride * (woi_theight * DTT_SIZE + DTT_SIZE) * color + (woi_twidth * DTT_SIZE); erase8x8<<<grid_erase8x8_right_col,threads_erase8x8>>>( right_col, // float * gpu_top_left, dstride); // const size_t dstride); float *bottom_row = gpu_corr_images[ncam] + dstride * (woi_theight * DTT_SIZE + DTT_SIZE) * color + dstride * (woi_theight * DTT_SIZE); erase8x8<<<grid_erase8x8_bottom_row,threads_erase8x8>>>( bottom_row, // float * gpu_top_left, dstride); // const size_t dstride); for (int v_offs = 0; v_offs < 2; v_offs++){ for (int h_offs = 0; h_offs < 2; h_offs++){ int tilesy_half = (woi_theight + (v_offs ^ 1)) >> 1; Loading @@ -3544,7 +3564,25 @@ __global__ void imclt_rbg_all( } } /** * Clear 8x8 tiles, used to erase right and bottom 8-pixel wide column/row before imclt_rbg * @param gpu_top_left - pointer to the top-left corner of the firsr tile to erase * @param dstride - offset for 1 pixel step down * block.x - horizontal tile offset * block.y - vertical tile offset * 0<=thread.x < 8 - horizontal pixel offset * 0<=thread.y < 4 - vertical pixel offset */ extern "C" __global__ void erase8x8( float * gpu_top_left, const size_t dstride) { float * pixel = gpu_top_left + (((blockIdx.y * DTT_SIZE) + threadIdx.y) * dstride) + ((blockIdx.x * DTT_SIZE) + threadIdx.x); * pixel = 0.0f; pixel += dstride * blockDim.y; // add 4 pixel rows (assuming blockDim.x==4) * pixel = 0.0f; } /** * Helper kernel for imclt_rbg_all(), generate per-camera -per color image from the in-memory frequency domain representation. Loading Loading @@ -3573,7 +3611,7 @@ __global__ void imclt_rbg( const size_t dstride) // in floats (pixels) { float *color_plane = gpu_rbg + dstride * (woi_theight * DTT_SIZE + DTT_SIZE) * color; int pass = (v_offset << 1) + h_offset; // 0..3 to correctly acummulate 16x16 tiles stride 8 int pass = (v_offset << 1) + h_offset; // 0..3 to correctly accumulate 16x16 tiles stride 8 int tile_in_block = threadIdx.y; int tile_num = blockIdx.x * IMCLT_TILES_PER_BLOCK + tile_in_block; int tilesx_half = (woi_twidth + (h_offset ^ 1)) >> 1; Loading src/TileProcessor.h +9 −4 Original line number Diff line number Diff line Loading @@ -49,7 +49,7 @@ extern "C" __global__ void convert_direct( // called with a single block, single float ** gpu_kernel_offsets, // [NUM_CAMS], float ** gpu_kernels, // [NUM_CAMS], float ** gpu_images, // [NUM_CAMS], float * gpu_ftasks, // flattened tasks, 27 floats for quad EO, 99 floats for LWIR16 float * gpu_ftasks, // flattened tasks, 29 floats for quad EO, 101 floats for LWIR16 // struct tp_task * gpu_tasks, float ** gpu_clt, // [NUM_CAMS][TILES-Y][TILES-X][NUM_COLORS][DTT_SIZE*DTT_SIZE] size_t dstride, // in floats (pixels) Loading @@ -76,7 +76,7 @@ extern "C" __global__ void correlate2D( float scale1, // scale for B float scale2, // scale for G float fat_zero, // here - absolute float * gpu_ftasks, // flattened tasks, 27 floats for quad EO, 99 floats for LWIR16 float * gpu_ftasks, // flattened tasks, 29 floats for quad EO, 101 floats for LWIR16 // struct tp_task * gpu_tasks, // array of per-tile tasks (now bits 4..9 - correlation pairs) int num_tiles, // number of tiles in task int tilesx, // number of tile rows Loading Loading @@ -109,7 +109,7 @@ extern "C" __global__ void corr2D_combine( extern "C" __global__ void textures_nonoverlap( int num_cams, // number of cameras float * gpu_ftasks, // flattened tasks, 27 floats for quad EO, 99 floats float * gpu_ftasks, // flattened tasks, 29 floats for quad EO, 101 floats // struct tp_task * gpu_tasks, int num_tiles, // number of tiles in task list // int num_tilesx, // number of tiles in a row Loading @@ -127,6 +127,7 @@ extern "C" __global__ void textures_nonoverlap( // combining both non-overlap and overlap (each calculated if pointer is not null ) size_t texture_stride, // in floats (now 256*4 = 1024) // may be 0 if not needed float * gpu_texture_tiles, // (number of colors +1 + ?)*16*16 rgba texture tiles // may be 0 if not needed int linescan_order, // 0 low-res tiles have tghe same order, as gpu_texture_indices, 1 - in linescan order float * gpu_diff_rgb_combo, //); // diff[NUM_CAMS], R[NUM_CAMS], B[NUM_CAMS],G[NUM_CAMS] // may be 0 if not needed int num_tilesx); Loading @@ -141,6 +142,10 @@ __global__ void imclt_rbg_all( int woi_theight, const size_t dstride); // in floats (pixels) extern "C" __global__ void erase8x8( float * gpu_top_left, const size_t dstride); extern "C" __global__ void imclt_rbg( float * gpu_clt, // [TILES-Y][TILES-X][NUM_COLORS][DTT_SIZE*DTT_SIZE] float * gpu_rbg, // WIDTH, 3 * HEIGHT Loading @@ -156,7 +161,7 @@ extern "C" __global__ void imclt_rbg( extern "C" __global__ void generate_RBGA( int num_cams, // number of cameras used // Parameters to generate texture tasks float * gpu_ftasks, // flattened tasks, 27 floats for quad EO, 99 floats for LWIR16 float * gpu_ftasks, // flattened tasks, 29 floats for quad EO, 101 floats for LWIR16 // struct tp_task * gpu_tasks, int num_tiles, // number of tiles in task list // declare arrays in device code? Loading src/test_tp.cu +9 −7 Original line number Diff line number Diff line Loading @@ -31,8 +31,8 @@ */ #define NOCORR #define NOCORR_TD #define NOTEXTURES_HOST //#define NOCORR_TD //#define NOTEXTURES_HOST #define NOTEXTURES #define NOTEXTURE_RGBA #define SAVE_CLT Loading Loading @@ -492,7 +492,9 @@ void generate_RBGA_host( gpu_woi, // int * woi, // x, y, width,height gpu_clt, // float ** gpu_clt, // [num_cams] ->[TILES-Y][TILES-X][colors][DTT_SIZE*DTT_SIZE] ntt, // size_t num_texture_tiles, // number of texture tiles to process gpu_texture_indices + ti_offset, // int * gpu_texture_indices,// packed tile + bits (now only (1 << 7) ti_offset, // gpu_texture_indices_offset,// add to gpu_texture_indices gpu_texture_indices, // + ti_offset, // int * gpu_texture_indices,// packed tile + bits (now only (1 << 7) // gpu_texture_indices + ti_offset, // int * gpu_texture_indices,// packed tile + bits (now only (1 << 7) gpu_geometry_correction, // struct gc * gpu_geometry_correction, colors, // int colors, // number of colors (3/1) is_lwir, // int is_lwir, // do not perform shot correction Loading Loading @@ -1626,7 +1628,6 @@ int main(int argc, char **argv) // FIXME: provide sel_pairs correlate2D<<<1,1>>>( // output TD tiles, no normalization num_cams, // int num_cams, // 0, // int * sel_pairs, // unused bits should be 0 sel_pairs[0], // int sel_pairs0 // unused bits should be 0 sel_pairs[1], // int sel_pairs1, // unused bits should be 0 sel_pairs[2], // int sel_pairs2, // unused bits should be 0 Loading @@ -1638,7 +1639,6 @@ int main(int argc, char **argv) color_weights[2], // 0.5, // float scale2, // scale for G 30.0, // float fat_zero, // here - absolute gpu_ftasks, // float * gpu_ftasks, // flattened tasks, 27 floats for quad EO, 99 floats for LWIR16 // gpu_tasks, // struct tp_task * gpu_tasks, tp_task_size, // int num_tiles) // number of tiles in task TILESX, // int tilesx, // number of tile rows gpu_corr_indices, // int * gpu_corr_indices, // packed tile+pair Loading Loading @@ -1795,6 +1795,7 @@ int main(int argc, char **argv) (int *) 0, // int * woi, // x, y, width,height gpu_clt, // float ** gpu_clt, // [num_cams] ->[TILES-Y][TILES-X][colors][DTT_SIZE*DTT_SIZE] cpu_pnum_texture_tiles, // *pnum_texture_tiles, // size_t num_texture_tiles, // number of texture tiles to process 0, // gpu_texture_indices_offset,// add to gpu_texture_indices gpu_texture_indices, // int * gpu_texture_indices,// packed tile + bits (now only (1 << 7) gpu_geometry_correction, // struct gc * gpu_geometry_correction, texture_colors, // int colors, // number of colors (3/1) Loading Loading @@ -1949,7 +1950,7 @@ int main(int argc, char **argv) // printf("grid_texture=(%d, %d, %d)\n",grid_texture.x,grid_texture.y,grid_texture.z); StopWatchInterface *timerTEXTURE = 0; sdkCreateTimer(&timerTEXTURE); int linescan_order = 1; // output low-res in linescan order, 0 - in gpu_texture_indices order for (int i = i0; i < numIterations; i++) { if (i == 0) Loading Loading @@ -1986,7 +1987,8 @@ int main(int argc, char **argv) 1, // int dust_remove, // Do not reduce average weight when only one image differes much from the average // combining both non-overlap and overlap (each calculated if pointer is not null ) 0, // dstride_textures/sizeof(float), // size_t texture_stride, // in floats (now 256*4 = 1024) // may be 0 if not needed (float *) 0, // gpu_textures, // float * gpu_texture_tiles, // (number of colors +1 + ?)*16*16 rgba texture tiles // may be 0 if not needed (float *) 0, // gpu_textures, // float * gpu_texture_tiles, // (number of colors +1 + ?)*16*16 rgba texture tiles // may be 0 if not needed\ linescan_order, // int linescan_order, // 0 low-res tiles have tghe same order, as gpu_texture_indices, 1 - in linescan order gpu_diff_rgb_combo, //); // float * gpu_diff_rgb_combo); // diff[NUM_CAMS], R[NUM_CAMS], B[NUM_CAMS],G[NUM_CAMS] // may be 0 if not needed TILESX); getLastCudaError("Kernel failure"); Loading src/tp_defines.h +1 −1 Original line number Diff line number Diff line Loading @@ -134,7 +134,7 @@ #define DEBUG8 1 #define DEBUG9 1 */ #define DEBUG8A 1 //#define DEBUG8A 1 // generate_RBGA_host //textures //#define DEBUG10 1 //#define DEBUG11 1 Loading Loading
src/TileProcessor.cuh +48 −10 Original line number Diff line number Diff line Loading @@ -1109,6 +1109,7 @@ extern "C" __global__ void textures_accumulate( // (8,4,1) (N,1,1) int * woi, // x, y, width,height float ** gpu_clt, // [num_cams] ->[TILES-Y][TILES-X][colors][DTT_SIZE*DTT_SIZE] size_t num_texture_tiles, // number of texture tiles to process int gpu_texture_indices_offset,// add to gpu_texture_indices int * gpu_texture_indices,// packed tile + bits (now only (1 << 7) // TODO: use geometry_correction rXY ! struct gc * gpu_geometry_correction, Loading Loading @@ -1151,7 +1152,7 @@ __device__ int get_textures_shared_size( // in bytes * @param scale1 scale blue (if colors = 3) component before mixing * @param scale2 scale green (if colors = 3) component before mixing * @param fat_zero add this value squared to the sum of squared components before normalization\ * @param gpu_ftasks flattened tasks, 27 floats for quad EO, 99 floats for LWIR16 * @param gpu_ftasks flattened tasks, 29 floats for quad EO, 101 floats for LWIR16 // * @param gpu_tasks array of per-tile tasks (now bits 4..9 - correlation pairs) * @param num_tiles number of tiles int gpu_tasks array prepared for processing * @param tilesx number of tile rows Loading Loading @@ -1190,14 +1191,12 @@ extern "C" __global__ void correlate2D( *pnum_corr_tiles = 0; index_correlate<<<blocks0,threads0>>>( num_cams, // int num_cams, // sel_pairs, // int * sel_pairs, sel_pairs0, // int sel_pairs0, sel_pairs1, // int sel_pairs1, sel_pairs2, // int sel_pairs2, sel_pairs3, // int sel_pairs3, gpu_ftasks, // float * gpu_ftasks, // flattened tasks, 27 floats for quad EO, 99 floats for LWIR16 // gpu_tasks, // struct tp_task * gpu_tasks, gpu_ftasks, // float * gpu_ftasks, // flattened tasks, 29 floats for quad EO, 101 floats for LWIR16 num_tiles, // int num_tiles, // number of tiles in task tilesx, // int width, // number of tiles in a row gpu_corr_indices, // int * gpu_corr_indices, // array of correlation tasks Loading Loading @@ -2062,7 +2061,8 @@ extern "C" __global__ void generate_RBGA( woi, // int * woi, // x, y, width,height gpu_clt, // float ** gpu_clt, // [num_cams] ->[TILES-Y][TILES-X][colors][DTT_SIZE*DTT_SIZE] ntt, // size_t num_texture_tiles, // number of texture tiles to process gpu_texture_indices + ti_offset, // int * gpu_texture_indices,// packed tile + bits (now only (1 << 7) ti_offset, // gpu_texture_indices_offset,// add to gpu_texture_indices gpu_texture_indices, // + ti_offset, // int * gpu_texture_indices,// packed tile + bits (now only (1 << 7) gpu_geometry_correction, // struct gc * gpu_geometry_correction, colors, // int colors, // number of colors (3/1) is_lwir, // int is_lwir, // do not perform shot correction Loading Loading @@ -2789,7 +2789,9 @@ __global__ void convert_correct_tiles( * @param dust_remove do not reduce average weight when only one image differs much from the average (true) * @param texture_stride output stride in floats (now 256*4 = 1024) * @param gpu_texture_tiles output array (number of colors +1 + ?)*16*16 rgba texture tiles) float values. Will not be calculated if null * @param inescan_order 0 low-res tiles have tghe same order, as gpu_texture_indices, 1 - in linescan order * @param gpu_diff_rgb_combo low-resolution output, with per-camera mismatch an each color average. Will not be calculated if null * @param num_tilesx number of tiles in a row */ extern "C" __global__ void textures_nonoverlap( int num_cams, // number of cameras Loading @@ -2810,6 +2812,7 @@ extern "C" __global__ void textures_nonoverlap( // combining both non-overlap and overlap (each calculated if pointer is not null ) size_t texture_stride, // in floats (now 256*4 = 1024) float * gpu_texture_tiles, // (number of colors +1 + ?)*16*16 rgba texture tiles int linescan_order, // 0 low-res tiles have tghe same order, as gpu_texture_indices, 1 - in linescan order float * gpu_diff_rgb_combo, // diff[num_cams], R[num_cams], B[num_cams],G[num_cams] int num_tilesx) // num_tilesx in the end - worked, after num_tiles - did not compile with JIT in Eclipse Loading Loading @@ -2856,6 +2859,7 @@ extern "C" __global__ void textures_nonoverlap( (int *) 0, // int * woi, // x, y, width,height gpu_clt, // float ** gpu_clt, // [num_cams] ->[TILES-Y][TILES-X][colors][DTT_SIZE*DTT_SIZE] *pnum_texture_tiles, // size_t num_texture_tiles, // number of texture tiles to process 0, // gpu_texture_indices_offset,// add to gpu_texture_indices gpu_texture_indices, // int * gpu_texture_indices,// packed tile + bits (now only (1 << 7) gpu_geometry_correction, // struct gc * gpu_geometry_correction, colors, // int colors, // number of colors (3/1) Loading @@ -2873,7 +2877,7 @@ extern "C" __global__ void textures_nonoverlap( (float *) 0, // float * gpu_texture_rbg, // (number of colors +1 + ?)*16*16 rgba texture tiles texture_stride, // size_t texture_stride, // in floats (now 256*4 = 1024) gpu_texture_tiles, // (float *)0);// float * gpu_texture_tiles); // (number of colors +1 + ?)*16*16 rgba texture tiles 1, // int linescan_order, // if !=0 then output gpu_diff_rgb_combo in linescan order, else - in gpu_texture_indices order linescan_order, // int linescan_order, // if !=0 then output gpu_diff_rgb_combo in linescan order, else - in gpu_texture_indices order gpu_diff_rgb_combo, //); // float * gpu_diff_rgb_combo) // diff[num_cams], R[num_cams], B[num_cams],G[num_cams] num_tilesx); } Loading @@ -2892,6 +2896,7 @@ extern "C" __global__ void textures_nonoverlap( * @param woi WoI for the output texture (x,y,width,height of the woi), may be null if overlapped output is not used * @param gpu_clt array of num_cams pointers to the CLT (frequency domain) data [TILES-Y][TILES-X][NUM_COLORS][DTT_SIZE*DTT_SIZE] * @param num_texture_tiles number of texture tiles to process * @param gpu_texture_indices_offset add to gpu_texture_indices * @param gpu_texture_indices array - 1 integer per tile to process * @param gpu_geometry_correction geometry correction structure, used for rXY to determine pairs weight * @param colors number of colors used: 3 for RGB or 1 for monochrome Loading @@ -2918,6 +2923,7 @@ extern "C" __global__ void textures_accumulate( // (8,4,1) (N,1,1) int * woi, // x, y, width,height float ** gpu_clt, // [num_cams] ->[TILES-Y][TILES-X][colors][DTT_SIZE*DTT_SIZE] size_t num_texture_tiles, // number of texture tiles to process int gpu_texture_indices_offset,// add to gpu_texture_indices int * gpu_texture_indices,// packed tile + bits (now only (1 << 7) struct gc * gpu_geometry_correction, int colors, // number of colors (3/1) Loading Loading @@ -2959,7 +2965,7 @@ extern "C" __global__ void textures_accumulate( // (8,4,1) (N,1,1) return; // nothing to do } // get number of tile int tile_code = gpu_texture_indices[tile_indx]; int tile_code = gpu_texture_indices[tile_indx + gpu_texture_indices_offset]; // Added for Java, no DP if ((tile_code & (1 << CORR_TEXTURE_BIT)) == 0){ return; // nothing to do } Loading Loading @@ -3513,11 +3519,25 @@ __global__ void imclt_rbg_all( int woi_theight, const size_t dstride) // in floats (pixels) { // int num_cams = sizeof(gpu_clt)/sizeof(&gpu_clt[0]); dim3 threads_erase8x8(DTT_SIZE, NUM_THREADS/DTT_SIZE, 1); dim3 grid_erase8x8_right_col (1, woi_theight + 1, 1); dim3 grid_erase8x8_bottom_row(woi_twidth + 1, 1, 1); dim3 threads_imclt(IMCLT_THREADS_PER_TILE, IMCLT_TILES_PER_BLOCK, 1); if (threadIdx.x == 0) { // anyway 1,1,1 for (int ncam = 0; ncam < num_cams; ncam++) { // was NUM_CAMS for (int color = 0; color < colors; color++) { // clear right and bottom 8-pixel column and row float *right_col = gpu_corr_images[ncam] + dstride * (woi_theight * DTT_SIZE + DTT_SIZE) * color + (woi_twidth * DTT_SIZE); erase8x8<<<grid_erase8x8_right_col,threads_erase8x8>>>( right_col, // float * gpu_top_left, dstride); // const size_t dstride); float *bottom_row = gpu_corr_images[ncam] + dstride * (woi_theight * DTT_SIZE + DTT_SIZE) * color + dstride * (woi_theight * DTT_SIZE); erase8x8<<<grid_erase8x8_bottom_row,threads_erase8x8>>>( bottom_row, // float * gpu_top_left, dstride); // const size_t dstride); for (int v_offs = 0; v_offs < 2; v_offs++){ for (int h_offs = 0; h_offs < 2; h_offs++){ int tilesy_half = (woi_theight + (v_offs ^ 1)) >> 1; Loading @@ -3544,7 +3564,25 @@ __global__ void imclt_rbg_all( } } /** * Clear 8x8 tiles, used to erase right and bottom 8-pixel wide column/row before imclt_rbg * @param gpu_top_left - pointer to the top-left corner of the firsr tile to erase * @param dstride - offset for 1 pixel step down * block.x - horizontal tile offset * block.y - vertical tile offset * 0<=thread.x < 8 - horizontal pixel offset * 0<=thread.y < 4 - vertical pixel offset */ extern "C" __global__ void erase8x8( float * gpu_top_left, const size_t dstride) { float * pixel = gpu_top_left + (((blockIdx.y * DTT_SIZE) + threadIdx.y) * dstride) + ((blockIdx.x * DTT_SIZE) + threadIdx.x); * pixel = 0.0f; pixel += dstride * blockDim.y; // add 4 pixel rows (assuming blockDim.x==4) * pixel = 0.0f; } /** * Helper kernel for imclt_rbg_all(), generate per-camera -per color image from the in-memory frequency domain representation. Loading Loading @@ -3573,7 +3611,7 @@ __global__ void imclt_rbg( const size_t dstride) // in floats (pixels) { float *color_plane = gpu_rbg + dstride * (woi_theight * DTT_SIZE + DTT_SIZE) * color; int pass = (v_offset << 1) + h_offset; // 0..3 to correctly acummulate 16x16 tiles stride 8 int pass = (v_offset << 1) + h_offset; // 0..3 to correctly accumulate 16x16 tiles stride 8 int tile_in_block = threadIdx.y; int tile_num = blockIdx.x * IMCLT_TILES_PER_BLOCK + tile_in_block; int tilesx_half = (woi_twidth + (h_offset ^ 1)) >> 1; Loading
src/TileProcessor.h +9 −4 Original line number Diff line number Diff line Loading @@ -49,7 +49,7 @@ extern "C" __global__ void convert_direct( // called with a single block, single float ** gpu_kernel_offsets, // [NUM_CAMS], float ** gpu_kernels, // [NUM_CAMS], float ** gpu_images, // [NUM_CAMS], float * gpu_ftasks, // flattened tasks, 27 floats for quad EO, 99 floats for LWIR16 float * gpu_ftasks, // flattened tasks, 29 floats for quad EO, 101 floats for LWIR16 // struct tp_task * gpu_tasks, float ** gpu_clt, // [NUM_CAMS][TILES-Y][TILES-X][NUM_COLORS][DTT_SIZE*DTT_SIZE] size_t dstride, // in floats (pixels) Loading @@ -76,7 +76,7 @@ extern "C" __global__ void correlate2D( float scale1, // scale for B float scale2, // scale for G float fat_zero, // here - absolute float * gpu_ftasks, // flattened tasks, 27 floats for quad EO, 99 floats for LWIR16 float * gpu_ftasks, // flattened tasks, 29 floats for quad EO, 101 floats for LWIR16 // struct tp_task * gpu_tasks, // array of per-tile tasks (now bits 4..9 - correlation pairs) int num_tiles, // number of tiles in task int tilesx, // number of tile rows Loading Loading @@ -109,7 +109,7 @@ extern "C" __global__ void corr2D_combine( extern "C" __global__ void textures_nonoverlap( int num_cams, // number of cameras float * gpu_ftasks, // flattened tasks, 27 floats for quad EO, 99 floats float * gpu_ftasks, // flattened tasks, 29 floats for quad EO, 101 floats // struct tp_task * gpu_tasks, int num_tiles, // number of tiles in task list // int num_tilesx, // number of tiles in a row Loading @@ -127,6 +127,7 @@ extern "C" __global__ void textures_nonoverlap( // combining both non-overlap and overlap (each calculated if pointer is not null ) size_t texture_stride, // in floats (now 256*4 = 1024) // may be 0 if not needed float * gpu_texture_tiles, // (number of colors +1 + ?)*16*16 rgba texture tiles // may be 0 if not needed int linescan_order, // 0 low-res tiles have tghe same order, as gpu_texture_indices, 1 - in linescan order float * gpu_diff_rgb_combo, //); // diff[NUM_CAMS], R[NUM_CAMS], B[NUM_CAMS],G[NUM_CAMS] // may be 0 if not needed int num_tilesx); Loading @@ -141,6 +142,10 @@ __global__ void imclt_rbg_all( int woi_theight, const size_t dstride); // in floats (pixels) extern "C" __global__ void erase8x8( float * gpu_top_left, const size_t dstride); extern "C" __global__ void imclt_rbg( float * gpu_clt, // [TILES-Y][TILES-X][NUM_COLORS][DTT_SIZE*DTT_SIZE] float * gpu_rbg, // WIDTH, 3 * HEIGHT Loading @@ -156,7 +161,7 @@ extern "C" __global__ void imclt_rbg( extern "C" __global__ void generate_RBGA( int num_cams, // number of cameras used // Parameters to generate texture tasks float * gpu_ftasks, // flattened tasks, 27 floats for quad EO, 99 floats for LWIR16 float * gpu_ftasks, // flattened tasks, 29 floats for quad EO, 101 floats for LWIR16 // struct tp_task * gpu_tasks, int num_tiles, // number of tiles in task list // declare arrays in device code? Loading
src/test_tp.cu +9 −7 Original line number Diff line number Diff line Loading @@ -31,8 +31,8 @@ */ #define NOCORR #define NOCORR_TD #define NOTEXTURES_HOST //#define NOCORR_TD //#define NOTEXTURES_HOST #define NOTEXTURES #define NOTEXTURE_RGBA #define SAVE_CLT Loading Loading @@ -492,7 +492,9 @@ void generate_RBGA_host( gpu_woi, // int * woi, // x, y, width,height gpu_clt, // float ** gpu_clt, // [num_cams] ->[TILES-Y][TILES-X][colors][DTT_SIZE*DTT_SIZE] ntt, // size_t num_texture_tiles, // number of texture tiles to process gpu_texture_indices + ti_offset, // int * gpu_texture_indices,// packed tile + bits (now only (1 << 7) ti_offset, // gpu_texture_indices_offset,// add to gpu_texture_indices gpu_texture_indices, // + ti_offset, // int * gpu_texture_indices,// packed tile + bits (now only (1 << 7) // gpu_texture_indices + ti_offset, // int * gpu_texture_indices,// packed tile + bits (now only (1 << 7) gpu_geometry_correction, // struct gc * gpu_geometry_correction, colors, // int colors, // number of colors (3/1) is_lwir, // int is_lwir, // do not perform shot correction Loading Loading @@ -1626,7 +1628,6 @@ int main(int argc, char **argv) // FIXME: provide sel_pairs correlate2D<<<1,1>>>( // output TD tiles, no normalization num_cams, // int num_cams, // 0, // int * sel_pairs, // unused bits should be 0 sel_pairs[0], // int sel_pairs0 // unused bits should be 0 sel_pairs[1], // int sel_pairs1, // unused bits should be 0 sel_pairs[2], // int sel_pairs2, // unused bits should be 0 Loading @@ -1638,7 +1639,6 @@ int main(int argc, char **argv) color_weights[2], // 0.5, // float scale2, // scale for G 30.0, // float fat_zero, // here - absolute gpu_ftasks, // float * gpu_ftasks, // flattened tasks, 27 floats for quad EO, 99 floats for LWIR16 // gpu_tasks, // struct tp_task * gpu_tasks, tp_task_size, // int num_tiles) // number of tiles in task TILESX, // int tilesx, // number of tile rows gpu_corr_indices, // int * gpu_corr_indices, // packed tile+pair Loading Loading @@ -1795,6 +1795,7 @@ int main(int argc, char **argv) (int *) 0, // int * woi, // x, y, width,height gpu_clt, // float ** gpu_clt, // [num_cams] ->[TILES-Y][TILES-X][colors][DTT_SIZE*DTT_SIZE] cpu_pnum_texture_tiles, // *pnum_texture_tiles, // size_t num_texture_tiles, // number of texture tiles to process 0, // gpu_texture_indices_offset,// add to gpu_texture_indices gpu_texture_indices, // int * gpu_texture_indices,// packed tile + bits (now only (1 << 7) gpu_geometry_correction, // struct gc * gpu_geometry_correction, texture_colors, // int colors, // number of colors (3/1) Loading Loading @@ -1949,7 +1950,7 @@ int main(int argc, char **argv) // printf("grid_texture=(%d, %d, %d)\n",grid_texture.x,grid_texture.y,grid_texture.z); StopWatchInterface *timerTEXTURE = 0; sdkCreateTimer(&timerTEXTURE); int linescan_order = 1; // output low-res in linescan order, 0 - in gpu_texture_indices order for (int i = i0; i < numIterations; i++) { if (i == 0) Loading Loading @@ -1986,7 +1987,8 @@ int main(int argc, char **argv) 1, // int dust_remove, // Do not reduce average weight when only one image differes much from the average // combining both non-overlap and overlap (each calculated if pointer is not null ) 0, // dstride_textures/sizeof(float), // size_t texture_stride, // in floats (now 256*4 = 1024) // may be 0 if not needed (float *) 0, // gpu_textures, // float * gpu_texture_tiles, // (number of colors +1 + ?)*16*16 rgba texture tiles // may be 0 if not needed (float *) 0, // gpu_textures, // float * gpu_texture_tiles, // (number of colors +1 + ?)*16*16 rgba texture tiles // may be 0 if not needed\ linescan_order, // int linescan_order, // 0 low-res tiles have tghe same order, as gpu_texture_indices, 1 - in linescan order gpu_diff_rgb_combo, //); // float * gpu_diff_rgb_combo); // diff[NUM_CAMS], R[NUM_CAMS], B[NUM_CAMS],G[NUM_CAMS] // may be 0 if not needed TILESX); getLastCudaError("Kernel failure"); Loading
src/tp_defines.h +1 −1 Original line number Diff line number Diff line Loading @@ -134,7 +134,7 @@ #define DEBUG8 1 #define DEBUG9 1 */ #define DEBUG8A 1 //#define DEBUG8A 1 // generate_RBGA_host //textures //#define DEBUG10 1 //#define DEBUG11 1 Loading