StimBuff: Use a single StagingBuffer for all StimFrames

We now allocate all the stimFrames for a StimBuffer using a
single StagingBuffer. This gives us all the benefits we're
looking for (pinning, alignment, etc).
This commit is contained in:
2025-11-19 03:08:16 -04:00
parent 3f04d1b387
commit 41b8385cb2
8 changed files with 93 additions and 57 deletions
+2 -3
View File
@@ -23,11 +23,10 @@ public:
const std::shared_ptr<device::DeviceAttachmentSpec>& deviceAttachmentSpec,
int histbuffMs,
const StagingBuffer::IOEngineConstraints& inputEngineConstraints,
const StagingBuffer::IOEngineConstraints& outputEngineConstraints,
size_t nSlotsPerStimFrame)
const StagingBuffer::IOEngineConstraints& outputEngineConstraints)
: StimulusBuffer(
parent, deviceAttachmentSpec, histbuffMs,
inputEngineConstraints, outputEngineConstraints, nSlotsPerStimFrame)
inputEngineConstraints, outputEngineConstraints)
{}
~MeshStimulusBuffer() = default;
@@ -23,11 +23,10 @@ public:
const std::shared_ptr<device::DeviceAttachmentSpec>& deviceAttachmentSpec,
int histbuffMs,
const StagingBuffer::IOEngineConstraints& inputEngineConstraints,
const StagingBuffer::IOEngineConstraints& outputEngineConstraints,
size_t nSlotsPerStimFrame)
const StagingBuffer::IOEngineConstraints& outputEngineConstraints)
: StimulusBuffer(
parent, deviceAttachmentSpec, histbuffMs,
inputEngineConstraints, outputEngineConstraints, nSlotsPerStimFrame)
inputEngineConstraints, outputEngineConstraints)
{}
~PcloudAmbienceStimulusBuffer() = default;
@@ -24,11 +24,10 @@ public:
&deviceAttachmentSpec,
int histbuffMs,
const StagingBuffer::IOEngineConstraints& inputEngineConstraints,
const StagingBuffer::IOEngineConstraints& outputEngineConstraints,
size_t nSlotsPerStimFrame)
const StagingBuffer::IOEngineConstraints& outputEngineConstraints)
: StimulusBuffer(
parent, deviceAttachmentSpec, histbuffMs,
inputEngineConstraints, outputEngineConstraints, nSlotsPerStimFrame)
inputEngineConstraints, outputEngineConstraints)
{}
~PcloudIntensityStimulusBuffer() = default;
@@ -18,10 +18,24 @@ extern const SmoCallbacks* smoHooksPtr;
// OpenCL kernels are used to collate and produce our StimFrames.
static StagingBuffer::IOEngineConstraints openClInputConstraints(
/** FIXME:
* This should eventually be aligned to 4B and padded to 12B.
*/
// slotStartAlignmentByteVal (page alignment)
sizeof(float) * 3,
sizeof(float) * 4,
// slotPadToNBytes (pointer size)
sizeof(void *),
sizeof(float) * 4,
// frameStartAlignmentByteVal (page alignment)
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
// framePadToNBytes (pointer size)
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)));
// OpenCL kernels are used to collate and produce our StimFrames.
static StagingBuffer::IOEngineConstraints openClMeshInputConstraints(
// slotStartAlignmentByteVal (page alignment)
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
// slotPadToNBytes (pointer size)
sizeof(float) * 3,
// frameStartAlignmentByteVal (page alignment)
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
// framePadToNBytes (pointer size)
@@ -29,7 +43,7 @@ static StagingBuffer::IOEngineConstraints openClInputConstraints(
static StagingBuffer::IOEngineConstraints openClIntensityInputConstraints(
// slotStartAlignmentByteVal (page alignment)
sizeof(float),
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
// slotPadToNBytes (intensity value size)
sizeof(float),
// frameStartAlignmentByteVal (page alignment)
@@ -39,9 +53,9 @@ static StagingBuffer::IOEngineConstraints openClIntensityInputConstraints(
static StagingBuffer::IOEngineConstraints openClAmbienceInputConstraints(
// slotStartAlignmentByteVal (page alignment)
sizeof(float),
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
// slotPadToNBytes (pointer size)
sizeof(void *),
sizeof(float),
// frameStartAlignmentByteVal (page alignment)
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
// framePadToNBytes (pointer size)
@@ -68,10 +82,11 @@ collationBuffer(
StagingBuffer::IOEngineConstraints::openClInputConstraints,
StagingBuffer::IOEngineConstraints::openClInputConstraints,
nDgramsPerStagingBufferFrame),
tempStimulusFrame(
StagingBuffer::IOEngineConstraints::openClInputConstraints,
StagingBuffer::IOEngineConstraints::openClInputConstraints,
nDgramsPerStagingBufferFrame)
tempStimulusFrameMem(0),
tempStimulusFrame(FrameAssemblyDesc::SlotDesc{
0,
reinterpret_cast<uint8_t*>(&tempStimulusFrameMem),
sizeof(tempStimulusFrameMem)})
{
if (smoHooksPtr->OptionParser_getOptions().verbose)
{
@@ -204,19 +219,24 @@ PcloudStimulusProducer::getOrCreateAttachedStimulusBuffer(
// Parse qualeIfaceApi to determine buffer type
const std::string& qualeIfaceApi = deviceAttachmentSpec->qualeIfaceApi;
// Calculate nPointsPerStimFrame based on return mode
// Calculate nPointsPerDgram based on return mode
size_t nPointsPerDgram = livoxProto1::Device::getNPointsPerDgram(
static_cast<int>(device->currentReturnMode));
size_t nPointsPerStimFrame = this->nDgramsPerStagingBufferFrame
* nPointsPerDgram;
if (qualeIfaceApi == "mesh")
{
/* Calculate slotStrideNBytes:
* nDgramsPerStagingBufferFrame * nPointsPerDgram * sizeof(float) * 3
*/
size_t slotStrideNBytes = this->nDgramsPerStagingBufferFrame
* nPointsPerDgram * sizeof(float) * 3;
// Reuse openClMeshInputConstraints, only modify slotPadToNBytes
openClMeshInputConstraints.slotPadToNBytes = slotStrideNBytes;
std::cout << __func__ << ": $$$$$$$ Creating MeshStimulusBuffer" << std::endl;
auto meshBuffer = std::make_shared<MeshStimulusBuffer>(
*this, deviceAttachmentSpec, histbuffMs,
openClInputConstraints, openClInputConstraints,
nPointsPerStimFrame);
openClMeshInputConstraints, openClMeshInputConstraints);
std::cout << __func__ << ": $$$$$$$ Created MeshStimulusBuffer" << std::endl;
meshStimulusBuffer = meshBuffer;
@@ -225,11 +245,18 @@ std::cout << __func__ << ": $$$$$$$ Created MeshStimulusBuffer" << std::endl;
}
else if (qualeIfaceApi == "pcloudIntensity")
{
/* Calculate slotStrideNBytes:
* nDgramsPerStagingBufferFrame * nPointsPerDgram * sizeof(float) * 1
*/
size_t slotStrideNBytes = this->nDgramsPerStagingBufferFrame
* nPointsPerDgram * sizeof(float) * 1;
// Reuse openClIntensityInputConstraints, only modify slotPadToNBytes
openClIntensityInputConstraints.slotPadToNBytes = slotStrideNBytes;
std::cout << __func__ << ": $$$$$$$ Creating PcloudIntensityStimulusBuffer" << std::endl;
auto intensityBuffer = std::make_shared<PcloudIntensityStimulusBuffer>(
*this, deviceAttachmentSpec, histbuffMs,
openClIntensityInputConstraints, openClIntensityInputConstraints,
nPointsPerStimFrame);
openClIntensityInputConstraints, openClIntensityInputConstraints);
std::cout << __func__ << ": $$$$$$$ Created PcloudIntensityStimulusBuffer" << std::endl;
intensityStimulusBuffer = intensityBuffer;
@@ -238,11 +265,17 @@ std::cout << __func__ << ": $$$$$$$ Created PcloudIntensityStimulusBuffer" << st
}
else if (qualeIfaceApi == "pcloudAmbience")
{
std::cout << __func__ << ": $$$$$$$ Creating PcloudAmbienceStimulusBuffer" << std::endl;
/* Calculate slotStrideNBytes:
* nDgramsPerStagingBufferFrame * sizeof(float)
*/
size_t slotStrideNBytes = this->nDgramsPerStagingBufferFrame
* sizeof(float);
// Reuse openClAmbienceInputConstraints, only modify slotPadToNBytes
openClAmbienceInputConstraints.slotPadToNBytes = slotStrideNBytes;
auto ambienceBuffer = std::make_shared<PcloudAmbienceStimulusBuffer>(
*this, deviceAttachmentSpec, histbuffMs,
openClAmbienceInputConstraints, openClAmbienceInputConstraints,
nDgramsPerStagingBufferFrame);
openClAmbienceInputConstraints, openClAmbienceInputConstraints);
std::cout << __func__ << ": $$$$$$$ Created PcloudAmbienceStimulusBuffer" << std::endl;
ambienceStimulusBuffer = ambienceBuffer;
@@ -86,6 +86,7 @@ public:
StagingBuffer assemblyBuffer;
IoUringAssemblyEngine ioUringAssemblyEngine;
StagingBuffer collationBuffer;
size_t tempStimulusFrameMem;
StimulusFrame tempStimulusFrame;
std::shared_ptr<MeshStimulusBuffer> meshStimulusBuffer;
std::shared_ptr<PcloudIntensityStimulusBuffer> intensityStimulusBuffer;