  The end of Moore's Law and Dennard Scaling has slowed processor improvements
in the past decade. While multi-core processors have improved performance, they
are limited by the application's level of parallelism, as prescribed by
Amdahl's Law. This has led to the emergence of domain-specific processors that
specialize in a narrow range of functions. Smart Network Interface Cards
(SmartNICs) can be seen as an evolutionary technology that combines
heterogeneous domain-specific processors and general-purpose cores to offload
infrastructure tasks. Despite the impressive advantages of SmartNICs and their
importance in modern networks, the literature has been missing a comprehensive
survey. To this end, this paper provides a background encompassing an overview
of the evolution of NICs from basic to SmartNICs, describing their
architectures, development environments, and advantages over legacy NICs. The
paper then presents a comprehensive taxonomy of applications offloaded to
SmartNICs, covering network, security, storage, and machine learning functions.
Challenges associated with SmartNIC development and deployment are discussed,
along with current initiatives and open research issues.
