I started my internship at ADACS in June 2024, taking a brief leave of absence in the final year of my PhD to get some hands-on experience working with C++ / CUDA on an industry software project. During my internship I was part of a small team working with Quasar Satellite Technologies to develop a Software-defined radio (SDR) for decoding satellite transmissions.
I had a general understanding of the problem from my research experience in small form factor satellites, but through this project I had the chance to do a deep dive on digital radio standards and the challenges involved with decoding radio transmissions sent from orbit. My understanding of C++ was limited at the time, since all of my research software experience was in Python (I'd only written C++ on hobby projects), but my mentor and team leader at ADACS was incredibly supportive and spent a large amount of time and effort helping me upskill in the language and broaden my experience as a software developer.
My first few weeks of the internship were a crash course in C++ datatypes and pointers, understanding how a compiled language like C++ turns my code into an executable file, and learning how to use debuggers to find out where my code was going wrong. Over time I was also introduced to the complexities of of memory management. The decoding of satellite data requires a full signal processing chain to be implemented, with many general purpose modules performing individual operations on the data before passing their output to the next module in the chain. To properly manage this in software requires the careful allocation of memory when new data is received, managing that memory as the data flows through the signal chain, and then properly freeing the memory once the data has been processed so that the application doesn't leak memory and cause a crash. My time on the project gave me insight into the merits and drawbacks of several different memory management schemes and where they might be best implemented, which was experience I never could've hoped to gain under the time pressure of graduate research.
The main contribution I made to the project was in CUDA R&D, developing parallel approaches to the decoding of satellite data and optimising the standard approach where parallelism wasn't possible. The concepts surrounding CUDA parallelism were unintuitive at first, but through several brainstorming sessions with the experienced CUDA developers at ADACS we came up with several ideas for parallelising different parts of the signal chain. In the process I had the opportunity to write my own CUDA kernels for processing the satellite data, while also building the rest of the C++ module that the kernel sat within to properly manage all of the required memory and oversee the transfer of data between the CPU and GPU.
Beyond this direct CUDA experience, the project called for a non-trivial combination of C++ and CUDA, as the application needed to be able to work whether or not the machine had an NVIDIA GPU installed. As a result I learned some of the nuances of CMake and how to use different compiler directives to reliably build and run the application in accordance with the system's capabilities.
Overall my time at ADACS was both incredibly valuable for my professional development, as well as being a lovely place to work. The ADACS group is incredibly friendly and welcoming, and the staff were always willing to share their experience with me, help solve any problems that I was having and include me in workplace social events. Many of the staff also come from academia, and they were always willing to share their experiences in transitioning from academia into industry, which was invaluable to me given I want to enter industry once I finish my PhD. I thoroughly enjoyed my time as an ADACS intern, and would highly recommend it to any of my colleagues looking to upskill as a software engineer.
Read more about Quasar Satellite Technologies on their website, https://quasarsat.com/.
Check out some of other internship projects.