  Graphics Processing Units (GPUs) have traditionally relied on the host CPU to
initiate access to the data storage. This approach is well-suited for GPU
applications with known data access patterns that enable partitioning of their
dataset to be processed in a pipelined fashion in the GPU. However, emerging
applications such as graph and data analytics, recommender systems, or graph
neural networks, require fine-grained, data-dependent access to storage. CPU
initiation of storage access is unsuitable for these applications due to high
CPU-GPU synchronization overheads, I/O traffic amplification, and long CPU
processing latencies. GPU-initiated storage removes these overheads from the
storage control path and, thus, can potentially support these applications at
much higher speed. However, there is a lack of systems architecture and
software stack that enable efficient GPU-initiated storage access. This work
presents a novel system architecture, BaM, that fills this gap. BaM features a
fine-grained software cache to coalesce data storage requests while minimizing
I/O traffic amplification. This software cache communicates with the storage
system via high-throughput queues that enable the massive number of concurrent
threads in modern GPUs to make I/O requests at a high rate to fully utilize the
storage devices and the system interconnect. Experimental results show that BaM
delivers 1.0x and 1.49x end-to-end speed up for BFS and CC graph analytics
benchmarks while reducing hardware costs by up to 21.7x over accessing the
graph data from the host memory. Furthermore, BaM speeds up data-analytics
workloads by 5.3x over CPU-initiated storage access on the same hardware.
