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), commandQueue(nullptr),
slotCompactorProgram(nullptr), collateProgram(nullptr), slotCompactorProgram(nullptr), collateProgram(nullptr),
slotCompactorKernel(nullptr), collateKernel(nullptr), slotCompactorKernel(nullptr), collateKernel(nullptr),
isSetup(false),
clAssemblyBuffer(nullptr), clAssemblyBuffer(nullptr),
clCollationBuffer(nullptr), clCollationBuffer(nullptr),
isRunning(false), compactIsSetup(false), compactIsRunning(false),
collateIsSetup(false), collateIsRunning(false),
currentCompactKernelEvent(nullptr), currentCollateKernelEvent(nullptr), currentCompactKernelEvent(nullptr), currentCollateKernelEvent(nullptr),
assemblyBufferPtr(nullptr), assemblyBufferPtr(nullptr),
assemblyBufferSize(0), assemblyBufferSize(0),
@@ -42,7 +42,7 @@ OpenClCollatingAndMeshingEngine::~OpenClCollatingAndMeshingEngine()
bool OpenClCollatingAndMeshingEngine::setup() bool OpenClCollatingAndMeshingEngine::setup()
{ {
if (isSetup) { if (compactIsSetup && collateIsSetup) {
return true; return true;
} }
@@ -143,7 +143,8 @@ bool OpenClCollatingAndMeshingEngine::setup()
goto cleanup; goto cleanup;
} }
isSetup = true; compactIsSetup = true;
collateIsSetup = true;
return true; return true;
cleanup: cleanup:
@@ -209,8 +210,10 @@ void OpenClCollatingAndMeshingEngine::finalize()
// Reset state variables // Reset state variables
device = nullptr; device = nullptr;
platform = nullptr; platform = nullptr;
isSetup = false; compactIsSetup = false;
isRunning = false; compactIsRunning = false;
collateIsSetup = false;
collateIsRunning = false;
currentCompactKernelEvent = nullptr; currentCompactKernelEvent = nullptr;
currentCollateKernelEvent = nullptr; currentCollateKernelEvent = nullptr;
assemblyBufferPtr = nullptr; assemblyBufferPtr = nullptr;
@@ -227,7 +230,7 @@ void CL_CALLBACK OpenClCollatingAndMeshingEngine::compactKernelEventCallback(
OpenClCollatingAndMeshingEngine* engine = OpenClCollatingAndMeshingEngine* engine =
static_cast<OpenClCollatingAndMeshingEngine*>(user_data); static_cast<OpenClCollatingAndMeshingEngine*>(user_data);
if (!engine || !engine->isRunning || !engine->compactKernelCb) if (!engine || !engine->compactIsRunning || !engine->compactKernelCb)
{ return; } { return; }
// Post to io_service to call callback on the correct thread // Post to io_service to call callback on the correct thread
@@ -245,7 +248,7 @@ void CL_CALLBACK OpenClCollatingAndMeshingEngine::collateKernelEventCallback(
OpenClCollatingAndMeshingEngine* engine = OpenClCollatingAndMeshingEngine* engine =
static_cast<OpenClCollatingAndMeshingEngine*>(user_data); static_cast<OpenClCollatingAndMeshingEngine*>(user_data);
if (!engine || !engine->isRunning || !engine->collateKernelCb) if (!engine || !engine->collateIsRunning || !engine->collateKernelCb)
{ return; } { return; }
// Post to io_service to call callback on the correct thread // Post to io_service to call callback on the correct thread
@@ -286,7 +289,9 @@ bool OpenClCollatingAndMeshingEngine::startCompactKernel(
validateBuffers, validateBuffers,
1, // globalWorkSize 1, // globalWorkSize
compactKernelEventCallback, compactKernelEventCallback,
"slotCompactor"); "slotCompactor",
compactIsSetup,
compactIsRunning);
} }
bool OpenClCollatingAndMeshingEngine::startCollateKernel( bool OpenClCollatingAndMeshingEngine::startCollateKernel(
@@ -327,7 +332,9 @@ bool OpenClCollatingAndMeshingEngine::startCollateKernel(
validateBuffers, validateBuffers,
globalWorkSize, globalWorkSize,
collateKernelEventCallback, collateKernelEventCallback,
"collateDgrams"); "collateDgrams",
collateIsSetup,
collateIsRunning);
} }
bool OpenClCollatingAndMeshingEngine::compileAndPrepareKernel( bool OpenClCollatingAndMeshingEngine::compileAndPrepareKernel(
@@ -549,43 +556,48 @@ bool OpenClCollatingAndMeshingEngine::setupCollateDgramsArgs(
void OpenClCollatingAndMeshingEngine::stop() void OpenClCollatingAndMeshingEngine::stop()
{ {
if (!isRunning) { // Stop compact kernel if running
return; // No-op if not running if (compactIsRunning && currentCompactKernelEvent)
}
// Cancel kernel execution if possible
if (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); clWaitForEvents(1, &currentCompactKernelEvent);
clReleaseEvent(currentCompactKernelEvent); clReleaseEvent(currentCompactKernelEvent);
currentCompactKernelEvent = nullptr; 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); clWaitForEvents(1, &currentCollateKernelEvent);
clReleaseEvent(currentCollateKernelEvent); clReleaseEvent(currentCollateKernelEvent);
currentCollateKernelEvent = nullptr; currentCollateKernelEvent = nullptr;
collateIsRunning = false;
} }
isRunning = false;
} }
void OpenClCollatingAndMeshingEngine::stopCompactKernel() void OpenClCollatingAndMeshingEngine::stopCompactKernel()
{ {
stop(); // Stop only compact kernel
if (compactIsRunning && currentCompactKernelEvent)
{
clWaitForEvents(1, &currentCompactKernelEvent);
clReleaseEvent(currentCompactKernelEvent);
currentCompactKernelEvent = nullptr;
compactIsRunning = false;
}
compactKernelCb = [](cl_int){}; compactKernelCb = [](cl_int){};
} }
void OpenClCollatingAndMeshingEngine::stopCollateKernel() void OpenClCollatingAndMeshingEngine::stopCollateKernel()
{ {
stop(); // Stop only collate kernel
if (collateIsRunning && currentCollateKernelEvent)
{
clWaitForEvents(1, &currentCollateKernelEvent);
clReleaseEvent(currentCollateKernelEvent);
currentCollateKernelEvent = nullptr;
collateIsRunning = false;
}
collateKernelCb = [](cl_int){}; collateKernelCb = [](cl_int){};
} }
@@ -71,7 +71,10 @@ private:
cl_mem clCollationBuffer; cl_mem clCollationBuffer;
// State tracking // State tracking
bool isRunning; bool compactIsSetup;
bool compactIsRunning;
bool collateIsSetup;
bool collateIsRunning;
cl_event currentCompactKernelEvent; cl_event currentCompactKernelEvent;
cl_event currentCollateKernelEvent; cl_event currentCollateKernelEvent;
@@ -112,7 +115,9 @@ private:
ValidateBuffersFn validateBuffersFn, ValidateBuffersFn validateBuffersFn,
size_t globalWorkSize, size_t globalWorkSize,
void (CL_CALLBACK *eventCallback)(cl_event, cl_int, void*), void (CL_CALLBACK *eventCallback)(cl_event, cl_int, void*),
const char* kernelName) const char* kernelName,
bool& isSetup,
bool& isRunning)
{ {
if (!isSetup) if (!isSetup)
{ {