Skip to content

Commit f3a1fef

Browse files
committed
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.
1 parent 2742e40 commit f3a1fef

2 files changed

Lines changed: 9 additions & 3 deletions

File tree

GPU/TPCFastTransformation/TPCFastSpaceChargeCorrection.cxx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ void TPCFastSpaceChargeCorrection::setActualBufferAddress(char* actualFlatBuffer
147147
}
148148
size_t bufferSize = scBufferOffset + scBufferSize;
149149
for (int32_t is = 0; is < 3; is++) {
150+
bufferSize = alignSize(bufferSize, SplineType::getParameterAlignmentBytes());
150151
mCorrectionData[is] = reinterpret_cast<char*>(mFlatBufferPtr + bufferSize);
151152
bufferSize += mSectorDataSizeBytes[is] * mGeo.getNumberOfSectors();
152153
}
@@ -255,7 +256,7 @@ void TPCFastSpaceChargeCorrection::setActualBufferAddress(char* actualFlatBuffer
255256

256257
for (int32_t is = 0; is < 3; is++) {
257258
size_t oldCorrectionDataOffset = alignSize(oldBufferSize, SplineType::getParameterAlignmentBytes());
258-
size_t correctionDataOffset = bufferSize;
259+
size_t correctionDataOffset = alignSize(bufferSize, SplineType::getParameterAlignmentBytes());
259260
mCorrectionData[is] = reinterpret_cast<char*>(mFlatBufferPtr + correctionDataOffset);
260261
memmove(mCorrectionData[is], mFlatBufferPtr + oldCorrectionDataOffset, mSectorDataSizeBytes[is] * mGeo.getNumberOfSectors());
261262
oldBufferSize = oldCorrectionDataOffset + mSectorDataSizeBytes[is] * mGeo.getNumberOfSectors();
@@ -508,11 +509,13 @@ void TPCFastSpaceChargeCorrection::finishConstruction()
508509
size_t bufferSize = scBufferOffsets[0] + scBufferSize;
509510
size_t correctionDataOffset[3];
510511
for (int32_t is = 0; is < 3; is++) {
511-
correctionDataOffset[is] = bufferSize;
512+
correctionDataOffset[is] = alignSize(bufferSize, SplineType::getParameterAlignmentBytes());
513+
bufferSize = correctionDataOffset[is];
512514
mSectorDataSizeBytes[is] = 0;
513515
for (int32_t j = 0; j < mGeo.getNumberOfRows(); j++) {
514516
RowInfo& row = getRowInfo(j);
515-
row.dataOffsetBytes[is] = mSectorDataSizeBytes[is];
517+
row.dataOffsetBytes[is] = alignSize(mSectorDataSizeBytes[is], SplineType::getParameterAlignmentBytes());
518+
mSectorDataSizeBytes[is] = row.dataOffsetBytes[is];
516519
const SplineType& spline = mConstructionScenarios[row.splineScenarioID];
517520
if (is == 0) {
518521
const SplineTypeXYZ& splineXYZ = reinterpret_cast<const SplineTypeXYZ&>(spline);
@@ -525,6 +528,7 @@ void TPCFastSpaceChargeCorrection::finishConstruction()
525528
mSectorDataSizeBytes[is] += splineInvYZ.getSizeOfParameters();
526529
}
527530
}
531+
mSectorDataSizeBytes[is] = alignSize(mSectorDataSizeBytes[is], SplineType::getParameterAlignmentBytes());
528532
bufferSize += mSectorDataSizeBytes[is] * mGeo.getNumberOfSectors();
529533
}
530534

GPU/TPCFastTransformation/TPCFastTransformPOD.cxx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ size_t TPCFastTransformPOD::estimateSize(const TPCFastSpaceChargeCorrection& ori
6767
}
6868
// space for splines data
6969
for (int is = 0; is < 3; is++) {
70+
nextDynOffs = FlatObject::alignSize(nextDynOffs, SplineType::getParameterAlignmentBytes());
7071
nextDynOffs += origCorr.mSectorDataSizeBytes[is] * TPCFastTransformGeo::getNumberOfSectors();
7172
}
7273
nextDynOffs = alignOffset(nextDynOffs);
@@ -159,6 +160,7 @@ TPCFastTransformPOD* TPCFastTransformPOD::create(char* buff, size_t buffSize, co
159160

160161
// copy spline data
161162
for (int is = 0; is < 3; is++) {
163+
nextDynOffs = FlatObject::alignSize(nextDynOffs, SplineType::getParameterAlignmentBytes());
162164
float* data = reinterpret_cast<float*>(buff + nextDynOffs);
163165
LOGP(debug, "splinID={} start offset {} -> {}", is, nextDynOffs, (void*)data);
164166

0 commit comments

Comments
 (0)