ClCollMeshEngn: big reworks to clean up.
This commit is contained in:
@@ -6,6 +6,8 @@
|
||||
#include <cstddef>
|
||||
#include <memory>
|
||||
#include <functional>
|
||||
#include <iostream>
|
||||
#include <stdexcept>
|
||||
#define CL_TARGET_OPENCL_VERSION 300
|
||||
#include <CL/cl.h>
|
||||
#include "stagingBuffer.h"
|
||||
@@ -36,8 +38,8 @@ public:
|
||||
void finalize();
|
||||
|
||||
// Callback function types
|
||||
typedef std::function<void()> compactKernelCbFn;
|
||||
typedef std::function<void()> collateKernelCbFn;
|
||||
typedef std::function<void(cl_int)> compactKernelCbFn;
|
||||
typedef std::function<void(cl_int)> collateKernelCbFn;
|
||||
|
||||
bool startCompactKernel(
|
||||
StagingBuffer& assemblyBuff, uint32_t nSucceeded,
|
||||
@@ -70,7 +72,8 @@ private:
|
||||
|
||||
// State tracking
|
||||
bool isRunning;
|
||||
cl_event currentKernelEvent;
|
||||
cl_event currentCompactKernelEvent;
|
||||
cl_event currentCollateKernelEvent;
|
||||
|
||||
// Memory tracking
|
||||
void* assemblyBufferPtr;
|
||||
@@ -99,6 +102,67 @@ private:
|
||||
bool setupSlotCompactorsArgs(
|
||||
StagingBuffer& assemblyBuff, uint32_t nSucceeded);
|
||||
bool setupCollateDgramsArgs(StagingBuffer& assemblyBuff);
|
||||
|
||||
// Unified kernel start function
|
||||
template<typename SetupArgsFn, typename ValidateBuffersFn>
|
||||
bool startKernel(
|
||||
cl_kernel kernel,
|
||||
cl_event* eventPtr,
|
||||
SetupArgsFn setupArgsFn,
|
||||
ValidateBuffersFn validateBuffersFn,
|
||||
size_t globalWorkSize,
|
||||
void (CL_CALLBACK *eventCallback)(cl_event, cl_int, void*),
|
||||
const char* kernelName)
|
||||
{
|
||||
if (!isSetup)
|
||||
{
|
||||
std::cerr << __func__ << ": engine not set up" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isRunning)
|
||||
{
|
||||
std::cerr << __func__ << ": already running, call stop() first"
|
||||
<< std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Validate buffers
|
||||
validateBuffersFn();
|
||||
|
||||
// Set up kernel arguments
|
||||
if (!setupArgsFn()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Enqueue kernel execution
|
||||
cl_int err = clEnqueueNDRangeKernel(
|
||||
commandQueue, kernel, 1, nullptr, &globalWorkSize, nullptr,
|
||||
0, nullptr, eventPtr);
|
||||
|
||||
if (err != CL_SUCCESS)
|
||||
{
|
||||
std::cerr << __func__ << ": failed to enqueue " << kernelName
|
||||
<< " kernel: " << err << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Set up callback using static member function
|
||||
err = clSetEventCallback(
|
||||
*eventPtr, CL_COMPLETE, eventCallback, this);
|
||||
|
||||
if (err != CL_SUCCESS)
|
||||
{
|
||||
std::cerr << __func__ << ": failed to set event callback: " << err
|
||||
<< std::endl;
|
||||
clReleaseEvent(*eventPtr);
|
||||
*eventPtr = nullptr;
|
||||
return false;
|
||||
}
|
||||
|
||||
isRunning = true;
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace stim_buff
|
||||
|
||||
Reference in New Issue
Block a user