OClEngn: Split isSetup/Running into collate+compact

This commit is contained in:
2025-11-09 19:58:45 -04:00
parent aef251b7e5
commit 582aefb02c
2 changed files with 46 additions and 29 deletions
@@ -22,10 +22,10 @@ context(nullptr),
commandQueue(nullptr),
slotCompactorProgram(nullptr), collateProgram(nullptr),
slotCompactorKernel(nullptr), collateKernel(nullptr),
isSetup(false),
clAssemblyBuffer(nullptr),
clCollationBuffer(nullptr),
isRunning(false),
compactIsSetup(false), compactIsRunning(false),
collateIsSetup(false), collateIsRunning(false),
currentCompactKernelEvent(nullptr), currentCollateKernelEvent(nullptr),
assemblyBufferPtr(nullptr),
assemblyBufferSize(0),
@@ -42,7 +42,7 @@ OpenClCollatingAndMeshingEngine::~OpenClCollatingAndMeshingEngine()
bool OpenClCollatingAndMeshingEngine::setup()
{
if (isSetup) {
if (compactIsSetup && collateIsSetup) {
return true;
}
@@ -143,7 +143,8 @@ bool OpenClCollatingAndMeshingEngine::setup()
goto cleanup;
}
isSetup = true;
compactIsSetup = true;
collateIsSetup = true;
return true;
cleanup:
@@ -209,8 +210,10 @@ void OpenClCollatingAndMeshingEngine::finalize()
// Reset state variables
device = nullptr;
platform = nullptr;
isSetup = false;
isRunning = false;
compactIsSetup = false;
compactIsRunning = false;
collateIsSetup = false;
collateIsRunning = false;
currentCompactKernelEvent = nullptr;
currentCollateKernelEvent = nullptr;
assemblyBufferPtr = nullptr;
@@ -227,7 +230,7 @@ void CL_CALLBACK OpenClCollatingAndMeshingEngine::compactKernelEventCallback(
OpenClCollatingAndMeshingEngine* engine =
static_cast<OpenClCollatingAndMeshingEngine*>(user_data);
if (!engine || !engine->isRunning || !engine->compactKernelCb)
if (!engine || !engine->compactIsRunning || !engine->compactKernelCb)
{ return; }
// Post to io_service to call callback on the correct thread
@@ -245,7 +248,7 @@ void CL_CALLBACK OpenClCollatingAndMeshingEngine::collateKernelEventCallback(
OpenClCollatingAndMeshingEngine* engine =
static_cast<OpenClCollatingAndMeshingEngine*>(user_data);
if (!engine || !engine->isRunning || !engine->collateKernelCb)
if (!engine || !engine->collateIsRunning || !engine->collateKernelCb)
{ return; }
// Post to io_service to call callback on the correct thread
@@ -286,7 +289,9 @@ bool OpenClCollatingAndMeshingEngine::startCompactKernel(
validateBuffers,
1, // globalWorkSize
compactKernelEventCallback,
"slotCompactor");
"slotCompactor",
compactIsSetup,
compactIsRunning);
}
bool OpenClCollatingAndMeshingEngine::startCollateKernel(
@@ -327,7 +332,9 @@ bool OpenClCollatingAndMeshingEngine::startCollateKernel(
validateBuffers,
globalWorkSize,
collateKernelEventCallback,
"collateDgrams");
"collateDgrams",
collateIsSetup,
collateIsRunning);
}
bool OpenClCollatingAndMeshingEngine::compileAndPrepareKernel(
@@ -549,43 +556,48 @@ bool OpenClCollatingAndMeshingEngine::setupCollateDgramsArgs(
void OpenClCollatingAndMeshingEngine::stop()
{
if (!isRunning) {
return; // No-op if not running
}
// Cancel kernel execution if possible
if (currentCompactKernelEvent)
// Stop compact kernel if running
if (compactIsRunning && currentCompactKernelEvent)
{
// Note: OpenCL doesn't have a standard way to cancel kernel execution
// We can try to wait for it to complete or just release the event
// For now, we'll just wait for it to complete
clWaitForEvents(1, &currentCompactKernelEvent);
clReleaseEvent(currentCompactKernelEvent);
currentCompactKernelEvent = nullptr;
compactIsRunning = false;
}
if (currentCollateKernelEvent)
// Stop collate kernel if running
if (collateIsRunning && currentCollateKernelEvent)
{
// Note: OpenCL doesn't have a standard way to cancel kernel execution
// We can try to wait for it to complete or just release the event
// For now, we'll just wait for it to complete
clWaitForEvents(1, &currentCollateKernelEvent);
clReleaseEvent(currentCollateKernelEvent);
currentCollateKernelEvent = nullptr;
collateIsRunning = false;
}
isRunning = false;
}
void OpenClCollatingAndMeshingEngine::stopCompactKernel()
{
stop();
// Stop only compact kernel
if (compactIsRunning && currentCompactKernelEvent)
{
clWaitForEvents(1, &currentCompactKernelEvent);
clReleaseEvent(currentCompactKernelEvent);
currentCompactKernelEvent = nullptr;
compactIsRunning = false;
}
compactKernelCb = [](cl_int){};
}
void OpenClCollatingAndMeshingEngine::stopCollateKernel()
{
stop();
// Stop only collate kernel
if (collateIsRunning && currentCollateKernelEvent)
{
clWaitForEvents(1, &currentCollateKernelEvent);
clReleaseEvent(currentCollateKernelEvent);
currentCollateKernelEvent = nullptr;
collateIsRunning = false;
}
collateKernelCb = [](cl_int){};
}