mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-11-14 05:44:56 +00:00
Adding an option to build the binary without detecting the SIMD
instruction set present in the compiling machine, so it can be executed in other machines without those specific sets.
This commit is contained in:
parent
7d0ac88f93
commit
322550e0c6
@ -39,6 +39,7 @@ option(ENABLE_ARRAY "Enable the use of CTTC's antenna array front-end as signal
|
|||||||
option(ENABLE_RTLSDR "Enable the use of RTL dongles as signal source (experimental)" OFF)
|
option(ENABLE_RTLSDR "Enable the use of RTL dongles as signal source (experimental)" OFF)
|
||||||
option(ENABLE_OPENCL "Enable building of processing blocks implemented with OpenCL (experimental)" OFF)
|
option(ENABLE_OPENCL "Enable building of processing blocks implemented with OpenCL (experimental)" OFF)
|
||||||
option(ENABLE_GPERFTOOLS "Enable linking to Gperftools libraries (tcmalloc and profiler)" OFF)
|
option(ENABLE_GPERFTOOLS "Enable linking to Gperftools libraries (tcmalloc and profiler)" OFF)
|
||||||
|
option(ENABLE_GENERIC_ARCH "Builds a portable binary" OFF)
|
||||||
|
|
||||||
|
|
||||||
###############################
|
###############################
|
||||||
@ -752,6 +753,10 @@ if(ENABLE_OPENCL)
|
|||||||
message(STATUS "You can disable OpenCL use by doing 'cmake -DENABLE_OPENCL=OFF ../' ")
|
message(STATUS "You can disable OpenCL use by doing 'cmake -DENABLE_OPENCL=OFF ../' ")
|
||||||
endif(OPENCL_FOUND)
|
endif(OPENCL_FOUND)
|
||||||
endif(DISABLE_OPENCL)
|
endif(DISABLE_OPENCL)
|
||||||
|
if(ENABLE_GENERIC_ARCH)
|
||||||
|
set(OPENCL_FOUND FALSE)
|
||||||
|
message(STATUS "ENABLE_GENERIC_ARCH is set to ON so the use of OpenCL has been disabled.")
|
||||||
|
endif(ENABLE_GENERIC_ARCH)
|
||||||
if(NOT OPENCL_FOUND)
|
if(NOT OPENCL_FOUND)
|
||||||
message(STATUS "Processing blocks using OpenCL will not be built.")
|
message(STATUS "Processing blocks using OpenCL will not be built.")
|
||||||
endif(NOT OPENCL_FOUND)
|
endif(NOT OPENCL_FOUND)
|
||||||
@ -859,7 +864,11 @@ if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
|
|||||||
if(OS_IS_MACOSX)
|
if(OS_IS_MACOSX)
|
||||||
set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -march=corei7 -mfpmath=sse")
|
set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -march=corei7 -mfpmath=sse")
|
||||||
else(OS_IS_MACOSX)
|
else(OS_IS_MACOSX)
|
||||||
|
if(ENABLE_GENERIC_ARCH)
|
||||||
|
set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -mtune=generic")
|
||||||
|
else(ENABLE_GENERIC_ARCH)
|
||||||
set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -march=native -mfpmath=sse")
|
set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -march=native -mfpmath=sse")
|
||||||
|
endif(ENABLE_GENERIC_ARCH)
|
||||||
endif(OS_IS_MACOSX)
|
endif(OS_IS_MACOSX)
|
||||||
endif(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
|
endif(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
|
||||||
|
|
||||||
|
12
README.md
12
README.md
@ -11,7 +11,7 @@ If you have questions about GNSS-SDR, please [subscribe to the gnss-sdr-develope
|
|||||||
# How to build GNSS-SDR
|
# How to build GNSS-SDR
|
||||||
|
|
||||||
|
|
||||||
This section describes how to set up the compilation environment in GNU/Linux or [Mac OS X](#macosx), and to build GNSS-SDR. See also [our Building Guide](http://gnss-sdr.org/documentation/building-guide "GNSS-SDR's Building Guide").
|
This section describes how to set up the compilation environment in GNU/Linux or [Mac OS X](#macosx)t, and to build GNSS-SDR. See also [our Building Guide](http://gnss-sdr.org/documentation/building-guide "GNSS-SDR's Building Guide").
|
||||||
|
|
||||||
GNU/Linux
|
GNU/Linux
|
||||||
----------
|
----------
|
||||||
@ -304,6 +304,16 @@ $ make && make install
|
|||||||
~~~~~~
|
~~~~~~
|
||||||
|
|
||||||
|
|
||||||
|
###### Build a portable binary
|
||||||
|
|
||||||
|
In order to build an executable that not depends on the specific SIMD instruction set that is present in the processor of the compiling machine, so other users can execute it in other machines without those particular sets, use:
|
||||||
|
|
||||||
|
~~~~~~
|
||||||
|
$ cmake -DENABLE_GENERIC_ARCH=ON ../
|
||||||
|
$ make && make install
|
||||||
|
~~~~~~
|
||||||
|
|
||||||
|
Using this option, all SIMD instructions are accessed via VOLK, which automatically includes versions of each function for different SIMD instruction sets, then detects at runtime which to use, or if there are none, substitutes a generic, non-SIMD implementation.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,6 +39,10 @@ include_directories(
|
|||||||
${GNURADIO_RUNTIME_INCLUDE_DIRS}
|
${GNURADIO_RUNTIME_INCLUDE_DIRS}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if(ENABLE_GENERIC_ARCH)
|
||||||
|
add_definitions( -DGENERIC_ARCH=1 )
|
||||||
|
endif(ENABLE_GENERIC_ARCH)
|
||||||
|
|
||||||
file(GLOB TRACKING_GR_BLOCKS_HEADERS "*.h")
|
file(GLOB TRACKING_GR_BLOCKS_HEADERS "*.h")
|
||||||
add_library(tracking_gr_blocks ${TRACKING_GR_BLOCKS_SOURCES} ${TRACKING_GR_BLOCKS_HEADERS})
|
add_library(tracking_gr_blocks ${TRACKING_GR_BLOCKS_SOURCES} ${TRACKING_GR_BLOCKS_HEADERS})
|
||||||
source_group(Headers FILES ${TRACKING_GR_BLOCKS_HEADERS})
|
source_group(Headers FILES ${TRACKING_GR_BLOCKS_HEADERS})
|
||||||
|
@ -375,6 +375,7 @@ int Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc::general_work (int noutput_items, gr_vec
|
|||||||
update_local_carrier();
|
update_local_carrier();
|
||||||
|
|
||||||
// perform Early, Prompt and Late correlation
|
// perform Early, Prompt and Late correlation
|
||||||
|
#ifndef GENERIC_ARCH
|
||||||
d_correlator.Carrier_wipeoff_and_EPL_volk_custom(d_current_prn_length_samples,
|
d_correlator.Carrier_wipeoff_and_EPL_volk_custom(d_current_prn_length_samples,
|
||||||
in,
|
in,
|
||||||
d_carr_sign,
|
d_carr_sign,
|
||||||
@ -385,7 +386,18 @@ int Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc::general_work (int noutput_items, gr_vec
|
|||||||
d_Prompt,
|
d_Prompt,
|
||||||
d_Late,
|
d_Late,
|
||||||
is_unaligned());
|
is_unaligned());
|
||||||
|
#else
|
||||||
|
d_correlator.Carrier_wipeoff_and_EPL_volk(d_current_prn_length_samples,
|
||||||
|
in,
|
||||||
|
d_carr_sign,
|
||||||
|
d_early_code,
|
||||||
|
d_prompt_code,
|
||||||
|
d_late_code,
|
||||||
|
d_Early,
|
||||||
|
d_Prompt,
|
||||||
|
d_Late,
|
||||||
|
is_unaligned());
|
||||||
|
#endif
|
||||||
// ################## PLL ##########################################################
|
// ################## PLL ##########################################################
|
||||||
// PLL discriminator
|
// PLL discriminator
|
||||||
carr_error_hz = pll_cloop_two_quadrant_atan(*d_Prompt) / (float)GPS_TWO_PI;
|
carr_error_hz = pll_cloop_two_quadrant_atan(*d_Prompt) / (float)GPS_TWO_PI;
|
||||||
|
@ -36,6 +36,10 @@ include_directories(
|
|||||||
${VOLK_INCLUDE_DIRS}
|
${VOLK_INCLUDE_DIRS}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if(ENABLE_GENERIC_ARCH)
|
||||||
|
add_definitions( -DGENERIC_ARCH=1 )
|
||||||
|
endif(ENABLE_GENERIC_ARCH)
|
||||||
|
|
||||||
file(GLOB TRACKING_LIB_HEADERS "*.h")
|
file(GLOB TRACKING_LIB_HEADERS "*.h")
|
||||||
add_library(tracking_lib ${TRACKING_LIB_SOURCES} ${TRACKING_LIB_HEADERS})
|
add_library(tracking_lib ${TRACKING_LIB_SOURCES} ${TRACKING_LIB_HEADERS})
|
||||||
source_group(Headers FILES ${TRACKING_LIB_HEADERS})
|
source_group(Headers FILES ${TRACKING_LIB_HEADERS})
|
||||||
|
@ -36,8 +36,11 @@
|
|||||||
|
|
||||||
#include "correlator.h"
|
#include "correlator.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#define LV_HAVE_SSE3
|
#ifndef GENERIC_ARCH
|
||||||
#include "volk_cw_epl_corr.h"
|
#define LV_HAVE_SSE3
|
||||||
|
#include "volk_cw_epl_corr.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
unsigned long Correlator::next_power_2(unsigned long v)
|
unsigned long Correlator::next_power_2(unsigned long v)
|
||||||
{
|
{
|
||||||
@ -187,10 +190,12 @@ void Correlator::Carrier_wipeoff_and_EPL_volk_IQ(int signal_length_samples ,cons
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef GENERIC_ARCH
|
||||||
void Correlator::Carrier_wipeoff_and_EPL_volk_custom(int signal_length_samples, const gr_complex* input, gr_complex* carrier,gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out, bool input_vector_unaligned)
|
void Correlator::Carrier_wipeoff_and_EPL_volk_custom(int signal_length_samples, const gr_complex* input, gr_complex* carrier,gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out, bool input_vector_unaligned)
|
||||||
{
|
{
|
||||||
volk_cw_epl_corr_u(input, carrier, E_code, P_code, L_code, E_out, P_out, L_out, signal_length_samples);
|
volk_cw_epl_corr_u(input, carrier, E_code, P_code, L_code, E_out, P_out, L_out, signal_length_samples);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void Correlator::Carrier_wipeoff_and_VEPL_volk(int signal_length_samples, const gr_complex* input, gr_complex* carrier, gr_complex* VE_code, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* VL_code, gr_complex* VE_out, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out, gr_complex* VL_out, bool input_vector_unaligned)
|
void Correlator::Carrier_wipeoff_and_VEPL_volk(int signal_length_samples, const gr_complex* input, gr_complex* carrier, gr_complex* VE_code, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* VL_code, gr_complex* VE_out, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out, gr_complex* VL_out, bool input_vector_unaligned)
|
||||||
{
|
{
|
||||||
|
@ -55,12 +55,15 @@ class Correlator
|
|||||||
public:
|
public:
|
||||||
void Carrier_wipeoff_and_EPL_generic(int signal_length_samples, const gr_complex* input, gr_complex* carrier, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out);
|
void Carrier_wipeoff_and_EPL_generic(int signal_length_samples, const gr_complex* input, gr_complex* carrier, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out);
|
||||||
void Carrier_wipeoff_and_EPL_volk(int signal_length_samples, const gr_complex* input, gr_complex* carrier, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out, bool input_vector_unaligned);
|
void Carrier_wipeoff_and_EPL_volk(int signal_length_samples, const gr_complex* input, gr_complex* carrier, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out, bool input_vector_unaligned);
|
||||||
void Carrier_wipeoff_and_EPL_volk_custom(int signal_length_samples, const gr_complex* input, gr_complex* carrier, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out, bool input_vector_unaligned);
|
|
||||||
void Carrier_wipeoff_and_VEPL_volk(int signal_length_samples, const gr_complex* input, gr_complex* carrier, gr_complex* VE_code, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* VL_code, gr_complex* VE_out, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out, gr_complex* VL_out, bool input_vector_unaligned);
|
void Carrier_wipeoff_and_VEPL_volk(int signal_length_samples, const gr_complex* input, gr_complex* carrier, gr_complex* VE_code, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* VL_code, gr_complex* VE_out, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out, gr_complex* VL_out, bool input_vector_unaligned);
|
||||||
// void Carrier_wipeoff_and_EPL_volk_IQ(int prn_length_samples,int integration_time ,const gr_complex* input, gr_complex* carrier, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* P_data_code, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out, gr_complex* P_data_out, bool input_vector_unaligned);
|
// void Carrier_wipeoff_and_EPL_volk_IQ(int prn_length_samples,int integration_time ,const gr_complex* input, gr_complex* carrier, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* P_data_code, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out, gr_complex* P_data_out, bool input_vector_unaligned);
|
||||||
void Carrier_wipeoff_and_EPL_volk_IQ(int signal_length_samples, const gr_complex* input, gr_complex* carrier, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* P_data_code, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out, gr_complex* P_data_out, bool input_vector_unaligned);
|
void Carrier_wipeoff_and_EPL_volk_IQ(int signal_length_samples, const gr_complex* input, gr_complex* carrier, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* P_data_code, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out, gr_complex* P_data_out, bool input_vector_unaligned);
|
||||||
Correlator();
|
Correlator();
|
||||||
~Correlator();
|
~Correlator();
|
||||||
|
#ifndef GENERIC_ARCH
|
||||||
|
void Carrier_wipeoff_and_EPL_volk_custom(int signal_length_samples, const gr_complex* input, gr_complex* carrier, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out, bool input_vector_unaligned);
|
||||||
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string volk_32fc_x2_multiply_32fc_a_best_arch;
|
std::string volk_32fc_x2_multiply_32fc_a_best_arch;
|
||||||
std::string volk_32fc_x2_dot_prod_32fc_a_best_arch;
|
std::string volk_32fc_x2_dot_prod_32fc_a_best_arch;
|
||||||
|
Loading…
Reference in New Issue
Block a user