CUDA: Difference between revisions
(add subsections, information on linking) |
(Marked this version for translation) |
||
Line 11: | Line 11: | ||
== Quick start guide == <!--T:39--> | == Quick start guide == <!--T:39--> | ||
===Compiling=== | ===Compiling=== <!--T:40--> | ||
<!--T:40--> | |||
Here we show a simple example of how to use the CUDA C/C++ language compiler, <code>nvcc</code>, and run code created with it. For a longer tutorial in CUDA programming, see [[CUDA tutorial]]. | Here we show a simple example of how to use the CUDA C/C++ language compiler, <code>nvcc</code>, and run code created with it. For a longer tutorial in CUDA programming, see [[CUDA tutorial]]. | ||
Line 69: | Line 68: | ||
</source> | </source> | ||
=== Submitting jobs=== | === Submitting jobs=== <!--T:44--> | ||
<!--T:44--> | |||
To run the program, create a Slurm job script as shown below. Be sure to replace <code>def-someuser</code> with your specific account (see [[Running_jobs#Accounts_and_projects|accounts and projects]]). For options relating to scheduling jobs with GPUs see [[Using GPUs with Slurm]]. | To run the program, create a Slurm job script as shown below. Be sure to replace <code>def-someuser</code> with your specific account (see [[Running_jobs#Accounts_and_projects|accounts and projects]]). For options relating to scheduling jobs with GPUs see [[Using GPUs with Slurm]]. | ||
{{File | {{File | ||
Line 99: | Line 97: | ||
If you run this without a GPU present you might see output like <code>2+7=0</code>. | If you run this without a GPU present you might see output like <code>2+7=0</code>. | ||
=== Linking libraries === | === Linking libraries === <!--T:48--> | ||
If you have a program that needs to link some libraries included with CUDA, for example [https://developer.nvidia.com/cublas cuBLAS], compile with the following flags | If you have a program that needs to link some libraries included with CUDA, for example [https://developer.nvidia.com/cublas cuBLAS], compile with the following flags | ||
<source lang="console"> | <source lang="console"> |
Revision as of 20:52, 17 April 2019
"CUDA® is a parallel computing platform and programming model developed by NVIDIA for general computing on graphical processing units (GPUs)."[1]
It is reasonable to think of CUDA as a set of libraries and associated C, C++, and Fortran compilers that enable you to write code for GPUs. See OpenACC Tutorial for another set of GPU programming tools.
Quick start guide
Compiling
Here we show a simple example of how to use the CUDA C/C++ language compiler, nvcc
, and run code created with it. For a longer tutorial in CUDA programming, see CUDA tutorial.
First, load a CUDA module.
$ module purge
$ module load cuda
The following program will add two numbers together on a GPU. Save the file as add.cu
. The cu
file extension is important!.
#include <iostream>
__global__ void add (int *a, int *b, int *c){
*c = *a + *b;
}
int main(void){
int a, b, c;
int *dev_a, *dev_b, *dev_c;
int size = sizeof(int);
// allocate device copies of a,b, c
cudaMalloc ( (void**) &dev_a, size);
cudaMalloc ( (void**) &dev_b, size);
cudaMalloc ( (void**) &dev_c, size);
a=2; b=7;
// copy inputs to device
cudaMemcpy (dev_a, &a, size, cudaMemcpyHostToDevice);
cudaMemcpy (dev_b, &b, size, cudaMemcpyHostToDevice);
// launch add() kernel on GPU, passing parameters
add <<< 1, 1 >>> (dev_a, dev_b, dev_c);
// copy device result back to host
cudaMemcpy (&c, dev_c, size, cudaMemcpyDeviceToHost);
std::cout<<a<<"+"<<b<<"="<<c<<std::endl;
cudaFree ( dev_a ); cudaFree ( dev_b ); cudaFree ( dev_c );
}
Compile the program with nvcc
to create an executable named add
.
$ nvcc add.cu -o add
Submitting jobs
To run the program, create a Slurm job script as shown below. Be sure to replace def-someuser
with your specific account (see accounts and projects). For options relating to scheduling jobs with GPUs see Using GPUs with Slurm.
#!/bin/bash
#SBATCH --account=def-someuser
#SBATCH --gres=gpu:1 # Number of GPUs (per node)
#SBATCH --mem=400M # memory (per node)
#SBATCH --time=0-00:10 # time (DD-HH:MM)
./add #name of your program
Submit your GPU job to the scheduler with this command.
$ sbatch gpu_job.sh
Submitted batch job 3127733
For more information about the sbatch
command and running and monitoring jobs see Running jobs.
Once your job has finished you should see an output file similar to this.
$ cat slurm-3127733.out
2+7=9
If you run this without a GPU present you might see output like 2+7=0
.
Linking libraries
If you have a program that needs to link some libraries included with CUDA, for example cuBLAS, compile with the following flags
nvcc -lcublas -Xlinker=-rpath,$CUDA_PATH/lib64
To learn more about how the above program works and how to make the use of a GPUs parallelism see CUDA tutorial.
- ↑ Nvidia CUDA Home Page. CUDA is a registered trademark of NVIDIA.