diff --git a/image_analysis/bragg_integration/BraggIntegrationEngineGPU.cu b/image_analysis/bragg_integration/BraggIntegrationEngineGPU.cu index b0a3d6a5..2de35c7d 100644 --- a/image_analysis/bragg_integration/BraggIntegrationEngineGPU.cu +++ b/image_analysis/bragg_integration/BraggIntegrationEngineGPU.cu @@ -434,25 +434,29 @@ BraggIntegrationEngineGPU::BraggIntegrationEngineGPU(const DiffractionExperiment void BraggIntegrationEngineGPU::EnsureCapacity(size_t n) { if (n <= capacity) return; - d_px_x = CudaDevicePtr(n); - d_px_y = CudaDevicePtr(n); - d_d = CudaDevicePtr(n); - d_cx = CudaDevicePtr(n); - d_cy = CudaDevicePtr(n); - d_I = CudaDevicePtr(n); - d_sigma = CudaDevicePtr(n); - d_bkg = CudaDevicePtr(n); - d_obs_x = CudaDevicePtr(n); - d_obs_y = CudaDevicePtr(n); - d_ok = CudaDevicePtr(n); - d_strong = CudaDevicePtr(n); - d_has_obs = CudaDevicePtr(n); + // Grow with slack. cudaMalloc/cudaFree take a device-wide lock in the driver, so growing to + // exactly n makes every image that sets a new reflection-count record stall all other workers. + const size_t new_capacity = std::max(n, capacity + capacity / 2); - h_px_x.resize(n); h_px_y.resize(n); h_d.resize(n); - h_I.resize(n); h_sigma.resize(n); h_bkg.resize(n); - h_obs_x.resize(n); h_obs_y.resize(n); - h_ok.resize(n); h_has_obs.resize(n); - capacity = n; + d_px_x = CudaDevicePtr(new_capacity); + d_px_y = CudaDevicePtr(new_capacity); + d_d = CudaDevicePtr(new_capacity); + d_cx = CudaDevicePtr(new_capacity); + d_cy = CudaDevicePtr(new_capacity); + d_I = CudaDevicePtr(new_capacity); + d_sigma = CudaDevicePtr(new_capacity); + d_bkg = CudaDevicePtr(new_capacity); + d_obs_x = CudaDevicePtr(new_capacity); + d_obs_y = CudaDevicePtr(new_capacity); + d_ok = CudaDevicePtr(new_capacity); + d_strong = CudaDevicePtr(new_capacity); + d_has_obs = CudaDevicePtr(new_capacity); + + h_px_x.resize(new_capacity); h_px_y.resize(new_capacity); h_d.resize(new_capacity); + h_I.resize(new_capacity); h_sigma.resize(new_capacity); h_bkg.resize(new_capacity); + h_obs_x.resize(new_capacity); h_obs_y.resize(new_capacity); + h_ok.resize(new_capacity); h_has_obs.resize(new_capacity); + capacity = new_capacity; } std::vector BraggIntegrationEngineGPU::Run(const ImagePreprocessorBuffer &image,