## 3 Software Receiver Implementation  
To develop a high-performance SW receiver, the parallelization of operations is a crucial task, carried out thanks to the use of GP-GPUs. GP-GPUs disperse the execution of a single instruction over all available data, boosting the application throughput, in accordance with the Single Instruction Multiple Data (SIMD) paradigm, on the other side's central processing units (CPUs) to follow the Single Instruction Single Data (SISD) paradigm, serially processing single data blocks. Large-scale data processing challenges are particularly well-suited for GP-GPUs, which provide the benefits of high-performance parallel processing at a cheaper cost than HW solutions like FPGAs. An example of an SDRreceiver exploiting GPUs is given in [26]. Naturally, all communication systems that need to handle massive volumes of data, like the CCSDS 131.2-B standard, can benefit from this concept. Even though current CPUs are manufactured with such high frequency, they are often built to operate in a serial fashion, with the goal of minimizing latency for individual tasks. For this reason, CPUs are commonly not used for parallel processing, involving a large quantity of data. GP-GPUs, on the other hand, provide a versatile throughput-oriented processing architecture to easily support parallel computing. The main tasks covered by GPUs are related to graphics (e.g., computer vision, video rendering) or physics simulation. In general, the types of applications that must be run and the types of data that must be processed have a significant impact on the benefits and drawbacks of utilizing GPUs other than CPUs. A comparison between the high-level architecture of CPUs and GPUs is depicted in Figure 3.  
CPUs (Figure 3 left) are usually composed of a few cores (blue blocks), generally from 2 to 16, which are responsible for the parallel (or serial) execution of processes and threads. Typically, every CPU core carries out distinct tasks on distinct sets of data, with the aim of reducing the time lag between receiving an instruction and completing it. Additionally, each core handles requests of a higher priority that may arise from various peripherals, such as interrupts, exceptions, and user commands. With respect to GPUs, CPUs provide the best performance when:  
* Task parallelism is necessary, meaning that several different jobs must be completed simultaneously while utilizing separate or even the same set of data;
* Tasks follow distinct instructions, meaning that each task's instructions provide its own objective;
* Each process/thread is programmed individually. GPUs (Figure 3 right), on the other hand, are made up of thousands of cores (blue blocks), each of which is capable of processing thousands of threads at once, while concentrating on maximizing the application data throughput. Specifically, GPU threads perform the same instruction on distinct data blocks, exploiting the SIMD paradigm. With this method, enormous volumes of data can be managed effectively; all threads execute the identical instructions concurrently, but on distinct batches or segments of data. Also, GPUs usually are equipped with on-chip memories, which are crucial for allowing fast and eventually shared access to the data, by the threads. An efficient use of GPU memory, as well as of the several threads that can be instantiated, is of fundamental importance to guarantee fast access and processing of data. Figure 3: General CPU architecture (**left**) compared with general GPU architecture (**right**). In general, GPUs provide the best performance when:  
* Data parallelism is necessary, meaning that the same activity must be executed on multiple data;
* A high-rate throughput is necessary. This is needed for example for image processing, video rendering, and signal data processing when it is necessary to use algorithms to quickly run the same code on enormous amounts of data. To develop a real-time SDR system compatible with the CCSDS-131.2-B standard, it was necessary to select an appropriate general-purpose GPU processor.