@@ -402,53 +402,53 @@ int GPUChainTracking::Init()
402402 return 0 ;
403403}
404404
405- void GPUChainTracking::UpdateGPUCalibObjects (int stream)
405+ void GPUChainTracking::UpdateGPUCalibObjects (int stream, const GPUCalibObjectsConst* ptrMask )
406406{
407- if (processors ()->calibObjects .fastTransform ) {
407+ if (processors ()->calibObjects .fastTransform && (ptrMask == nullptr || ptrMask-> fastTransform ) ) {
408408 memcpy ((void *)mFlatObjectsShadow .mCalibObjects .fastTransform , (const void *)processors ()->calibObjects .fastTransform , sizeof (*processors ()->calibObjects .fastTransform ));
409409 memcpy ((void *)mFlatObjectsShadow .mTpcTransformBuffer , (const void *)processors ()->calibObjects .fastTransform ->getFlatBufferPtr (), processors ()->calibObjects .fastTransform ->getFlatBufferSize ());
410410 mFlatObjectsShadow .mCalibObjects .fastTransform ->clearInternalBufferPtr ();
411411 mFlatObjectsShadow .mCalibObjects .fastTransform ->setActualBufferAddress (mFlatObjectsShadow .mTpcTransformBuffer );
412412 mFlatObjectsShadow .mCalibObjects .fastTransform ->setFutureBufferAddress (mFlatObjectsDevice .mTpcTransformBuffer );
413413 }
414- if (processors ()->calibObjects .fastTransformRef ) {
414+ if (processors ()->calibObjects .fastTransformRef && (ptrMask == nullptr || ptrMask-> fastTransformRef ) ) {
415415 memcpy ((void *)mFlatObjectsShadow .mCalibObjects .fastTransformRef , (const void *)processors ()->calibObjects .fastTransformRef , sizeof (*processors ()->calibObjects .fastTransformRef ));
416416 memcpy ((void *)mFlatObjectsShadow .mTpcTransformRefBuffer , (const void *)processors ()->calibObjects .fastTransformRef ->getFlatBufferPtr (), processors ()->calibObjects .fastTransformRef ->getFlatBufferSize ());
417417 mFlatObjectsShadow .mCalibObjects .fastTransformRef ->clearInternalBufferPtr ();
418418 mFlatObjectsShadow .mCalibObjects .fastTransformRef ->setActualBufferAddress (mFlatObjectsShadow .mTpcTransformRefBuffer );
419419 mFlatObjectsShadow .mCalibObjects .fastTransformRef ->setFutureBufferAddress (mFlatObjectsDevice .mTpcTransformRefBuffer );
420420 }
421- if (processors ()->calibObjects .fastTransformHelper ) {
421+ if (processors ()->calibObjects .fastTransformHelper && (ptrMask == nullptr || ptrMask-> fastTransformHelper ) ) {
422422 memcpy ((void *)mFlatObjectsShadow .mCalibObjects .fastTransformHelper , (const void *)processors ()->calibObjects .fastTransformHelper , sizeof (*processors ()->calibObjects .fastTransformHelper ));
423423 mFlatObjectsShadow .mCalibObjects .fastTransformHelper ->setCorrMap (mFlatObjectsShadow .mCalibObjects .fastTransform );
424424 mFlatObjectsShadow .mCalibObjects .fastTransformHelper ->setCorrMapRef (mFlatObjectsShadow .mCalibObjects .fastTransformRef );
425425 }
426426#ifdef GPUCA_HAVE_O2HEADERS
427- if (processors ()->calibObjects .dEdxCalibContainer ) {
427+ if (processors ()->calibObjects .dEdxCalibContainer && (ptrMask == nullptr || ptrMask-> dEdxCalibContainer ) ) {
428428 memcpy ((void *)mFlatObjectsShadow .mCalibObjects .dEdxCalibContainer , (const void *)processors ()->calibObjects .dEdxCalibContainer , sizeof (*processors ()->calibObjects .dEdxCalibContainer ));
429429 memcpy ((void *)mFlatObjectsShadow .mdEdxSplinesBuffer , (const void *)processors ()->calibObjects .dEdxCalibContainer ->getFlatBufferPtr (), processors ()->calibObjects .dEdxCalibContainer ->getFlatBufferSize ());
430430 mFlatObjectsShadow .mCalibObjects .dEdxCalibContainer ->clearInternalBufferPtr ();
431431 mFlatObjectsShadow .mCalibObjects .dEdxCalibContainer ->setActualBufferAddress (mFlatObjectsShadow .mdEdxSplinesBuffer );
432432 mFlatObjectsShadow .mCalibObjects .dEdxCalibContainer ->setFutureBufferAddress (mFlatObjectsDevice .mdEdxSplinesBuffer );
433433 }
434- if (processors ()->calibObjects .matLUT ) {
434+ if (processors ()->calibObjects .matLUT && (ptrMask == nullptr || ptrMask-> matLUT ) ) {
435435 memcpy ((void *)mFlatObjectsShadow .mCalibObjects .matLUT , (const void *)processors ()->calibObjects .matLUT , sizeof (*processors ()->calibObjects .matLUT ));
436436 memcpy ((void *)mFlatObjectsShadow .mMatLUTBuffer , (const void *)processors ()->calibObjects .matLUT ->getFlatBufferPtr (), processors ()->calibObjects .matLUT ->getFlatBufferSize ());
437437 mFlatObjectsShadow .mCalibObjects .matLUT ->clearInternalBufferPtr ();
438438 mFlatObjectsShadow .mCalibObjects .matLUT ->setActualBufferAddress (mFlatObjectsShadow .mMatLUTBuffer );
439439 mFlatObjectsShadow .mCalibObjects .matLUT ->setFutureBufferAddress (mFlatObjectsDevice .mMatLUTBuffer );
440440 }
441- if (processors ()->calibObjects .trdGeometry ) {
441+ if (processors ()->calibObjects .trdGeometry && (ptrMask == nullptr || ptrMask-> trdGeometry ) ) {
442442 memcpy ((void *)mFlatObjectsShadow .mCalibObjects .trdGeometry , (const void *)processors ()->calibObjects .trdGeometry , sizeof (*processors ()->calibObjects .trdGeometry ));
443443 mFlatObjectsShadow .mCalibObjects .trdGeometry ->clearInternalBufferPtr ();
444444 }
445- if (processors ()->calibObjects .tpcPadGain ) {
445+ if (processors ()->calibObjects .tpcPadGain && (ptrMask == nullptr || ptrMask-> tpcPadGain ) ) {
446446 memcpy ((void *)mFlatObjectsShadow .mCalibObjects .tpcPadGain , (const void *)processors ()->calibObjects .tpcPadGain , sizeof (*processors ()->calibObjects .tpcPadGain ));
447447 }
448- if (processors ()->calibObjects .tpcZSLinkMapping ) {
448+ if (processors ()->calibObjects .tpcZSLinkMapping && (ptrMask == nullptr || ptrMask-> tpcZSLinkMapping ) ) {
449449 memcpy ((void *)mFlatObjectsShadow .mCalibObjects .tpcZSLinkMapping , (const void *)processors ()->calibObjects .tpcZSLinkMapping , sizeof (*processors ()->calibObjects .tpcZSLinkMapping ));
450450 }
451- if (processors ()->calibObjects .o2Propagator ) {
451+ if (processors ()->calibObjects .o2Propagator && (ptrMask == nullptr || ptrMask-> o2Propagator ) ) {
452452 memcpy ((void *)mFlatObjectsShadow .mCalibObjects .o2Propagator , (const void *)processors ()->calibObjects .o2Propagator , sizeof (*processors ()->calibObjects .o2Propagator ));
453453 mFlatObjectsShadow .mCalibObjects .o2Propagator ->setGPUField (&processorsDevice ()->param .polynomialField );
454454 mFlatObjectsShadow .mCalibObjects .o2Propagator ->setBz (param ().polynomialField .GetNominalBz ());
@@ -618,8 +618,15 @@ void GPUChainTracking::DoQueuedCalibUpdates(int stream)
618618 }
619619 }
620620 if (mRec ->IsGPU ()) {
621+ std::array<unsigned char , sizeof (GPUTrackingFlatObjects)> oldFlatPtrs, oldFlatPtrsDevice;
622+ memcpy (oldFlatPtrs.data (), (void *)&mFlatObjectsShadow , oldFlatPtrs.size ());
623+ memcpy (oldFlatPtrsDevice.data (), (void *)&mFlatObjectsDevice , oldFlatPtrsDevice.size ());
621624 mRec ->ResetRegisteredMemoryPointers (mFlatObjectsShadow .mMemoryResFlat );
622- UpdateGPUCalibObjects (stream);
625+ bool ptrsChanged = memcmp (oldFlatPtrs.data (), (void *)&mFlatObjectsShadow , oldFlatPtrs.size ()) || memcmp (oldFlatPtrsDevice.data (), (void *)&mFlatObjectsDevice , oldFlatPtrsDevice.size ());
626+ if (ptrsChanged) {
627+ GPUInfo (" Updating all calib objects since pointers changed" );
628+ }
629+ UpdateGPUCalibObjects (stream, ptrsChanged ? nullptr : &mNewCalibObjects );
623630 }
624631 if (mNewCalibValues ->newSolenoidField || mNewCalibValues ->newContinuousMaxTimeBin ) {
625632 GPUSettingsGRP grp = mRec ->GetGRPSettings ();
0 commit comments