38 #include <hip/hip_fp16.h>
40 #if __has_include(<half/half.hpp>)
41 #include <half/half.hpp>
45 using halfhpp = half_float::half;
46 typedef halfhpp Rpp16f;
50 #elif defined(__x86_64__) || defined(_M_X64)
51 #include <immintrin.h>
52 #include <smmintrin.h>
53 #include <x86intrin.h>
57 #if defined(__HIP_DEVICE_COMPILE__)
58 #define SIMDE_NO_NATIVE
60 #define SIMDE_ENABLE_NATIVE_ALIASES
61 #include <simde/x86/avx2.h>
62 #include <simde/x86/f16c.h>
63 #include <simde/x86/fma.h>
65 #ifndef _MM_FROUND_NO_EXC
66 #define _MM_FROUND_NO_EXC 0x08
72 #define RPP_MIN_8U (0)
74 #define RPP_MAX_8U (255)
76 #define RPPT_MAX_DIMS (5)
79 #define RPPT_MAX_DIMS_SAMPLE (4)
81 #define RPPT_MAX_AUDIO_CHANNELS (16)
85 #define RPP_RETURN_IF_ERROR(expr) \
87 RppStatus _rpp_status = (expr); \
88 if (_rpp_status != RPP_SUCCESS) return _rpp_status; \
92 #include <hip/hip_runtime.h>
93 #define RPP_HOST_DEVICE __host__ __device__
97 #define RPP_HIP_RETURN_IF_ERROR(expr) \
99 hipError_t _rpp_hip_err = (expr); \
100 if (_rpp_hip_err != hipSuccess) { \
101 fprintf(stderr, "HIP runtime error: %s returned %d at %s:%d", #expr, _rpp_hip_err, \
102 __FILE__, __LINE__); \
103 return RPP_ERROR_HIP_RUNTIME; \
109 #define HIP_CHECK_LAUNCH_RETURN() \
111 hipError_t status = hipGetLastError(); \
112 if (status != hipSuccess) { \
113 fprintf(stderr, "HIP kernel launch error: returned %d at %s:%d", status, __FILE__, \
115 return RPP_ERROR_HIP_LAUNCH; \
119 #define RPP_HOST_DEVICE
122 const float ONE_OVER_6 = 1.0f / 6;
123 const float ONE_OVER_3 = 1.0f / 3;
124 const float TWO_OVER_3 = 2.0f / 3;
125 const float ONE_OVER_255 = 1.0f / 255;
126 const uint MMS_MAX_SCRATCH_MEMORY = 115293120;
128 const uint SPECTROGRAM_MAX_SCRATCH_MEMORY =
131 #define DROPOUT_FIXED_SEED 42
132 #define RANDOM_ERASE_NOISE_BUFFER_SIDE \
264 return "RPP_SUCCESS";
268 return "RPP_ERROR_INVALID_ARGUMENTS";
270 return "RPP_ERROR_LOW_OFFSET";
272 return "RPP_ERROR_ZERO_DIVISION";
274 return "RPP_ERROR_HIGH_SRC_DIMENSION";
276 return "RPP_ERROR_NOT_IMPLEMENTED";
278 return "RPP_ERROR_INVALID_SRC_CHANNELS";
280 return "RPP_ERROR_INVALID_DST_CHANNELS";
282 return "RPP_ERROR_INVALID_SRC_LAYOUT";
284 return "RPP_ERROR_INVALID_DST_LAYOUT";
286 return "RPP_ERROR_INVALID_SRC_DATATYPE";
288 return "RPP_ERROR_INVALID_DST_DATATYPE";
290 return "RPP_ERROR_INVALID_SRC_OR_DST_DATATYPE";
292 return "RPP_ERROR_INSUFFICIENT_DST_BUFFER_LENGTH";
294 return "RPP_ERROR_INVALID_PARAMETER_DATATYPE";
296 return "RPP_ERROR_NOT_ENOUGH_MEMORY";
298 return "RPP_ERROR_OUT_OF_BOUND_SRC_ROI";
300 return "RPP_ERROR_LAYOUT_MISMATCH";
302 return "RPP_ERROR_INVALID_CHANNELS";
304 return "RPP_ERROR_INVALID_OUTPUT_TILE_LENGTH";
306 return "RPP_ERROR_OUT_OF_BOUND_SHARED_MEMORY_SIZE";
308 return "RPP_ERROR_OUT_OF_BOUND_SCRATCH_MEMORY_SIZE";
310 return "RPP_ERROR_INVALID_SRC_DIMS";
312 return "RPP_ERROR_INVALID_DST_DIMS";
314 return "RPP_ERROR_INVALID_DIM_LENGTHS";
316 return "RPP_ERROR_INVALID_AXIS";
318 return "RPP_ERROR_INCOMPATIBLE_BACKEND";
320 return "RPP_ERROR_HIP_LAUNCH";
322 return "RPP_ERROR_HIP_RUNTIME";
325 return "RPP_STATUS_UNKNOWN";
331 typedef enum { RPP_HOST_BACKEND, RPP_HIP_BACKEND }
RppBackend;
337 rppStatusSuccess = 0,
338 rppStatusBadParm = -1,
339 rppStatusUnknownError = -2,
340 rppStatusNotInitialized = -3,
341 rppStatusInvalidValue = -4,
342 rppStatusAllocFailed = -5,
343 rppStatusInternalError = -6,
344 rppStatusNotImplemented = -7,
345 rppStatusUnsupportedOp = -8,
353 RPP_TENSOR_OP_SUBTRACT,
354 RPP_TENSOR_OP_MULTIPLY,
361 typedef enum { RPP_TENSOR_OP_AND, RPP_TENSOR_OP_OR, RPP_TENSOR_OP_XOR }
RpptBitwiseOp;
371 RPP_BROADCAST_ENABLE,
372 RPP_BROADCAST_DISABLE
482 NEAREST_NEIGHBOR = 0,
565 int roiWidth, roiHeight;
574 int roiWidth, roiHeight, roiDepth;
620 : dataType(dataType), n(n), c(c), h(h), w(w), layout(layout) {
621 if (layout == NCHW) {
622 strides.nStride = c * h * w;
623 strides.cStride = h * w;
626 }
else if (layout == NHWC) {
627 strides.nStride = h * w * c;
628 strides.hStride = w * c;
636 : offsetInBytes(offsetInBytes),
716 float boxMullerExtra;
748 switch (interpolationType) {
749 case RpptInterpolationType::BICUBIC: {
753 case RpptInterpolationType::LANCZOS: {
754 if (in_size > out_size) {
755 this->radius = 3.0f * scaleRatio;
756 this->scale = (1 / scaleRatio);
761 case RpptInterpolationType::GAUSSIAN: {
762 if (in_size > out_size) {
763 this->radius = scaleRatio;
764 this->scale = (1 / scaleRatio);
768 case RpptInterpolationType::TRIANGULAR: {
769 if (in_size > out_size) {
770 this->radius = scaleRatio;
771 this->scale = (1 / scaleRatio);
781 this->size = std::ceil(2 * this->radius);
796 Rpp32f locRaw = x * scale + center;
797 Rpp32s locFloor = std::floor(locRaw);
798 Rpp32f weight = locRaw - locFloor;
799 locFloor = std::max(std::min(locFloor, lookupSize - 2), 0);
800 Rpp32f current = lookup[locFloor];
801 Rpp32f next = lookup[locFloor + 1];
802 return current + weight * (next - current);
805 inline __m128 operator()(__m128 x) {
806 __m128 pLocRaw = _mm_add_ps(_mm_mul_ps(x, pScale), pCenter);
807 __m128i pxLocFloor = _mm_cvttps_epi32(pLocRaw);
808 __m128 pLocFloor = _mm_cvtepi32_ps(pxLocFloor);
809 __m128 pWeight = _mm_sub_ps(pLocRaw, pLocFloor);
811 _mm_storeu_si128(
reinterpret_cast<__m128i*
>(idx), pxLocFloor);
813 _mm_setr_ps(lookup[idx[0]], lookup[idx[1]], lookup[idx[2]], lookup[idx[3]]);
814 __m128 pNext = _mm_setr_ps(lookup[idx[0] + 1], lookup[idx[1] + 1], lookup[idx[2] + 1],
816 return _mm_add_ps(pCurrent, _mm_mul_ps(pWeight, _mm_sub_ps(pNext, pCurrent)));
819 Rpp32f scale = 1, center = 1;
820 Rpp32s lobes = 0, coeffs = 0;
822 Rpp32f* lookupPinned =
nullptr;
823 std::vector<Rpp32f> lookup;
824 __m128 pCenter, pScale;
832 inline RPP_HOST_DEVICE
virtual Rpp32f hz_to_mel(
Rpp32f hz) = 0;
833 inline RPP_HOST_DEVICE
virtual Rpp32f mel_to_hz(
Rpp32f mel) = 0;
842 return 1127.0f * std::log(1.0f + (hz / 700.0f));
845 return 700.0f * (std::exp(mel / 1127.0f) - 1.0f);
857 const Rpp32f fsp = 66.666667f;
858 const Rpp32f minLogHz = 1000.0;
859 const Rpp32f minLogMel = (minLogHz - freqLow) / fsp;
860 const Rpp32f stepLog = 0.068751777;
862 const Rpp32f invMinLogHz = 0.001f;
863 const Rpp32f invStepLog = 1.0f / stepLog;
864 const Rpp32f invFsp = 1.0f / fsp;
869 mel = minLogMel + std::log(hz * invMinLogHz) * invStepLog;
871 mel = (hz - freqLow) * invFsp;
878 if (mel >= minLogMel)
879 hz = minLogHz * std::exp(stepLog * (mel - minLogMel));
881 hz = freqLow + mel * fsp;
895 Rpp32f* scratchBufferHost;
unsigned int Rpp32u
32 bit unsigned int
Definition: rppdefs.h:147
int Rpp32s
32 bit signed int
Definition: rppdefs.h:149
signed char Rpp8s
8 bit signed char
Definition: rppdefs.h:141
RpptMelScaleFormula
RPPT Mel Scale Formula.
Definition: rppdefs.h:512
unsigned short Rpp16u
16 bit unsigned short
Definition: rppdefs.h:143
unsigned char Rpp8u
8 bit unsigned char
Definition: rppdefs.h:139
void * RppPtr_t
void pointer
Definition: rppdefs.h:159
RpptLayout
RPPT Tensor layout type enum.
Definition: rppdefs.h:422
RpptRoiType
RPPT Tensor 2D ROI type enum.
Definition: rppdefs.h:460
RpptDataType
RPPT Tensor datatype enum.
Definition: rppdefs.h:417
RpptImageBorderType
RPPT Image Border Type.
Definition: rppdefs.h:503
struct RpptResamplingWindow RpptResamplingWindow
RPPT Tensor RpptResamplingWindow type struct.
double Rpp64f
64 bit double
Definition: rppdefs.h:157
RpptImageBorderEdge
RPPT Image Border Edge type enum.
Definition: rppdefs.h:498
RpptAudioBorderType
RPPT Audio Border Type.
Definition: rppdefs.h:493
size_t RppSize_t
size_t
Definition: rppdefs.h:161
RpptBitwiseOp
RPPT Broadcast Mode type enum.
Definition: rppdefs.h:361
RpptColorStandard
Color space standard for NV12 to RGB (YUV/YCbCr to RGB matrix).
Definition: rppdefs.h:436
struct GenericFilter GenericFilter
RPPT Tensor GenericFilter type struct.
RppStatus
RPP RppStatus type enums.
Definition: rppdefs.h:166
RpptColorRange
Color range (luma/chroma legal levels) for NV12 to RGB.
Definition: rppdefs.h:452
RpptRoi3DType
RPPT Tensor 3D ROI type enum.
Definition: rppdefs.h:468
const char * rppGetStatusString(RppStatus status) noexcept
Get the string representation of a RPP status code.
Definition: rppdefs.h:259
unsigned long long Rpp64u
64 bit unsigned long long
Definition: rppdefs.h:151
#define RPPT_MAX_DIMS
RPP maximum dimensions in tensor .
Definition: rppdefs.h:76
RpptInterpolationType
RPPT Tensor interpolation type enum.
Definition: rppdefs.h:481
RpptSubpixelLayout
RPPT Tensor subpixel layout type enum.
Definition: rppdefs.h:476
RpptOp
RPP Tensor Operations type enum.
Definition: rppdefs.h:351
short Rpp16s
16 bit signed short
Definition: rppdefs.h:145
float Rpp32f
32 bit float
Definition: rppdefs.h:155
RppBackend
RPP RppBackend type enums.
Definition: rppdefs.h:331
long long Rpp64s
64 bit long long
Definition: rppdefs.h:153
rppStatus_t
RPP rppStatus_t type enums.
Definition: rppdefs.h:336
@ RpptColorStandard_FCC
Definition: rppdefs.h:438
@ RpptColorStandard_SMPTE240M
Definition: rppdefs.h:441
@ RpptColorStandard_BT601
Definition: rppdefs.h:440
@ RpptColorStandard_BT470BG
Definition: rppdefs.h:439
@ RpptColorStandard_BT709
Definition: rppdefs.h:437
@ RpptColorStandard_BT2020_NCL
Definition: rppdefs.h:442
@ RpptColorStandard_BT2020_CL
Definition: rppdefs.h:443
@ RPP_ERROR_NOT_IMPLEMENTED
Function variant requested is not implemented / unsupported.
Definition: rppdefs.h:183
@ RPP_ERROR_INVALID_DST_DATATYPE
Invalid dst tensor datatype. (Needs to adhere to function specification.) group_rppdefs.
Definition: rppdefs.h:201
@ RPP_ERROR_INVALID_OUTPUT_TILE_LENGTH
Invalid output tile length (Needs to adhere to function specification.) group_rppdefs.
Definition: rppdefs.h:222
@ RPP_ERROR_INVALID_DIM_LENGTHS
Length in some dimensions are invalid. (Needs to adhere to function specification....
Definition: rppdefs.h:237
@ RPP_ERROR_OUT_OF_BOUND_SRC_ROI
Out of bound source ROI.
Definition: rppdefs.h:214
@ RPP_ERROR_OUT_OF_BOUND_SHARED_MEMORY_SIZE
Shared memory size needed is beyond the bounds (Needs to adhere to function specification....
Definition: rppdefs.h:225
@ RPP_ERROR_INCOMPATIBLE_BACKEND
The user specified backend is not compatible with the initialized handle group_rppdefs.
Definition: rppdefs.h:243
@ RPP_ERROR_HIP_LAUNCH
HIP/GPU runtime or kernel launch error.
Definition: rppdefs.h:245
@ RPP_ERROR_ZERO_DIVISION
Arguments provided will result in zero division error.
Definition: rppdefs.h:177
@ RPP_ERROR_INVALID_ARGUMENTS
One or more arguments invalid. (Needs to adhere to function specification.) group_rppdefs.
Definition: rppdefs.h:173
@ RPP_ERROR_LAYOUT_MISMATCH
src and dst layout mismatch
Definition: rppdefs.h:216
@ RPP_ERROR_INVALID_CHANNELS
Number of channels is invalid. (Needs to adhere to function specification.) group_rppdefs.
Definition: rppdefs.h:219
@ RPP_ERROR_INVALID_SRC_CHANNELS
Invalid src tensor number of channels. (Needs to adhere to function specification....
Definition: rppdefs.h:186
@ RPP_ERROR_INVALID_SRC_OR_DST_DATATYPE
Invalid src/dst tensor datatype. (Needs to adhere to function specification.)
Definition: rppdefs.h:204
@ RPP_ERROR_INVALID_PARAMETER_DATATYPE
Invalid datatype.
Definition: rppdefs.h:209
@ RPP_ERROR_NOT_ENOUGH_MEMORY
Not enough memory to write outputs, as per dim-lengths and strides set in descriptor.
Definition: rppdefs.h:212
@ RPP_ERROR
Unspecified error.
Definition: rppdefs.h:170
@ RPP_ERROR_INVALID_SRC_DIMS
Number of src dims is invalid. (Needs to adhere to function specification.) group_rppdefs.
Definition: rppdefs.h:231
@ RPP_ERROR_OUT_OF_BOUND_SCRATCH_MEMORY_SIZE
Scratch memory size needed is beyond the bounds (Needs to adhere to function specification....
Definition: rppdefs.h:228
@ RPP_ERROR_INVALID_DST_LAYOUT
Invalid dst tensor layout. (Needs to adhere to function specification.) group_rppdefs.
Definition: rppdefs.h:195
@ RPP_ERROR_INVALID_AXIS
The specified axis is invalid or out of range. (Needs to adhere to function specification....
Definition: rppdefs.h:240
@ RPP_ERROR_INVALID_DST_CHANNELS
Invalid dst tensor number of channels. (Needs to adhere to function specification....
Definition: rppdefs.h:189
@ RPP_ERROR_HIP_RUNTIME
Internal HIP/GPU runtime error.
Definition: rppdefs.h:247
@ RPP_ERROR_INVALID_SRC_DATATYPE
Invalid src tensor datatype. (Needs to adhere to function specification.) group_rppdefs.
Definition: rppdefs.h:198
@ RPP_ERROR_INVALID_SRC_LAYOUT
Invalid src tensor layout. (Needs to adhere to function specification.) group_rppdefs.
Definition: rppdefs.h:192
@ RPP_ERROR_HIGH_SRC_DIMENSION
Src tensor / src ROI dimension too high. (Needs to adhere to function specification....
Definition: rppdefs.h:180
@ RPP_SUCCESS
No error.
Definition: rppdefs.h:168
@ RPP_ERROR_INSUFFICIENT_DST_BUFFER_LENGTH
Insufficient dst buffer length provided. (Needs to adhere to function specification....
Definition: rppdefs.h:207
@ RPP_ERROR_INVALID_DST_DIMS
Number of dst dims is invalid. (Needs to adhere to function specification.) group_rppdefs.
Definition: rppdefs.h:234
@ RPP_ERROR_LOW_OFFSET
Low tensor offsetInBytes provided for src/dst tensor.
Definition: rppdefs.h:175
@ RpptColorRange_FULL
Definition: rppdefs.h:454
@ RpptColorRange_STUDIO
Definition: rppdefs.h:453
RpptBroadcastMode
Broadcast support mode for RPP Tensor operations.
Definition: rppdefs.h:370
Base class for Mel scale conversions.
Definition: rppdefs.h:830
RPPT Tensor GenericFilter type struct.
Definition: rppdefs.h:742
Derived class for HTK Mel scale conversions.
Definition: rppdefs.h:840
RPP initialize handle.
Definition: rppdefs.h:939
RPP 24 float vector.
Definition: rppdefs.h:408
RPP 6 float vector.
Definition: rppdefs.h:387
RPP 9 float vector.
Definition: rppdefs.h:394
RPP 24 signed int vector.
Definition: rppdefs.h:401
RPP layout params.
Definition: rppdefs.h:379
RPPT Tensor 2D bilinear neighborhood 32-bit signed int 8-length-vectors type struct.
Definition: rppdefs.h:722
RPPT Tensor 2D bilinear neighborhood 32-bit float 8-length-vectors type struct.
Definition: rppdefs.h:732
RPPT Tensor Channel Offsets struct.
Definition: rppdefs.h:546
RPPT Tensor descriptor type struct.
Definition: rppdefs.h:609
RPPT Tensor 32-bit float RGB type struct.
Definition: rppdefs.h:671
RPPT Tensor 2D 32-bit float vector type struct.
Definition: rppdefs.h:688
RPPT Tensor Generic descriptor type struct.
Definition: rppdefs.h:650
RPPT Tensor 2D image patch dimensions type struct.
Definition: rppdefs.h:696
RPPT Image 2D cartesian point type struct.
Definition: rppdefs.h:521
RPPT Image 3D point type struct.
Definition: rppdefs.h:529
RPPT Tensor 8-bit uchar RGB type struct.
Definition: rppdefs.h:662
RPPT Tensor RpptResamplingWindow type struct.
Definition: rppdefs.h:788
RPPT Tensor 3D ROI LTFRBB struct.
Definition: rppdefs.h:555
RPPT Tensor 2D ROI LTRB struct.
Definition: rppdefs.h:538
RPPT Tensor 2D ROI XYWH struct.
Definition: rppdefs.h:563
RPPT Tensor 3D ROI XYZWHD struct.
Definition: rppdefs.h:572
RPPT Tensor strides type struct.
Definition: rppdefs.h:599
RPPT Tensor 2D 32-bit uint vector type struct.
Definition: rppdefs.h:680
RPPT Tensor random number generator state (xorwow box muller state) type struct.
Definition: rppdefs.h:712
RPPT Tensor random number generator state (xorwow state) type struct.
Definition: rppdefs.h:704
Derived class for Slaney Mel scale conversions.
Definition: rppdefs.h:855
RPP HIP 32-bit float memory.
Definition: rppdefs.h:905
RPP HOST memory type struct.
Definition: rppdefs.h:894
RPP HIP memory management type struct.
Definition: rppdefs.h:912
RPP HIP-HOST memory management.
Definition: rppdefs.h:920
RPPT Tensor 3D ROI union.
Definition: rppdefs.h:590
RPPT Tensor 2D ROI union.
Definition: rppdefs.h:581