Skip to content

Commit

Permalink
fixing the thread saefty issue with contribution from #146
Browse files Browse the repository at this point in the history
  • Loading branch information
bragadeesh committed Jul 28, 2016
1 parent b0af49d commit b43cc61
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 7 deletions.
11 changes: 8 additions & 3 deletions src/library/enqueue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -562,8 +562,11 @@ clfftStatus FFTAction::enqueue(clfftPlanHandle plHandle,

cl_program prog;
cl_kernel kern;
lockRAII* kernelLock;
OPENCL_V( fftRepo.getclProgram( this->getGenerator(), this->getSignatureData(), prog, this->plan->bakeDevice, this->plan->context ), _T( "fftRepo.getclProgram failed" ) );
OPENCL_V( fftRepo.getclKernel( prog, dir, kern ), _T( "fftRepo.getclKernels failed" ) );
OPENCL_V( fftRepo.getclKernel( prog, dir, kern, kernelLock), _T( "fftRepo.getclKernels failed" ) );

scopedLock sLock(*kernelLock, _T("FFTAction::enqueue"));

cl_uint uarg = 0;
if (!this->plan->transflag && !(this->plan->gen == Copy))
Expand Down Expand Up @@ -792,7 +795,8 @@ clfftStatus FFTAction::compileKernels( const cl_command_queue commQueueFFT, cons
cl_kernel kernel;
if( buildFwdKernel )
{
if( fftRepo.getclKernel( program, CLFFT_FORWARD, kernel ) == CLFFT_INVALID_KERNEL )
lockRAII *kernelLock;
if( fftRepo.getclKernel( program, CLFFT_FORWARD, kernel, kernelLock) == CLFFT_INVALID_KERNEL )
{
std::string entryPoint;
OPENCL_V( fftRepo.getProgramEntryPoint( this->getGenerator(), this->getSignatureData(), CLFFT_FORWARD, entryPoint, q_device, fftPlan->context ), _T( "fftRepo.getProgramEntryPoint failed." ) );
Expand All @@ -806,7 +810,8 @@ clfftStatus FFTAction::compileKernels( const cl_command_queue commQueueFFT, cons

if( buildBwdKernel )
{
if( fftRepo.getclKernel( program, CLFFT_BACKWARD, kernel ) == CLFFT_INVALID_KERNEL )
lockRAII *kernelLock;
if( fftRepo.getclKernel( program, CLFFT_BACKWARD, kernel, kernelLock ) == CLFFT_INVALID_KERNEL )
{
std::string entryPoint;
OPENCL_V( fftRepo.getProgramEntryPoint( this->getGenerator(), this->getSignatureData(), CLFFT_BACKWARD, entryPoint, q_device, fftPlan->context ), _T( "fftRepo.getProgramEntryPoint failed." ) );
Expand Down
2 changes: 1 addition & 1 deletion src/library/fft_binary_lookup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ extern "C"

static char * sep()
{
#ifdef __WIN32
#ifdef _WIN32
return (char*)"\\";
#else
return (char*)"/";
Expand Down
27 changes: 25 additions & 2 deletions src/library/repo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,18 @@ clfftStatus FFTRepo::releaseResources( )
iKern->second.kernel_back = NULL;
if (NULL != k)
clReleaseKernel( k );

if (NULL != iKern->second.kernel_fwd_lock)
{
delete iKern->second.kernel_fwd_lock;
iKern->second.kernel_fwd_lock = NULL;
}

if (NULL != iKern->second.kernel_back_lock)
{
delete iKern->second.kernel_back_lock;
iKern->second.kernel_back_lock = NULL;
}
}
mapKernels.clear( );

Expand Down Expand Up @@ -239,12 +251,16 @@ clfftStatus FFTRepo::setclKernel( cl_program prog, clfftDirection dir, const cl_
fftKernels & Kernels = mapKernels[ prog ];

cl_kernel * pk;
lockRAII ** kernelLock;

switch (dir) {
case CLFFT_FORWARD:
pk = & Kernels.kernel_fwd;
kernelLock = & Kernels.kernel_fwd_lock;
break;
case CLFFT_BACKWARD:
pk = & Kernels.kernel_back;
kernelLock = & Kernels.kernel_back_lock;
break;
default:
assert (false);
Expand All @@ -255,12 +271,17 @@ clfftStatus FFTRepo::setclKernel( cl_program prog, clfftDirection dir, const cl_
if (NULL != *pk)
clReleaseKernel( *pk );

*pk = kernel;
*pk = kernel;

if (NULL != *kernelLock)
delete kernelLock;

*kernelLock = new lockRAII;

return CLFFT_SUCCESS;
}

clfftStatus FFTRepo::getclKernel( cl_program prog, clfftDirection dir, cl_kernel& kernel )
clfftStatus FFTRepo::getclKernel( cl_program prog, clfftDirection dir, cl_kernel& kernel, lockRAII*& kernelLock)
{
scopedLock sLock( lockRepo, _T( "getclKernel" ) );

Expand All @@ -271,9 +292,11 @@ clfftStatus FFTRepo::getclKernel( cl_program prog, clfftDirection dir, cl_kernel
switch (dir) {
case CLFFT_FORWARD:
kernel = pos->second.kernel_fwd;
kernelLock = pos->second.kernel_fwd_lock;
break;
case CLFFT_BACKWARD:
kernel = pos->second.kernel_back;
kernelLock = pos->second.kernel_back_lock;
break;
default:
assert (false);
Expand Down
6 changes: 5 additions & 1 deletion src/library/repo.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,10 +124,14 @@ class FFTRepo
struct fftKernels {
cl_kernel kernel_fwd;
cl_kernel kernel_back;
lockRAII* kernel_fwd_lock;
lockRAII* kernel_back_lock;

fftKernels ()
: kernel_fwd (NULL)
, kernel_back (NULL)
, kernel_fwd_lock(NULL)
, kernel_back_lock(NULL)
{}
};

Expand Down Expand Up @@ -211,7 +215,7 @@ class FFTRepo
clfftStatus getclProgram( const clfftGenerators gen, const FFTKernelSignatureHeader * data, cl_program& prog, const cl_device_id &device, const cl_context& planContext );

clfftStatus setclKernel ( cl_program prog, clfftDirection dir, const cl_kernel& kernel );
clfftStatus getclKernel ( cl_program prog, clfftDirection dir, cl_kernel& kernel );
clfftStatus getclKernel ( cl_program prog, clfftDirection dir, cl_kernel& kernel, lockRAII*& kernelLock);

clfftStatus createPlan( clfftPlanHandle* plHandle, FFTPlan*& fftPlan );
clfftStatus getPlan( clfftPlanHandle plHandle, FFTPlan*& fftPlan, lockRAII*& planLock );
Expand Down

0 comments on commit b43cc61

Please sign in to comment.