1/* 2 * Copyright (c) 2019-2021 Arm Limited. 3 * 4 * SPDX-License-Identifier: MIT 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to 8 * deal in the Software without restriction, including without limitation the 9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10 * sell copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in all 14 * copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 * SOFTWARE. 23 */ 24#include "helpers.h" 25 26#if defined(VEC_SIZE) && defined(DATA_TYPE) 27/** Computes the fft scale stage 28 * 29 * @param[in] src_ptr Pointer to the source tensor. Supported data types: F16/F32 30 * @param[in] src_stride_x Stride of the source tensor in X dimension (in bytes) 31 * @param[in] src_step_x src_stride_x * number of elements along X processed per workitem(in bytes) 32 * @param[in] src_stride_y Stride of the source tensor in Y dimension (in bytes) 33 * @param[in] src_step_y src_stride_y * number of elements along Y processed per workitem(in bytes) 34 * @param[in] src_stride_z Stride of the source tensor in Z dimension (in bytes) 35 * @param[in] src_step_z src_stride_z * number of elements along Z processed per workitem(in bytes) 36 * @param[in] src_offset_first_element_in_bytes The offset of the first element in the source tensor 37 * @param[out] dst_ptr (Optional) Pointer to the destination tensor. Supported data types: same as @p src_ptr 38 * @param[in] dst_stride_x (Optional) Stride of the destination tensor in X dimension (in bytes) 39 * @param[in] dst_step_x (Optional) dst_stride_x * number of elements along X processed per workitem(in bytes) 40 * @param[in] dst_stride_y (Optional) Stride of the destination tensor in Y dimension (in bytes) 41 * @param[in] dst_step_y (Optional) dst_stride_y * number of elements along Y processed per workitem(in bytes) 42 * @param[in] dst_stride_z (Optional) Stride of the source tensor in Z dimension (in bytes) 43 * @param[in] dst_step_z (Optional) dst_stride_z * number of elements along Z processed per workitem(in bytes) 44 * @param[in] dst_offset_first_element_in_bytes (Optional) The offset of the first element in the destination tensor 45 * @param[in] scale Scale to apply to the complex value 46 */ 47__kernel void fft_scale_conj( 48 TENSOR3D_DECLARATION(src) 49#ifndef IN_PLACE 50 , 51 TENSOR3D_DECLARATION(dst) 52#endif /* not IN_PLACE */ 53 , 54 float scale) 55{ 56 // Get tensor pointers 57 Tensor3D src = CONVERT_TO_TENSOR3D_STRUCT(src); 58#if defined(IN_PLACE) 59 Tensor3D dst = src; 60#else /* IN_PLACE */ 61 Tensor3D dst = CONVERT_TO_TENSOR3D_STRUCT(dst); 62#endif /* IN_PLACE */ 63 64 // Store result 65#if VEC_SIZE == 1 66 *((__global DATA_TYPE *)dst.ptr) = (*(__global DATA_TYPE *)src.ptr) / (DATA_TYPE)scale; 67#elif VEC_SIZE == 2 68 // Load data 69 VEC_DATA_TYPE(DATA_TYPE, 2) 70 data = vload2(0, (__global DATA_TYPE *)src.ptr); 71 data /= (DATA_TYPE)scale; 72#if defined(CONJ) 73 vstore2((VEC_DATA_TYPE(DATA_TYPE, 2))(data.s0, -data.s1), 0, (__global DATA_TYPE *)dst.ptr); 74#else // defined(CONJ) 75 vstore2(data, 0, (__global DATA_TYPE *)dst.ptr); 76#endif // defined(CONJ) 77#else // VEC_SIZE == 1 78#error "vec_size of 1 and 2 are supported" 79#endif // VEC_SIZE == 1 80} 81#endif // defined(VEC_SIZE) && defined(DATA_TYPE)