On 10/03/2025 15:37, Arijit Kumar Das via Gcc wrote:
Hello GCC Community!
I am Arijit Kumar Das, a second-year engineering undergraduate from NIAMT
Ranchi, India. While my major isn’t Computer Science, my passion for system
programming, embedded systems, and operating systems has driven me toward
low-level development. Programming has always fascinated me—it’s like
painting with logic, where each block of code works in perfect
synchronization.
The project mentioned in the subject immediately caught my attention, as I
have been exploring the idea of a simple hobby OS for my Raspberry Pi Zero.
Implementing an in-memory filesystem would be an exciting learning
opportunity, closely aligning with my interests.
I have carefully read the project description and understand that the goal
is to modify *newlib* and the *run tools* to redirect system calls for file
I/O operations to a virtual, volatile filesystem in host memory, as the GPU
lacks its own filesystem. Please correct me if I’ve misunderstood any
aspect.
That was the first of two options suggested. The other option is to
implement a pass-through RPC mechanism so that the runtime actually can
access the real host file-system.
Option A is more self-contained, but requires inventing a filesystem and
ultimately will not help all the tests pass.
Option B has more communication code, but doesn't require storing
anything manually, and eventually should give full test coverage.
A simple RPC mechanism already exists for the use of printf (actually
"write") on GCN, but was not necessary on NVPTX (a "printf" text output
API is provided by the driver). The idea is to use a shared memory ring
buffer that the host "run" tool polls while the GPU kernel is running.
I have set up the GCC source tree and am currently browsing relevant files
in the *gcc/testsuite* directory. However, I am unsure *where the run tools
source files are located and how they interact with newlib system calls.*
Any guidance on this would be greatly appreciated so I can get started as
soon as possible!
You'll want to install the toolchain following the instructions at
https://gcc.gnu.org/wiki/Offloading and try running some simple OpenMP
target kernels first. Newlib isn't part of the GCC repo, so if you
can't find the files then that's probably why!
The "run" tools are installed as part of the offload toolchain, albeit
hidden under the "libexec" directory because they're really only used
for testing. You can find the sources with the config/nvptx or
config/gcn backend files.
User code is usually written using OpenMP or OpenACC, in which case the
libgomp target plugins serve the same function as the "run" tools. These
too could use the file-system access, but it's not clear that there's a
common use-case for that. The case should at least fail gracefully
though (as they do now).
Currently, system calls such as "open" simply return EACCESS
("permission denied") so the stub implementations are fairly easy to
understand (e.g. newlib/libc/sys/amdgcn/open.c). The task would be to
insert new code there that actually does something. You do not need to
modify the compiler itself.
Hope that helps
Andrew
Best regards,
Arijit Kumar Das.
*GitHub:* https://github.com/ArijitKD
*LinkedIn:* https://linkedin.com/in/arijitkd