MCPcopy Create free account
hub / github.com/clMathLibraries/clFFT / genTransposeKernelBatched

Function genTransposeKernelBatched

src/library/generator.transpose.cpp:1947–2748  ·  view source on GitHub ↗

generate transepose kernel with sqaure 2d matrix of row major with arbitrary batch size Below is a matrix(row major) containing three sqaure sub matrix along column The transpose will be done within each sub matrix. [M0 M1 M2] */

Source from the content-addressed store, hash-verified

1945 M2]
1946*/
1947clfftStatus genTransposeKernelBatched(const FFTGeneratedTransposeSquareAction::Signature & params, std::string& strKernel, const size_t& lwSize, const size_t reShapeFactor)
1948{
1949 strKernel.reserve(4096);
1950 std::stringstream transKernel(std::stringstream::out);
1951
1952 // These strings represent the various data types we read or write in the kernel, depending on how the plan
1953 // is configured
1954 std::string dtInput; // The type read as input into kernel
1955 std::string dtOutput; // The type written as output from kernel
1956 std::string dtPlanar; // Fundamental type for planar arrays
1957 std::string dtComplex; // Fundamental type for complex arrays
1958
1959 // NOTE: Enable only for debug
1960 // clKernWrite( transKernel, 0 ) << "#pragma OPENCL EXTENSION cl_amd_printf : enable\n" << std::endl;
1961
1962 //if (params.fft_inputLayout != params.fft_outputLayout)
1963 // return CLFFT_TRANSPOSED_NOTIMPLEMENTED;
1964
1965 switch (params.fft_precision)
1966 {
1967 case CLFFT_SINGLE:
1968 case CLFFT_SINGLE_FAST:
1969 dtPlanar = "float";
1970 dtComplex = "float2";
1971 break;
1972 case CLFFT_DOUBLE:
1973 case CLFFT_DOUBLE_FAST:
1974 dtPlanar = "double";
1975 dtComplex = "double2";
1976
1977 // Emit code that enables double precision in the kernel
1978 clKernWrite(transKernel, 0) << "#ifdef cl_khr_fp64" << std::endl;
1979 clKernWrite(transKernel, 3) << "#pragma OPENCL EXTENSION cl_khr_fp64 : enable" << std::endl;
1980 clKernWrite(transKernel, 0) << "#else" << std::endl;
1981 clKernWrite(transKernel, 3) << "#pragma OPENCL EXTENSION cl_amd_fp64 : enable" << std::endl;
1982 clKernWrite(transKernel, 0) << "#endif\n" << std::endl;
1983
1984 break;
1985 default:
1986 return CLFFT_TRANSPOSED_NOTIMPLEMENTED;
1987 break;
1988 }
1989
1990 // it is a better idea to do twiddle in swap kernel if we will have a swap kernel.
1991 // for pure square transpose, twiddle will be done in transpose kernel
1992 bool twiddleTransposeKernel = params.fft_3StepTwiddle && (params.transposeMiniBatchSize == 1);//when transposeMiniBatchSize == 1 it is guaranteed to be a sqaure matrix transpose
1993 // If twiddle computation has been requested, generate the lookup function
1994
1995 if (twiddleTransposeKernel)
1996 {
1997 std::string str;
1998 StockhamGenerator::TwiddleTableLarge twLarge(params.fft_N[0] * params.fft_N[1]);
1999 if ((params.fft_precision == CLFFT_SINGLE) || (params.fft_precision == CLFFT_SINGLE_FAST))
2000 twLarge.GenerateTwiddleTable<StockhamGenerator::P_SINGLE>(str);
2001 else
2002 twLarge.GenerateTwiddleTable<StockhamGenerator::P_DOUBLE>(str);
2003 clKernWrite(transKernel, 0) << str << std::endl;
2004 clKernWrite(transKernel, 0) << std::endl;

Callers 1

generateKernelMethod · 0.85

Calls 3

genTransposePrototypeFunction · 0.70
OffsetCalcFunction · 0.70
genTwiddleMathFunction · 0.70

Tested by

no test coverage detected