@@ -229,25 +229,30 @@ __global__ void kProcessBeamSamplesFirstLast(size_t beamCount, int samplesPerBea
229
229
LIMIT (beamCount);
230
230
231
231
const auto beamIdx = tid;
232
- int firstIdx = 0 ;
233
- int lastIdx = 0 ;
232
+ int firstIdx = - 1 ;
233
+ int lastIdx = - 1 ;
234
234
for (int sampleIdx = 0 ; sampleIdx < samplesPerBeam; ++sampleIdx) {
235
235
if (beamSamples.isHit [beamIdx * samplesPerBeam + sampleIdx] == 0 ) {
236
236
continue ;
237
237
}
238
- if (beamSamples.distance [beamIdx * samplesPerBeam + sampleIdx] <
239
- beamSamples.distance [beamIdx * samplesPerBeam + firstIdx]) {
238
+ auto currentFirstDistance = firstIdx >= 0 ? beamSamples.distance [beamIdx * samplesPerBeam + firstIdx] : FLT_MAX;
239
+ auto currentLastDistance = lastIdx >= 0 ? beamSamples.distance [beamIdx * samplesPerBeam + lastIdx] : -FLT_MAX;
240
+ if (beamSamples.distance [beamIdx * samplesPerBeam + sampleIdx] < currentFirstDistance) {
240
241
firstIdx = sampleIdx;
241
242
}
242
- if (beamSamples.distance [beamIdx * samplesPerBeam + sampleIdx] >
243
- beamSamples.distance [beamIdx * samplesPerBeam + lastIdx]) {
243
+ if (beamSamples.distance [beamIdx * samplesPerBeam + sampleIdx] > currentLastDistance) {
244
244
lastIdx = sampleIdx;
245
245
}
246
246
}
247
- first.xyz [beamIdx] = beamSamples.xyz [beamIdx * samplesPerBeam + firstIdx];
248
- first.distance [beamIdx] = beamSamples.distance [beamIdx * samplesPerBeam + firstIdx];
249
- last.xyz [beamIdx] = beamSamples.xyz [beamIdx * samplesPerBeam + lastIdx];
250
- last.distance [beamIdx] = beamSamples.distance [beamIdx * samplesPerBeam + lastIdx];
247
+ bool isHit = firstIdx >= 0 ; // Note that firstHit >= 0 implies lastHit >= 0
248
+ first.isHit [beamIdx] = isHit;
249
+ last.isHit [beamIdx] = isHit;
250
+ if (isHit) {
251
+ first.xyz [beamIdx] = beamSamples.xyz [beamIdx * samplesPerBeam + firstIdx];
252
+ first.distance [beamIdx] = beamSamples.distance [beamIdx * samplesPerBeam + firstIdx];
253
+ last.xyz [beamIdx] = beamSamples.xyz [beamIdx * samplesPerBeam + lastIdx];
254
+ last.distance [beamIdx] = beamSamples.distance [beamIdx * samplesPerBeam + lastIdx];
255
+ }
251
256
}
252
257
253
258
@@ -327,4 +332,4 @@ void gpuProcessBeamSamplesFirstLast(cudaStream_t stream, size_t beamCount, int s
327
332
MultiReturnPointers first, MultiReturnPointers last)
328
333
{
329
334
run (kProcessBeamSamplesFirstLast , stream, beamCount, samplesPerBeam, beamSamples, first, last);
330
- }
335
+ }
0 commit comments