OClEngn: Split isSetup/Running into collate+compact
This commit is contained in:
@@ -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, ¤tCompactKernelEvent);
|
||||
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, ¤tCollateKernelEvent);
|
||||
clReleaseEvent(currentCollateKernelEvent);
|
||||
currentCollateKernelEvent = nullptr;
|
||||
collateIsRunning = false;
|
||||
}
|
||||
|
||||
isRunning = false;
|
||||
}
|
||||
|
||||
void OpenClCollatingAndMeshingEngine::stopCompactKernel()
|
||||
{
|
||||
stop();
|
||||
// Stop only compact kernel
|
||||
if (compactIsRunning && currentCompactKernelEvent)
|
||||
{
|
||||
clWaitForEvents(1, ¤tCompactKernelEvent);
|
||||
clReleaseEvent(currentCompactKernelEvent);
|
||||
currentCompactKernelEvent = nullptr;
|
||||
compactIsRunning = false;
|
||||
}
|
||||
compactKernelCb = [](cl_int){};
|
||||
}
|
||||
|
||||
void OpenClCollatingAndMeshingEngine::stopCollateKernel()
|
||||
{
|
||||
stop();
|
||||
// Stop only collate kernel
|
||||
if (collateIsRunning && currentCollateKernelEvent)
|
||||
{
|
||||
clWaitForEvents(1, ¤tCollateKernelEvent);
|
||||
clReleaseEvent(currentCollateKernelEvent);
|
||||
currentCollateKernelEvent = nullptr;
|
||||
collateIsRunning = false;
|
||||
}
|
||||
collateKernelCb = [](cl_int){};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user