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] */
| 1945 | M2] |
| 1946 | */ |
| 1947 | clfftStatus 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; |
no test coverage detected