GNU Radio 3.6.1 C++ API
volk_32f_s32f_multiply_32f_u.h
Go to the documentation of this file.
1 #ifndef INCLUDED_volk_32f_s32f_multiply_32f_u_H
2 #define INCLUDED_volk_32f_s32f_multiply_32f_u_H
3 
4 #include <inttypes.h>
5 #include <stdio.h>
6 
7 #ifdef LV_HAVE_SSE
8 #include <xmmintrin.h>
9 /*!
10  \brief Scalar float multiply
11  \param cVector The vector where the results will be stored
12  \param aVector One of the vectors to be multiplied
13  \param scalar the scalar value
14  \param num_points The number of values in aVector and bVector to be multiplied together and stored into cVector
15 */
16 static inline void volk_32f_s32f_multiply_32f_u_sse(float* cVector, const float* aVector, const float scalar, unsigned int num_points){
17  unsigned int number = 0;
18  const unsigned int quarterPoints = num_points / 4;
19 
20  float* cPtr = cVector;
21  const float* aPtr = aVector;
22 
23  __m128 aVal, bVal, cVal;
24  bVal = _mm_set_ps1(scalar);
25  for(;number < quarterPoints; number++){
26 
27  aVal = _mm_loadu_ps(aPtr);
28 
29  cVal = _mm_mul_ps(aVal, bVal);
30 
31  _mm_storeu_ps(cPtr,cVal); // Store the results back into the C container
32 
33  aPtr += 4;
34  cPtr += 4;
35  }
36 
37  number = quarterPoints * 4;
38  for(;number < num_points; number++){
39  *cPtr++ = (*aPtr++) * scalar;
40  }
41 }
42 #endif /* LV_HAVE_SSE */
43 
44 #ifdef LV_HAVE_AVX
45 #include <immintrin.h>
46 /*!
47  \brief Scalar float multiply
48  \param cVector The vector where the results will be stored
49  \param aVector One of the vectors to be multiplied
50  \param scalar the scalar value
51  \param num_points The number of values in aVector and bVector to be multiplied together and stored into cVector
52 */
53 static inline void volk_32f_s32f_multiply_32f_u_avx(float* cVector, const float* aVector, const float scalar, unsigned int num_points){
54  unsigned int number = 0;
55  const unsigned int eighthPoints = num_points / 8;
56 
57  float* cPtr = cVector;
58  const float* aPtr = aVector;
59 
60  __m256 aVal, bVal, cVal;
61  bVal = _mm256_set1_ps(scalar);
62  for(;number < eighthPoints; number++){
63 
64  aVal = _mm256_loadu_ps(aPtr);
65 
66  cVal = _mm256_mul_ps(aVal, bVal);
67 
68  _mm256_storeu_ps(cPtr,cVal); // Store the results back into the C container
69 
70  aPtr += 8;
71  cPtr += 8;
72  }
73 
74  number = eighthPoints * 8;
75  for(;number < num_points; number++){
76  *cPtr++ = (*aPtr++) * scalar;
77  }
78 }
79 #endif /* LV_HAVE_AVX */
80 
81 #ifdef LV_HAVE_GENERIC
82 /*!
83  \brief Scalar float multiply
84  \param cVector The vector where the results will be stored
85  \param aVector One of the vectors to be multiplied
86  \param scalar the scalar value
87  \param num_points The number of values in aVector and bVector to be multiplied together and stored into cVector
88 */
89 static inline void volk_32f_s32f_multiply_32f_u_generic(float* cVector, const float* aVector, const float scalar, unsigned int num_points){
90  unsigned int number = 0;
91  const float* inputPtr = aVector;
92  float* outputPtr = cVector;
93  for(number = 0; number < num_points; number++){
94  *outputPtr = (*inputPtr) * scalar;
95  inputPtr++;
96  outputPtr++;
97  }
98 }
99 #endif /* LV_HAVE_GENERIC */
100 
101 
102 #endif /* INCLUDED_volk_32f_s32f_multiply_32f_u_H */