[clfft] 73/107: updating 2D real forward plan and transform

Ghislain Vaillant ghisvail-guest at moszumanska.debian.org
Thu Jul 30 18:06:38 UTC 2015


This is an automated email from the git hooks/post-receive script.

ghisvail-guest pushed a commit to branch master
in repository clfft.

commit 6aa6a931ec39d8ec1a83539181728ec3fb30b728
Author: bragadeesh <bragadeesh.natarajan at amd>
Date:   Tue Apr 14 17:30:07 2015 -0500

    updating 2D real forward plan and transform
---
 src/library/accessors.cpp |  7 +++-
 src/library/plan.cpp      | 38 +++++++++++++-----
 src/library/transform.cpp | 99 +++++++++++++++++++++++++++++++++++++++--------
 3 files changed, 115 insertions(+), 29 deletions(-)

diff --git a/src/library/accessors.cpp b/src/library/accessors.cpp
index 81f3fec..4b5bb4f 100644
--- a/src/library/accessors.cpp
+++ b/src/library/accessors.cpp
@@ -311,9 +311,12 @@ clfftStatus clfftSetPlanLength( clfftPlanHandle plHandle, const clfftDim dim, co
 			if( clLengths[ DimX ] == 0 || clLengths[ DimY ] == 0 )
 				return CLFFT_INVALID_ARG_VALUE;
 
-			if( !IsASupportedLength( clLengths[ DimX ] ) || !IsASupportedLength( clLengths[ DimY ] ) )
+			if(!fftPlan->transflag)
 			{
-				return CLFFT_NOTIMPLEMENTED;
+				if( !IsASupportedLength( clLengths[ DimX ] ) || !IsASupportedLength( clLengths[ DimY ] ) )
+				{
+					return CLFFT_NOTIMPLEMENTED;
+				}
 			}
 
 			fftPlan->length.push_back( clLengths[ DimX ] );
diff --git a/src/library/plan.cpp b/src/library/plan.cpp
index 4c61355..8f01aac 100644
--- a/src/library/plan.cpp
+++ b/src/library/plan.cpp
@@ -1857,20 +1857,28 @@ clfftStatus	clfftBakePlan( clfftPlanHandle plHandle, cl_uint numQueues, cl_comma
 				OPENCL_V(clfftBakePlan(fftPlan->planX, numQueues, commQueueFFT, NULL, NULL ), _T( "BakePlan for planX failed" ) );
 
 				if( (rowPlan->inStride[0] == 1) && (rowPlan->outStride[0] == 1) &&
-					(rowPlan->inStride[1] == length0) && (rowPlan->outStride[1] == Nt) )
+					( ((rowPlan->inStride[1] == Nt*2) && (rowPlan->placeness == CLFFT_INPLACE)) ||
+					  ((rowPlan->inStride[1] == length0) && (rowPlan->placeness == CLFFT_OUTOFPLACE)) )
+					&& (rowPlan->outStride[1] == Nt) )
 				{
 					// create first transpose plan
 					
 					//Transpose 
 					// output --> tmp
-					size_t transLengths[2] = { Nt, length1 };
+					size_t transLengths[2] = { length0, length1 };
 					OPENCL_V(clfftCreateDefaultPlanInternal( &fftPlan->planTX, fftPlan->context, CLFFT_2D, transLengths ),
-						_T( "CreateDefaultPlan Large1d transpose failed" ) );
+						_T( "CreateDefaultPlan for planTX transpose failed" ) );
 
 					FFTPlan* trans1Plan	= NULL;
 					lockRAII* trans1Lock	= NULL;
 					OPENCL_V( fftRepo.getPlan( fftPlan->planTX, trans1Plan, trans1Lock ), _T( "fftRepo.getPlan failed" ) );
 
+					trans1Plan->transflag = true;
+
+					transLengths[0] = Nt;
+					OPENCL_V(clfftSetPlanLength( fftPlan->planTX, CLFFT_2D, transLengths ),
+						_T( "clfftSetPlanLength for planTX transpose failed" ) );
+
 					switch(fftPlan->outputLayout)
 					{
 					case CLFFT_HERMITIAN_INTERLEAVED:
@@ -1893,21 +1901,23 @@ clfftStatus	clfftBakePlan( clfftPlanHandle plHandle, cl_uint numQueues, cl_comma
 					trans1Plan->tmpBufSize    = fftPlan->tmpBufSize;
 					trans1Plan->batchsize     = fftPlan->batchsize;
 					trans1Plan->envelope	  = fftPlan->envelope;
+					trans1Plan->forwardScale  = 1.0f;
+					trans1Plan->backwardScale = 1.0f;
 
 					trans1Plan->inStride[0]   = 1;
 					trans1Plan->inStride[1]   = Nt;
 					trans1Plan->outStride[0]  = 1;
 					trans1Plan->outStride[1]  = length1;
-					trans1Plan->iDist         = fftPlan->iDist;
+					trans1Plan->iDist         = rowPlan->oDist;
 					trans1Plan->oDist		  = Nt*length1;
 
 					trans1Plan->gen           = Transpose_GCN;
-					trans1Plan->transflag     = true;
+
 
 					for (size_t index=2; index < fftPlan->length.size(); index++)
 					{
 						trans1Plan->length.push_back(fftPlan->length[index]);
-						trans1Plan->inStride.push_back(fftPlan->inStride[index]);
+						trans1Plan->inStride.push_back(rowPlan->outStride[index]);
 						trans1Plan->outStride.push_back(trans1Plan->oDist);
 						trans1Plan->oDist *= fftPlan->length[index];
 					}
@@ -1938,8 +1948,8 @@ clfftStatus	clfftBakePlan( clfftPlanHandle plHandle, cl_uint numQueues, cl_comma
 					colPlan->oDist         = Nt*length1;
 
 					colPlan->precision     = fftPlan->precision;
-					colPlan->forwardScale  = 1.0f;
-					colPlan->backwardScale = 1.0f;
+					colPlan->forwardScale  = fftPlan->forwardScale;
+					colPlan->backwardScale = fftPlan->backwardScale;
 					colPlan->tmpBufSize    = fftPlan->tmpBufSize;
 
 					colPlan->gen			= fftPlan->gen;
@@ -1970,14 +1980,20 @@ clfftStatus	clfftBakePlan( clfftPlanHandle plHandle, cl_uint numQueues, cl_comma
 					
 					//Transpose 
 					//output --> tmp
-					size_t trans2Lengths[2] = { length1, Nt };
+					size_t trans2Lengths[2] = { length1, length0 };
 					OPENCL_V(clfftCreateDefaultPlanInternal( &fftPlan->planTY, fftPlan->context, CLFFT_2D, trans2Lengths ),
-						_T( "CreateDefaultPlan Large1d transpose failed" ) );
+						_T( "CreateDefaultPlan for planTY transpose failed" ) );
 
 					FFTPlan* trans2Plan	= NULL;
 					lockRAII* trans2Lock	= NULL;
 					OPENCL_V( fftRepo.getPlan( fftPlan->planTY, trans2Plan, trans2Lock ), _T( "fftRepo.getPlan failed" ) );
 
+					trans2Plan->transflag = true;
+
+					trans2Lengths[1] = Nt;
+					OPENCL_V(clfftSetPlanLength( fftPlan->planTY, CLFFT_2D, trans2Lengths ),
+						_T( "clfftSetPlanLength for planTY transpose failed" ) );
+
 					switch(fftPlan->outputLayout)
 					{
 					case CLFFT_HERMITIAN_INTERLEAVED:
@@ -2000,6 +2016,8 @@ clfftStatus	clfftBakePlan( clfftPlanHandle plHandle, cl_uint numQueues, cl_comma
 					trans2Plan->tmpBufSize    = fftPlan->tmpBufSize;
 					trans2Plan->batchsize     = fftPlan->batchsize;
 					trans2Plan->envelope	  = fftPlan->envelope;
+					trans2Plan->forwardScale  = 1.0f;
+					trans2Plan->backwardScale = 1.0f;
 
 					trans2Plan->inStride[0]   = 1;
 					trans2Plan->inStride[1]   = length1;
diff --git a/src/library/transform.cpp b/src/library/transform.cpp
index 8dc5e9f..2c500be 100644
--- a/src/library/transform.cpp
+++ b/src/library/transform.cpp
@@ -648,29 +648,94 @@ clfftStatus clfftEnqueueTransform(
 				{
 					if(fftPlan->inputLayout == CLFFT_REAL)
 					{
-						if (fftPlan->placeness==CLFFT_INPLACE)
+						if(fftPlan->planTX)
 						{
-							// deal with row
-							OPENCL_V( clfftEnqueueTransform( fftPlan->planX, CLFFT_FORWARD, numQueuesAndEvents, commQueues, numWaitEvents,
-								waitEvents, &rowOutEvents, clInputBuffers, NULL, localIntBuffer ),
+							//First row
+							OPENCL_V( clfftEnqueueTransform( fftPlan->planX, dir, numQueuesAndEvents, commQueues, numWaitEvents,
+								waitEvents, &rowOutEvents, clInputBuffers, clOutputBuffers, NULL ),
 								_T("clfftEnqueueTransform for row failed"));
 
-							// deal with column
-							OPENCL_V( clfftEnqueueTransform( fftPlan->planY, CLFFT_FORWARD, numQueuesAndEvents, commQueues, 1, &rowOutEvents,
-								outEvents, clInputBuffers, NULL, localIntBuffer ),
-								_T("clfftEnqueueTransform for column failed"));
+							cl_mem *mybuffers;
+
+							if (fftPlan->placeness==CLFFT_INPLACE)
+								mybuffers = clInputBuffers;
+							else
+								mybuffers = clOutputBuffers;
+
+#if defined(DEBUGGING)
+							OPENCL_V( clEnqueueReadBuffer( *commQueues, mybuffers[0], CL_TRUE, 0, buffSizeBytes*2, &output2[ 0 ], 0,
+								NULL, NULL ),
+								_T("Reading the result buffer failed") );
+#endif
+
+							cl_event transXOutEvents = NULL;
+							cl_event colOutEvents = NULL;
+
+
+							//First transpose
+							OPENCL_V( clfftEnqueueTransform( fftPlan->planTX, dir, numQueuesAndEvents, commQueues, 1, &rowOutEvents,
+								&transXOutEvents, mybuffers, &localIntBuffer, NULL ),
+								_T("clfftEnqueueTransform for first transpose failed"));
+							clReleaseEvent(rowOutEvents);
+
+#if defined(DEBUGGING)
+							OPENCL_V( clEnqueueReadBuffer( *commQueues, localIntBuffer, CL_TRUE, 0, buffSizeBytes*2, &output2[0], 0,
+								NULL, NULL ),
+								_T("Reading the result buffer failed") );
+#endif
+
+
+							//Second Row transform
+							OPENCL_V( clfftEnqueueTransform( fftPlan->planY, dir, numQueuesAndEvents, commQueues, 1, &transXOutEvents,
+								&colOutEvents, &localIntBuffer, NULL, NULL ),
+								_T("clfftEnqueueTransform for second row failed"));
+							clReleaseEvent(transXOutEvents);
+
+#if defined(DEBUGGING)
+							OPENCL_V( clEnqueueReadBuffer( *commQueues, localIntBuffer, CL_TRUE, 0, buffSizeBytes*2, &output2[0], 0,
+								NULL, NULL ),
+								_T("Reading the result buffer failed") );
+#endif
+
+							//Second transpose
+							OPENCL_V( clfftEnqueueTransform( fftPlan->planTY, dir, numQueuesAndEvents, commQueues, 1, &colOutEvents,
+								outEvents, &localIntBuffer, mybuffers, NULL ),
+								_T("clfftEnqueueTransform for second transpose failed"));
+							clReleaseEvent(colOutEvents);
+
+#if defined(DEBUGGING)
+							OPENCL_V( clEnqueueReadBuffer( *commQueues, mybuffers[0], CL_TRUE, 0, buffSizeBytes*2, &output2[0], 0,
+								NULL, NULL ),
+								_T("Reading the result buffer failed") );
+#endif
+
 						}
 						else
 						{
-							// deal with row
-							OPENCL_V( clfftEnqueueTransform( fftPlan->planX, CLFFT_FORWARD, numQueuesAndEvents, commQueues, numWaitEvents,
-								waitEvents, &rowOutEvents, clInputBuffers, clOutputBuffers, localIntBuffer ),
-								_T("clfftEnqueueTransform for row failed"));
-
-							// deal with column
-							OPENCL_V( clfftEnqueueTransform( fftPlan->planY, CLFFT_FORWARD, numQueuesAndEvents, commQueues, 1, &rowOutEvents,
-								outEvents, clOutputBuffers, NULL, localIntBuffer ),
-								_T("clfftEnqueueTransform for column failed"));
+							if (fftPlan->placeness==CLFFT_INPLACE)
+							{
+								// deal with row
+								OPENCL_V( clfftEnqueueTransform( fftPlan->planX, CLFFT_FORWARD, numQueuesAndEvents, commQueues, numWaitEvents,
+									waitEvents, &rowOutEvents, clInputBuffers, NULL, localIntBuffer ),
+									_T("clfftEnqueueTransform for row failed"));
+
+								// deal with column
+								OPENCL_V( clfftEnqueueTransform( fftPlan->planY, CLFFT_FORWARD, numQueuesAndEvents, commQueues, 1, &rowOutEvents,
+									outEvents, clInputBuffers, NULL, localIntBuffer ),
+									_T("clfftEnqueueTransform for column failed"));
+							}
+							else
+							{
+								// deal with row
+								OPENCL_V( clfftEnqueueTransform( fftPlan->planX, CLFFT_FORWARD, numQueuesAndEvents, commQueues, numWaitEvents,
+									waitEvents, &rowOutEvents, clInputBuffers, clOutputBuffers, localIntBuffer ),
+									_T("clfftEnqueueTransform for row failed"));
+
+								// deal with column
+								OPENCL_V( clfftEnqueueTransform( fftPlan->planY, CLFFT_FORWARD, numQueuesAndEvents, commQueues, 1, &rowOutEvents,
+									outEvents, clOutputBuffers, NULL, localIntBuffer ),
+									_T("clfftEnqueueTransform for column failed"));
+							}
 						}
 					}
 					else if(fftPlan->outputLayout == CLFFT_REAL)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/clfft.git



More information about the debian-science-commits mailing list