Compiling and Running Applications¶
The repository has several example applications in chapel-gpu/example and chapel-gpu/apps directory, most of which has a distributed version:
Benchmark |
Location |
Description |
Note |
|---|---|---|---|
Vector Copy |
|
A simple vector kernel |
|
STREAM |
|
A = B + alpha * C |
|
BlackScholes |
|
The Black-Scholes Equation |
|
Logistic Regression |
|
A classification algorithm |
|
Matrix Multiplication |
|
Matrix-Matrix Multiply |
|
PageRank |
|
The pagerank algorithm |
WIP |
N-Queens |
WIP |
The n-queens problem |
WIP |
GPU API Examples |
|
Note
This section assumes the Chapel-GPU components are already installed in $CHPL_GPU_HOME. If you have not done so please see Building Chapel-GPU.
Compiling Applications¶
The example applications in chapel-gpu/example and chapel-gpu/apps directory can be build by just doing make X, where X is either cuda, hip, opencl, or dpcpp. Please be sure to source the setting script before doing so.
Set environment variables
source $CHPL_GPU_HOME/bin/env.sh
Compile
Example 1:
chapel-gpu/example(Chapel + GPUIterator + a full GPU program)cd path/to/chapel-gpu/example make cuda or make hip or make opencl or make dpcppExample 2:
chapel-gpu/example/gpuapi(Chapel + GPUAPI + a GPU kernel)cd path/to/chapel-gpu/example/gpuapi/2d make cuda or make hip or make dpcppExample 3:
chapel-gpu/apps/stream(Chapel + GPUIterator + GPUAPI + a GPU kernel)cd path/to/chapel-gpu/apps/stream make cuda or make hip or make opencl or make dpcpp
Note
A baseline implementation for CPUs can be built by doing
make baseline.Check the generated executables
For example,
make cudainapps/vector_copygenerates the following files:Name
Description
Individual make command
vc.baselineA baseline implementation for CPUs.
make baselinevc.cuda.gpuA GPU-only implmentation w/o the GPUIterator.
make cuda.gpuvc.cuda.hybridThe GPUIterator implemenation (single-locale).
make cuda.hybridvc.cuda.hybrid.distThe GPUIterator implemenation (multi-locale).
make cuda.hybrid.distvc.cuda.hybrid.dist.midlowThe MID-LOW implemenation (multi-locale).
make cuda.hybrid.dist.midlowvc.cuda.hybrid.dist.midThe MID implementation (multi-locale).
make cuda.hybrid.dist.midTip
If you want to compile a specific variant, please do
make X.Y, whereXis eithercuda,hip,opencl, ordpcppandYis eithergpu,hybrid,hybrid.dist,hybrid.dist.midlow, orhybrid.dist.mid. Please also see the third column above. Also, the MID-LOW and MID variants with OpenCL are currently not supported.
Note
The
Makefileinternally usescmaketo generate a static library from a GPU source program (vc.cuin this case). Since it is not always trivial to figure out right options to compile GPU programs, we outsource it tocmake. However, when linking a GPU object and the GPUAPI library to a Chapel program, we end up getting back tomakebecause Chapel is not officially supported incmake.If you want to manually compile your Chapel program (say
test.chpl) with your GPU program (saygpu.cu), you can do so like this (CUDA for example):nvcc -c gpu.cu # Note: gpu.h is supposed to include function declarations that are referred from test.chpl chpl -M ${CHPL_GPU_HOME}/modules ${CHPL_GPU_HOME}/include/GPUAPI.h gpu.h test.chpl gpu.o -L${CHPL_GPU_HOME}/lib -L${CHPL_GPU_HOME}/lib64 -lGPUAPICUDA_static -L${CUDA_ROOT_DIR}/lib -lcudartFor more details on compiling Chapel programs with external C/C++ programs, please see this.
Running Applications¶
Once you have compiled a Chapel-GPU program, you can run it from the command-line:
./vc.cuda.hybrid
Also, many of the example applications accepts the --n option, which changes input size, the --CPUratio (or --CPUPercent) option, which controls the percentage of an iteration space will be executed on CPUs, and the --output option, which outputs the result arrays. For example:
./vc.cuda.hybrid --n=256 --CPUratio=50 --output=1
For multi-locale execution, please refer to this document.