Skip to content

Commit 3b45775

Browse files
Virginia Brancatogmgunter
authored andcommitted
Fix rdr2geo and geo2rdr lines_per_block bug (#996)
* Add getter/setter for geor2rdr processing params * Avoid linesPerBlock to be overriden * Avoid overrid of linesPerBlock in CUDA topo * Add getter/setter for linesPerBlocks in CUDA Topo * Fix issues due to shadowing of _linesPerBlock member in Geo2rdr/Topo * Remove `_linesPerBlock` member variable in derived classes that shadowed the member with the same name in the base class, leading to unexpected behavior * Replace instances of private base member `_linesPerBlock` in derived classes with `linesPerBlock()` getter method instead * Remove `computeLinesPerBlock()` methods * Remove commented code Co-authored-by: Geoffrey M Gunter <[email protected]>
1 parent 4cdb87f commit 3b45775

File tree

4 files changed

+10
-93
lines changed

4 files changed

+10
-93
lines changed

cxx/isce3/cuda/geometry/Geo2rdr.cpp

Lines changed: 4 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,9 @@ geo2rdr(isce3::io::Raster & topoRaster,
102102
// Interpolate orbit to middle of the scene as a test
103103
_checkOrbitInterpolation(tmid);
104104

105-
// Compute number of lines per block
106-
computeLinesPerBlock();
107-
108105
// Compute number of DEM blocks needed to process image
109-
size_t nBlocks = demLength / _linesPerBlock;
110-
if ((demLength % _linesPerBlock) != 0)
106+
size_t nBlocks = demLength / linesPerBlock();
107+
if ((demLength % linesPerBlock()) != 0)
111108
nBlocks += 1;
112109

113110
// Cache near, mid, far ranges for diagnostics on Doppler
@@ -121,11 +118,11 @@ geo2rdr(isce3::io::Raster & topoRaster,
121118

122119
// Get block extents
123120
size_t lineStart, blockLength;
124-
lineStart = block * _linesPerBlock;
121+
lineStart = block * linesPerBlock();
125122
if (block == (nBlocks - 1)) {
126123
blockLength = demLength - lineStart;
127124
} else {
128-
blockLength = _linesPerBlock;
125+
blockLength = linesPerBlock();
129126
}
130127
size_t blockSize = blockLength * demWidth;
131128

@@ -194,33 +191,3 @@ _checkOrbitInterpolation(double aztime) {
194191
isce3::core::cartesian_t satxyz, satvel;
195192
this->orbit().interpolate(&satxyz, &satvel, aztime);
196193
}
197-
198-
// Compute number of lines per block dynamically from GPU memory
199-
void isce3::cuda::geometry::Geo2rdr::
200-
computeLinesPerBlock() {
201-
202-
// Compute GPU memory
203-
const size_t nGPUBytes = getDeviceMem();
204-
205-
// 2 GB buffer for safeguard for large enough devices (> 6 GB)
206-
size_t gpuBuffer;
207-
if (nGPUBytes > 6e9) {
208-
gpuBuffer = 2e9;
209-
} else {
210-
// Else use 500 MB buffer
211-
gpuBuffer = 500e6;
212-
}
213-
214-
// Compute pixels per Block (3 double input layers and 2 float output layers)
215-
size_t pixelsPerBlock = (nGPUBytes - gpuBuffer) /
216-
(3 * sizeof(double) + 2 * sizeof(float));
217-
// Round down to nearest 10 million pixels
218-
pixelsPerBlock = (pixelsPerBlock / 10000000) * 10000000;
219-
220-
// Compute number of lines per block
221-
_linesPerBlock = pixelsPerBlock / this->radarGridParameters().width();
222-
// Round down to nearest 500 lines
223-
_linesPerBlock = (_linesPerBlock / 500) * 500;
224-
}
225-
226-
// end of file

cxx/isce3/cuda/geometry/Geo2rdr.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,6 @@ class isce3::cuda::geometry::Geo2rdr : public isce3::geometry::Geo2rdr {
4747
const std::string & outdir,
4848
double azshift=0.0, double rgshift=0.0);
4949

50-
private:
51-
// Default number of lines per block
52-
size_t _linesPerBlock = 1000;
53-
5450
private:
5551
/** Print extents and image info */
5652
void _printExtents(pyre::journal::info_t &,
@@ -60,7 +56,4 @@ class isce3::cuda::geometry::Geo2rdr : public isce3::geometry::Geo2rdr {
6056

6157
/** Check we can interpolate orbit to middle of DEM */
6258
void _checkOrbitInterpolation(double);
63-
64-
/** Compute number of lines per block dynamically from GPU memmory */
65-
void computeLinesPerBlock();
6659
};

cxx/isce3/cuda/geometry/Topo.cpp

Lines changed: 6 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ topo(Raster & demRaster,
5252

5353
// Initialize a TopoLayers object to handle block data and raster data
5454
TopoLayers layers(outdir, radarGrid.width(), radarGrid.length(),
55-
_linesPerBlock, this->computeMask());
55+
linesPerBlock(), this->computeMask());
5656

5757
// Call topo with layers
5858
topo(demRaster, layers);
@@ -102,7 +102,7 @@ topo(Raster & demRaster, Raster * xRaster, Raster * yRaster, Raster * heightRast
102102

103103
// Initialize a TopoLayers object to handle block data and raster data
104104
// Create rasters for individual layers (provide output raster sizes)
105-
TopoLayers layers(_linesPerBlock, xRaster, yRaster, heightRaster, incRaster,
105+
TopoLayers layers(linesPerBlock(), xRaster, yRaster, heightRaster, incRaster,
106106
hdgRaster, localIncRaster, localPsiRaster, simRaster,
107107
maskRaster);
108108

@@ -135,12 +135,9 @@ topo(Raster & demRaster, TopoLayers & layers) {
135135
// Create a DEM interpolator
136136
DEMInterpolator demInterp(-500.0, this->demMethod());
137137

138-
// Compute number of lines per block
139-
computeLinesPerBlock(demRaster, layers);
140-
141138
// Compute number of blocks needed to process image
142-
size_t nBlocks = radarGrid.length() / _linesPerBlock;
143-
if ((radarGrid.length() % _linesPerBlock) != 0)
139+
size_t nBlocks = radarGrid.length() / linesPerBlock();
140+
if ((radarGrid.length() % linesPerBlock()) != 0)
144141
nBlocks += 1;
145142

146143
// Cache near, mid, far ranges for diagnostics on Doppler
@@ -154,11 +151,11 @@ topo(Raster & demRaster, TopoLayers & layers) {
154151

155152
// Get block extents
156153
size_t lineStart, blockLength;
157-
lineStart = block * _linesPerBlock;
154+
lineStart = block * linesPerBlock();
158155
if (block == (nBlocks - 1)) {
159156
blockLength = radarGrid.length() - lineStart;
160157
} else {
161-
blockLength = _linesPerBlock;
158+
blockLength = linesPerBlock();
162159
}
163160

164161
// Diagnostics
@@ -214,39 +211,6 @@ topo(Raster & demRaster, TopoLayers & layers) {
214211
<< pyre::journal::newline;
215212
}
216213

217-
// Compute number of lines per block dynamically from GPU memory
218-
void isce3::cuda::geometry::Topo::
219-
computeLinesPerBlock(isce3::io::Raster & demRaster, TopoLayers & layers) {
220-
221-
// Compute GPU memory
222-
const size_t nGPUBytes = getDeviceMem();
223-
224-
// Assume entire DEM passed to GPU
225-
const size_t nDEMBytes = demRaster.width() * demRaster.length() * sizeof(float);
226-
227-
// 2 GB buffer for safeguard for large enough devices (> 6 GB)
228-
size_t gpuBuffer;
229-
if (nGPUBytes > 6e9) {
230-
gpuBuffer = 2e9;
231-
} else {
232-
// Else use 500 MB buffer
233-
gpuBuffer = 500e6;
234-
}
235-
236-
// Compute pixels per Block (4 double and 5 float output topo layers)
237-
size_t pixelsPerBlock = (nGPUBytes - nDEMBytes - gpuBuffer) /
238-
(4 * sizeof(double) + 5 * sizeof(float));
239-
// Round down to nearest 10 million pixels
240-
pixelsPerBlock = (pixelsPerBlock / 10000000) * 10000000;
241-
242-
// Compute number of lines per block
243-
_linesPerBlock = pixelsPerBlock / this->radarGridParameters().width();
244-
// Round down to nearest 500 lines
245-
_linesPerBlock = (_linesPerBlock / 500) * 500;
246-
// Make sure we don't exceed number of lines in topo rasters
247-
_linesPerBlock = std::min(_linesPerBlock, layers.length());
248-
}
249-
250214
// Compute layover and shadow masks
251215
void isce3::cuda::geometry::Topo::
252216
_setLayoverShadowWithOrbit(const Orbit & orbit,

cxx/isce3/cuda/geometry/Topo.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,6 @@ class isce3::cuda::geometry::Topo : public isce3::geometry::Topo {
5555
void topo(isce3::io::Raster &, isce3::geometry::TopoLayers &);
5656

5757
private:
58-
// Default number of lines per block
59-
size_t _linesPerBlock = 1000;
60-
61-
// Compute number of lines per block dynamically from GPU memmory
62-
void computeLinesPerBlock(isce3::io::Raster &,
63-
isce3::geometry::TopoLayers &);
64-
6558
// Generate layover/shadow masks using an orbit
6659
void _setLayoverShadowWithOrbit(const isce3::core::Orbit & orbit,
6760
isce3::geometry::TopoLayers & layers,

0 commit comments

Comments
 (0)