3. Examples

3.1. Examples Structure

Examples are located under the cuda/examples/ directory. They are all structured more or less the same:

  • two projects at the root level, device.gpr that controls the device code compilation, and host.gpr that controls host code compilation.

  • a Makefile that compiles the whole program and generates a main at the root

  • an obj/ directory to store the output of the compilation process (automatically generated during the first make)

  • a src/ directory that contains sources

In an example directory, a project can be made by the following command:

make GPU_ARCH=<your GPU target>

For example:

make GPU_ARCH=sm_75

Note that you need to know which GPU architecture code your hardware supports. You can get some insights here.

By default, examples are built for the native environment. If you want to target a cross ARM Linux, you can also change the CUDA_HOST value, e.g.:

make GPU_ARCH=sm_75 CUDA_HOST=aarch64-linux

3.2. Vector Add

TODO

3.3. Marching Cubes

Marching cubes is one of the typical algorithms in graphical rendering. It allows you to convert a density function, able to separate absence of presence of a material in a continuous 3D space, into a mesh of triangles. This algorithm is a transcription of the algoritm details in NVIDIA’s Metaballs GPU Gem 3 manual. In this example, we’ll define a density function through Metaballs

_images/marching.png

To be able to build and run the example, ensure that you have the following dependencies installed:

  • SDL

  • OpenGL

Building the example should be similiar to building vectorAdd in the installation step. Remember that you will need to have sourced env.sh in your environment:

cd <your gnat cuda installation>
. env.sh
cd cuda/examples/marching
make
./main

TODO: Give instructions on how to set the right SM!!!

This should open a window and display metaballs on the screen moving around. The speed of the rendering will be dependent on the GPU power available on your system. This can be adjusted by changing the sampling of the grid that computes marching cubes - the smaller the sampling the faster the computation. You can adust that by changing the value under src/common/data.ads:

Samples : constant Integer := 256;

Try for example 128 or 64. This value needs to be a power of 2.

TODO