swap lines. a more general kernel generator. this function accepts any ratio in theory. But in practice we restrict it to 1:2, 1:3, 1:5 and 1:10 ration
| 918 | //swap lines. a more general kernel generator. |
| 919 | //this function accepts any ratio in theory. But in practice we restrict it to 1:2, 1:3, 1:5 and 1:10 ration |
| 920 | clfftStatus genSwapKernelGeneral(const FFTGeneratedTransposeNonSquareAction::Signature & params, std::string& strKernel, std::string& KernelFuncName, const size_t& lwSize, const size_t reShapeFactor) |
| 921 | { |
| 922 | if (params.fft_placeness == CLFFT_OUTOFPLACE) |
| 923 | return CLFFT_TRANSPOSED_NOTIMPLEMENTED; |
| 924 | |
| 925 | size_t smaller_dim = (params.fft_N[0] < params.fft_N[1]) ? params.fft_N[0] : params.fft_N[1]; |
| 926 | size_t bigger_dim = (params.fft_N[0] >= params.fft_N[1]) ? params.fft_N[0] : params.fft_N[1]; |
| 927 | size_t dim_ratio = bigger_dim / smaller_dim; |
| 928 | /* |
| 929 | if ( (params.fft_N[0] != 2 * params.fft_N[1]) && (params.fft_N[1] != 2 * params.fft_N[0]) && |
| 930 | (params.fft_N[0] != 3 * params.fft_N[1]) && (params.fft_N[1] != 3 * params.fft_N[0]) && |
| 931 | (params.fft_N[0] != 5 * params.fft_N[1]) && (params.fft_N[1] != 5 * params.fft_N[0]) && |
| 932 | (params.fft_N[0] != 10 * params.fft_N[1]) && (params.fft_N[1] != 10 * params.fft_N[0]) ) |
| 933 | */ |
| 934 | if(dim_ratio % 2 != 0 && dim_ratio % 3 != 0 && dim_ratio % 5 != 0 && dim_ratio % 10 != 0) |
| 935 | { |
| 936 | return CLFFT_TRANSPOSED_NOTIMPLEMENTED; |
| 937 | } |
| 938 | |
| 939 | strKernel.reserve(4096); |
| 940 | std::stringstream transKernel(std::stringstream::out); |
| 941 | |
| 942 | // These strings represent the various data types we read or write in the kernel, depending on how the plan |
| 943 | // is configured |
| 944 | std::string dtInput; // The type read as input into kernel |
| 945 | std::string dtOutput; // The type written as output from kernel |
| 946 | std::string dtPlanar; // Fundamental type for planar arrays |
| 947 | std::string tmpBuffType; |
| 948 | std::string dtComplex; // Fundamental type for complex arrays |
| 949 | |
| 950 | // NOTE: Enable only for debug |
| 951 | // clKernWrite( transKernel, 0 ) << "#pragma OPENCL EXTENSION cl_amd_printf : enable\n" << std::endl; |
| 952 | |
| 953 | //if (params.fft_inputLayout != params.fft_outputLayout) |
| 954 | // return CLFFT_TRANSPOSED_NOTIMPLEMENTED; |
| 955 | |
| 956 | switch (params.fft_precision) |
| 957 | { |
| 958 | case CLFFT_SINGLE: |
| 959 | case CLFFT_SINGLE_FAST: |
| 960 | dtPlanar = "float"; |
| 961 | dtComplex = "float2"; |
| 962 | break; |
| 963 | case CLFFT_DOUBLE: |
| 964 | case CLFFT_DOUBLE_FAST: |
| 965 | dtPlanar = "double"; |
| 966 | dtComplex = "double2"; |
| 967 | |
| 968 | // Emit code that enables double precision in the kernel |
| 969 | clKernWrite(transKernel, 0) << "#ifdef cl_khr_fp64" << std::endl; |
| 970 | clKernWrite(transKernel, 3) << "#pragma OPENCL EXTENSION cl_khr_fp64 : enable" << std::endl; |
| 971 | clKernWrite(transKernel, 0) << "#else" << std::endl; |
| 972 | clKernWrite(transKernel, 3) << "#pragma OPENCL EXTENSION cl_amd_fp64 : enable" << std::endl; |
| 973 | clKernWrite(transKernel, 0) << "#endif\n" << std::endl; |
| 974 | |
| 975 | break; |
| 976 | default: |
| 977 | return CLFFT_TRANSPOSED_NOTIMPLEMENTED; |
no test coverage detected