GNU Radio 3.6.2 C++ API
volk_32f_s32f_multiply_32f_a.h
Go to the documentation of this file.
1 #ifndef INCLUDED_volk_32f_s32f_multiply_32f_a_H
2 #define INCLUDED_volk_32f_s32f_multiply_32f_a_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_a_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_load_ps(aPtr);
28 
29  cVal = _mm_mul_ps(aVal, bVal);
30 
31  _mm_store_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_a_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_load_ps(aPtr);
65 
66  cVal = _mm256_mul_ps(aVal, bVal);
67 
68  _mm256_store_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 
82 #ifdef LV_HAVE_GENERIC
83 /*!
84  \brief Scalar float multiply
85  \param cVector The vector where the results will be stored
86  \param aVector One of the vectors to be multiplied
87  \param scalar the scalar value
88  \param num_points The number of values in aVector and bVector to be multiplied together and stored into cVector
89 */
90 static inline void volk_32f_s32f_multiply_32f_a_generic(float* cVector, const float* aVector, const float scalar, unsigned int num_points){
91  unsigned int number = 0;
92  const float* inputPtr = aVector;
93  float* outputPtr = cVector;
94  for(number = 0; number < num_points; number++){
95  *outputPtr = (*inputPtr) * scalar;
96  inputPtr++;
97  outputPtr++;
98  }
99 }
100 #endif /* LV_HAVE_GENERIC */
101 
102 #ifdef LV_HAVE_ORC
103 /*!
104  \brief Scalar float multiply
105  \param cVector The vector where the results will be stored
106  \param aVector One of the vectors to be multiplied
107  \param scalar the scalar value
108  \param num_points The number of values in aVector and bVector to be multiplied together and stored into cVector
109 */
110 extern void volk_32f_s32f_multiply_32f_a_orc_impl(float* dst, const float* src, const float scalar, unsigned int num_points);
111 static inline void volk_32f_s32f_multiply_32f_a_orc(float* cVector, const float* aVector, const float scalar, unsigned int num_points){
112  volk_32f_s32f_multiply_32f_a_orc_impl(cVector, aVector, scalar, num_points);
113 }
114 #endif /* LV_HAVE_GENERIC */
115 
116 
117 
118 
119 #endif /* INCLUDED_volk_32f_s32f_multiply_32f_a_H */