From f3a1fef493fcbfc3c09f6dcddec1edf9b9e84a0b Mon Sep 17 00:00:00 2001 From: Giulio Eulisse <10544+ktf@users.noreply.github.com> Date: Wed, 22 Apr 2026 09:23:38 +0200 Subject: [PATCH 1/4] Make sure 16 bytes alignment is still enforced Unaligned vectorised accesses on aarch64 are not available and result in verified sporadic crashes in the CI. --- .../TPCFastSpaceChargeCorrection.cxx | 10 +++++++--- GPU/TPCFastTransformation/TPCFastTransformPOD.cxx | 2 ++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx b/GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx index 66029daeea710..a27f118721496 100644 --- a/GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx +++ b/GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx @@ -147,6 +147,7 @@ void TPCFastSpaceChargeCorrection::setActualBufferAddress(char* actualFlatBuffer } size_t bufferSize = scBufferOffset + scBufferSize; for (int32_t is = 0; is < 3; is++) { + bufferSize = alignSize(bufferSize, SplineType::getParameterAlignmentBytes()); mCorrectionData[is] = reinterpret_cast(mFlatBufferPtr + bufferSize); bufferSize += mSectorDataSizeBytes[is] * mGeo.getNumberOfSectors(); } @@ -255,7 +256,7 @@ void TPCFastSpaceChargeCorrection::setActualBufferAddress(char* actualFlatBuffer for (int32_t is = 0; is < 3; is++) { size_t oldCorrectionDataOffset = alignSize(oldBufferSize, SplineType::getParameterAlignmentBytes()); - size_t correctionDataOffset = bufferSize; + size_t correctionDataOffset = alignSize(bufferSize, SplineType::getParameterAlignmentBytes()); mCorrectionData[is] = reinterpret_cast(mFlatBufferPtr + correctionDataOffset); memmove(mCorrectionData[is], mFlatBufferPtr + oldCorrectionDataOffset, mSectorDataSizeBytes[is] * mGeo.getNumberOfSectors()); oldBufferSize = oldCorrectionDataOffset + mSectorDataSizeBytes[is] * mGeo.getNumberOfSectors(); @@ -508,11 +509,13 @@ void TPCFastSpaceChargeCorrection::finishConstruction() size_t bufferSize = scBufferOffsets[0] + scBufferSize; size_t correctionDataOffset[3]; for (int32_t is = 0; is < 3; is++) { - correctionDataOffset[is] = bufferSize; + correctionDataOffset[is] = alignSize(bufferSize, SplineType::getParameterAlignmentBytes()); + bufferSize = correctionDataOffset[is]; mSectorDataSizeBytes[is] = 0; for (int32_t j = 0; j < mGeo.getNumberOfRows(); j++) { RowInfo& row = getRowInfo(j); - row.dataOffsetBytes[is] = mSectorDataSizeBytes[is]; + row.dataOffsetBytes[is] = alignSize(mSectorDataSizeBytes[is], SplineType::getParameterAlignmentBytes()); + mSectorDataSizeBytes[is] = row.dataOffsetBytes[is]; const SplineType& spline = mConstructionScenarios[row.splineScenarioID]; if (is == 0) { const SplineTypeXYZ& splineXYZ = reinterpret_cast(spline); @@ -525,6 +528,7 @@ void TPCFastSpaceChargeCorrection::finishConstruction() mSectorDataSizeBytes[is] += splineInvYZ.getSizeOfParameters(); } } + mSectorDataSizeBytes[is] = alignSize(mSectorDataSizeBytes[is], SplineType::getParameterAlignmentBytes()); bufferSize += mSectorDataSizeBytes[is] * mGeo.getNumberOfSectors(); } diff --git a/GPU/TPCFastTransformation/TPCFastTransformPOD.cxx b/GPU/TPCFastTransformation/TPCFastTransformPOD.cxx index f6e61bdbbff70..e077c9144d7b4 100644 --- a/GPU/TPCFastTransformation/TPCFastTransformPOD.cxx +++ b/GPU/TPCFastTransformation/TPCFastTransformPOD.cxx @@ -67,6 +67,7 @@ size_t TPCFastTransformPOD::estimateSize(const TPCFastSpaceChargeCorrection& ori } // space for splines data for (int is = 0; is < 3; is++) { + nextDynOffs = FlatObject::alignSize(nextDynOffs, SplineType::getParameterAlignmentBytes()); nextDynOffs += origCorr.mSectorDataSizeBytes[is] * TPCFastTransformGeo::getNumberOfSectors(); } nextDynOffs = alignOffset(nextDynOffs); @@ -159,6 +160,7 @@ TPCFastTransformPOD* TPCFastTransformPOD::create(char* buff, size_t buffSize, co // copy spline data for (int is = 0; is < 3; is++) { + nextDynOffs = FlatObject::alignSize(nextDynOffs, SplineType::getParameterAlignmentBytes()); float* data = reinterpret_cast(buff + nextDynOffs); LOGP(debug, "splinID={} start offset {} -> {}", is, nextDynOffs, (void*)data); From 1d1d3d885f06461c1f33041b7b63cb513534c6c5 Mon Sep 17 00:00:00 2001 From: Giulio Eulisse <10544+ktf@users.noreply.github.com> Date: Thu, 23 Apr 2026 11:08:59 +0200 Subject: [PATCH 2/4] Update GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx Co-authored-by: David Rohr --- GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx b/GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx index a27f118721496..483ebbb16c5cd 100644 --- a/GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx +++ b/GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx @@ -509,8 +509,8 @@ void TPCFastSpaceChargeCorrection::finishConstruction() size_t bufferSize = scBufferOffsets[0] + scBufferSize; size_t correctionDataOffset[3]; for (int32_t is = 0; is < 3; is++) { - correctionDataOffset[is] = alignSize(bufferSize, SplineType::getParameterAlignmentBytes()); - bufferSize = correctionDataOffset[is]; + bufferSize = alignSize(bufferSize, SplineType::getParameterAlignmentBytes()); + correctionDataOffset[is] = bufferSize; mSectorDataSizeBytes[is] = 0; for (int32_t j = 0; j < mGeo.getNumberOfRows(); j++) { RowInfo& row = getRowInfo(j); From 6806c5abce4aed0506d3b92c7c3bf5effcd38502 Mon Sep 17 00:00:00 2001 From: Giulio Eulisse <10544+ktf@users.noreply.github.com> Date: Thu, 23 Apr 2026 11:09:36 +0200 Subject: [PATCH 3/4] Update GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx Co-authored-by: David Rohr --- GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx b/GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx index 483ebbb16c5cd..c40fd4c886534 100644 --- a/GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx +++ b/GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx @@ -527,8 +527,8 @@ void TPCFastSpaceChargeCorrection::finishConstruction() const SplineTypeInvYZ& splineInvYZ = reinterpret_cast(spline); mSectorDataSizeBytes[is] += splineInvYZ.getSizeOfParameters(); } + mSectorDataSizeBytes[is] = alignSize(mSectorDataSizeBytes[is], SplineType::getParameterAlignmentBytes()); } - mSectorDataSizeBytes[is] = alignSize(mSectorDataSizeBytes[is], SplineType::getParameterAlignmentBytes()); bufferSize += mSectorDataSizeBytes[is] * mGeo.getNumberOfSectors(); } From 2e24ae507ae455948a870c9b0228834c3887fa78 Mon Sep 17 00:00:00 2001 From: Giulio Eulisse <10544+ktf@users.noreply.github.com> Date: Thu, 23 Apr 2026 11:09:44 +0200 Subject: [PATCH 4/4] Update GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx Co-authored-by: David Rohr --- GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx b/GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx index c40fd4c886534..68b8d302d67e4 100644 --- a/GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx +++ b/GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx @@ -514,8 +514,7 @@ void TPCFastSpaceChargeCorrection::finishConstruction() mSectorDataSizeBytes[is] = 0; for (int32_t j = 0; j < mGeo.getNumberOfRows(); j++) { RowInfo& row = getRowInfo(j); - row.dataOffsetBytes[is] = alignSize(mSectorDataSizeBytes[is], SplineType::getParameterAlignmentBytes()); - mSectorDataSizeBytes[is] = row.dataOffsetBytes[is]; + row.dataOffsetBytes[is] = mSectorDataSizeBytes[is]; const SplineType& spline = mConstructionScenarios[row.splineScenarioID]; if (is == 0) { const SplineTypeXYZ& splineXYZ = reinterpret_cast(spline);