[hamradio-commits] [gnss-sdr] 58/149: Integrating a new volk kernel
Carles Fernandez
carles_fernandez-guest at moszumanska.debian.org
Sat Feb 6 19:43:03 UTC 2016
This is an automated email from the git hooks/post-receive script.
carles_fernandez-guest pushed a commit to branch next
in repository gnss-sdr.
commit ece7bc2c6550bee46aa2baeefaa2dda28155743e
Author: Carles Fernandez <carles.fernandez at gmail.com>
Date: Wed Jan 13 11:42:01 2016 +0100
Integrating a new volk kernel
---
.../volk_gnsssdr_16ic_x2_multiply_16ic.h | 35 +++++++++++-----------
.../volk_gnsssdr/lib/kernel_tests.h | 1 +
.../tracking/libs/cpu_multicorrelator_16sc.cc | 28 +++++++----------
3 files changed, 29 insertions(+), 35 deletions(-)
diff --git a/src/algorithms/tracking/libs/volk_gnsssdr_16ic_x2_multiply_16ic.h b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_16ic_x2_multiply_16ic.h
similarity index 80%
rename from src/algorithms/tracking/libs/volk_gnsssdr_16ic_x2_multiply_16ic.h
rename to src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_16ic_x2_multiply_16ic.h
index 8710207..070d507 100644
--- a/src/algorithms/tracking/libs/volk_gnsssdr_16ic_x2_multiply_16ic.h
+++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_16ic_x2_multiply_16ic.h
@@ -51,11 +51,11 @@
*/
static inline void volk_gnsssdr_16ic_x2_multiply_16ic_generic(lv_16sc_t* result, const lv_16sc_t* in_a, const lv_16sc_t* in_b, unsigned int num_points)
{
- for (unsigned int n=0;n<num_points;n++)
- {
- //r*a.r - i*a.i, i*a.r + r*a.i
- result[n]=in_a[n]*in_b[n];
- }
+ for (unsigned int n = 0; n < num_points; n++)
+ {
+ //r*a.r - i*a.i, i*a.r + r*a.i
+ result[n] = in_a[n] * in_b[n];
+ }
}
#endif /*LV_HAVE_GENERIC*/
@@ -74,27 +74,27 @@ static inline void volk_gnsssdr_16ic_x2_multiply_16ic_a_sse2(lv_16sc_t* out, con
const lv_16sc_t* _in_a = in_a;
const lv_16sc_t* _in_b = in_b;
lv_16sc_t* _out = out;
- for(unsigned int number = 0;number < sse_iters; number++)
+ for(unsigned int number = 0; number < sse_iters; number++)
{
- //std::complex<T> memory structure: real part -> reinterpret_cast<cv T*>(a)[2*i]
- //imaginery part -> reinterpret_cast<cv T*>(a)[2*i + 1]
- // a[127:0]=[a3.i,a3.r,a2.i,a2.r,a1.i,a1.r,a0.i,a0.r]
+ //std::complex<T> memory structure: real part -> reinterpret_cast<cv T*>(a)[2*i]
+ //imaginery part -> reinterpret_cast<cv T*>(a)[2*i + 1]
+ // a[127:0]=[a3.i,a3.r,a2.i,a2.r,a1.i,a1.r,a0.i,a0.r]
a = _mm_loadu_si128((__m128i*)_in_a); //load (2 byte imag, 2 byte real) x 4 into 128 bits reg
b = _mm_loadu_si128((__m128i*)_in_b);
- c=_mm_mullo_epi16 (a, b); // a3.i*b3.i, a3.r*b3.r, ....
+ c = _mm_mullo_epi16 (a, b); // a3.i*b3.i, a3.r*b3.r, ....
c_sr = _mm_srli_si128 (c, 2); // Shift a right by imm8 bytes while shifting in zeros, and store the results in dst.
- real = _mm_subs_epi16 (c,c_sr);
+ real = _mm_subs_epi16 (c, c_sr);
real = _mm_and_si128 (real, mask_real); // a3.r*b3.r-a3.i*b3.i , 0, a3.r*b3.r- a3.i*b3.i
- b_sl = _mm_slli_si128(b,2); // b3.r, b2.i ....
- a_sl = _mm_slli_si128(a,2); // a3.r, a2.i ....
+ b_sl = _mm_slli_si128(b, 2); // b3.r, b2.i ....
+ a_sl = _mm_slli_si128(a, 2); // a3.r, a2.i ....
- imag1 = _mm_mullo_epi16(a,b_sl); // a3.i*b3.r, ....
- imag2 = _mm_mullo_epi16(b,a_sl); // b3.i*a3.r, ....
+ imag1 = _mm_mullo_epi16(a, b_sl); // a3.i*b3.r, ....
+ imag2 = _mm_mullo_epi16(b, a_sl); // b3.i*a3.r, ....
- imag = _mm_adds_epi16(imag1,imag2);
+ imag = _mm_adds_epi16(imag1, imag2);
imag = _mm_and_si128 (imag, mask_imag); // a3.i*b3.r+b3.i*a3.r, 0, ...
result = _mm_or_si128 (real, imag);
@@ -104,10 +104,9 @@ static inline void volk_gnsssdr_16ic_x2_multiply_16ic_a_sse2(lv_16sc_t* out, con
_in_a += 4;
_in_b += 4;
_out += 4;
-
}
- for (unsigned int i = 0; i<(num_points % 4); ++i)
+ for (unsigned int i = 0; i < (num_points % 4); ++i)
{
*_out++ = (*_in_a++) * (*_in_b++);
}
diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/kernel_tests.h b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/kernel_tests.h
index 1df4c90..298d45c 100644
--- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/kernel_tests.h
+++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/kernel_tests.h
@@ -80,6 +80,7 @@ std::vector<volk_gnsssdr_test_case_t> init_test_list(volk_gnsssdr_test_params_t
(VOLK_INIT_TEST(volk_gnsssdr_32fc_convert_8ic, test_params))
(VOLK_INIT_TEST(volk_gnsssdr_32fc_convert_16ic, test_params))
(VOLK_INIT_TEST(volk_gnsssdr_16ic_x2_dot_prod_16ic, test_params))
+ (VOLK_INIT_TEST(volk_gnsssdr_16ic_x2_multiply_16ic, test_params))
//(VOLK_INIT_TEST(volk_gnsssdr_16ic_resampler_16ic, test_params))
;
diff --git a/src/algorithms/tracking/libs/cpu_multicorrelator_16sc.cc b/src/algorithms/tracking/libs/cpu_multicorrelator_16sc.cc
index e1cb2c2..b0f8f74 100644
--- a/src/algorithms/tracking/libs/cpu_multicorrelator_16sc.cc
+++ b/src/algorithms/tracking/libs/cpu_multicorrelator_16sc.cc
@@ -41,19 +41,14 @@
#define LV_HAVE_GENERIC
#define LV_HAVE_SSE2
-//#include "volk_gnsssdr_16ic_x2_dot_prod_16ic.h"
-#include "volk_gnsssdr_16ic_x2_multiply_16ic.h"
-//#include "volk_gnsssdr_16ic_resampler_16ic.h"
#include "volk_gnsssdr_16ic_xn_resampler_16ic_xn.h"
#include "volk_gnsssdr_16ic_xn_dot_prod_16ic_xn.h"
bool cpu_multicorrelator_16sc::init(
- int max_signal_length_samples,
- int n_correlators
- )
+ int max_signal_length_samples,
+ int n_correlators)
{
-
- // ALLOCATE MEMORY FOR INTERNAL vectors
+ // ALLOCATE MEMORY FOR INTERNAL vectors
size_t size = max_signal_length_samples * sizeof(lv_16sc_t);
// NCO signal
@@ -76,8 +71,7 @@ bool cpu_multicorrelator_16sc::init(
bool cpu_multicorrelator_16sc::set_local_code_and_taps(
int code_length_chips,
const lv_16sc_t* local_code_in,
- float *shifts_chips
- )
+ float *shifts_chips)
{
d_local_code_in = local_code_in;
d_shifts_chips = shifts_chips;
@@ -98,12 +92,11 @@ bool cpu_multicorrelator_16sc::set_input_output_vectors(lv_16sc_t* corr_out, con
void cpu_multicorrelator_16sc::update_local_code(int correlator_length_samples,float rem_code_phase_chips, float code_phase_step_chips)
{
-
float *tmp_code_phases_chips;
- tmp_code_phases_chips=static_cast<float*>(volk_malloc(d_n_correlators*sizeof(float), volk_get_alignment()));
- for (int n=0;n<d_n_correlators;n++)
+ tmp_code_phases_chips = static_cast<float*>(volk_malloc(d_n_correlators*sizeof(float), volk_get_alignment()));
+ for (int n = 0; n < d_n_correlators; n++)
{
- tmp_code_phases_chips[n]=d_shifts_chips[n]-rem_code_phase_chips;
+ tmp_code_phases_chips[n] = d_shifts_chips[n] - rem_code_phase_chips;
}
volk_gnsssdr_16ic_xn_resampler_16ic_xn_sse2(d_local_codes_resampled,
@@ -155,11 +148,12 @@ bool cpu_multicorrelator_16sc::Carrier_wipeoff_multicorrelator_resampler(
update_local_carrier(signal_length_samples, rem_carrier_phase_in_rad, phase_step_rad);
//std::cout<<"d_nco_in 16sc="<<d_nco_in[23]<<std::endl;
- volk_gnsssdr_16ic_x2_multiply_16ic_a_sse2(d_sig_doppler_wiped,d_sig_in,d_nco_in,signal_length_samples);
+ //volk_gnsssdr_16ic_x2_multiply_16ic_a_sse2(d_sig_doppler_wiped,d_sig_in,d_nco_in,signal_length_samples);
+ volk_gnsssdr_16ic_x2_multiply_16ic(d_sig_doppler_wiped, d_sig_in, d_nco_in, signal_length_samples);
//std::cout<<"d_sig_doppler_wiped 16sc="<<d_sig_doppler_wiped[23]<<std::endl;
- update_local_code(signal_length_samples,rem_code_phase_chips, code_phase_step_chips);
+ update_local_code(signal_length_samples, rem_code_phase_chips, code_phase_step_chips);
- volk_gnsssdr_16ic_xn_dot_prod_16ic_xn_a_sse2(d_corr_out, d_sig_doppler_wiped, (const lv_16sc_t**)d_local_codes_resampled,signal_length_samples,d_n_correlators);
+ volk_gnsssdr_16ic_xn_dot_prod_16ic_xn_a_sse2(d_corr_out, d_sig_doppler_wiped, (const lv_16sc_t**)d_local_codes_resampled, signal_length_samples, d_n_correlators);
//for (int current_correlator_tap = 0; current_correlator_tap < d_n_correlators; current_correlator_tap++)
// {
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-hamradio/gnss-sdr.git
More information about the pkg-hamradio-commits
mailing list