Difference between revisions of "GPU Tutorial/SAXPY CUDA C"
GPU Tutorial/SAXPY CUDA C
Jump to navigation
Jump to search
(Created page with "GPU Computing (CUDA C)<nowiki /> {{DISPLAYTITLE:GPU Computing (CUDA C)}}<nowiki /> {{Syllabus Introduction to GPU Computing}}<nowiki /> __TOC__ This vi...") |
|||
(10 intermediate revisions by the same user not shown) | |||
Line 5: | Line 5: | ||
This video discusses the SAXPY via NVIDIA CUDA C/C++. | This video discusses the SAXPY via NVIDIA CUDA C/C++. | ||
+ | CUDA is an application programming interface (API) for NVIDIA GPUs. In general, CUDA works with many programming languages, but this tutorial is going to focus on C/C++. CUDA gives access to a GPUs instruction set, which means we have to go through everything step-by-step, since many things do not happen automatically. | ||
=== Video === <!--T:5--> | === Video === <!--T:5--> | ||
Line 10: | Line 11: | ||
<youtube width="600" height="340" right>rgqORzT1oCw</youtube> | <youtube width="600" height="340" right>rgqORzT1oCw</youtube> | ||
− | ([[Media:GPU_tutorial_saxpy_cuda_c.pdf | Slides as pdf]]) | + | ([[Media:GPU_tutorial_saxpy_cuda_c.pdf |Slides as pdf]]) |
+ | |||
+ | |||
=== Quiz === <!--T:5--> | === Quiz === <!--T:5--> | ||
{{hidden begin | {{hidden begin | ||
− | |title = 1. | + | |title = 1. Which features does CUDA add to C/C++?}} |
<quiz display=simple> | <quiz display=simple> | ||
{ | { | ||
|type="()"} | |type="()"} | ||
− | + | - new functions | |
− | || | + | || CUDA does not only add new functions, but all of these features. |
− | - | + | - new syntax |
− | || | + | || CUDA does not only add new syntax, but all of these features. |
+ | - GPU support | ||
+ | || CUDA does not only add GPU support, but all of these features. | ||
+ | + All of the above | ||
+ | || Correct | ||
</quiz> | </quiz> | ||
{{hidden end}} | {{hidden end}} | ||
Line 27: | Line 34: | ||
{{hidden begin | {{hidden begin | ||
− | |title = 2. What | + | |title = 2. What is a kernel?}} |
<quiz display=simple> | <quiz display=simple> | ||
{ | { | ||
|type="()"} | |type="()"} | ||
− | + | + | - It's a flag you can set to automatically parallelize any function. |
+ | || Unfortunately, life is not that easy. | ||
+ | + It's the part of your code that is run on the GPU. | ||
|| Correct | || Correct | ||
− | - | + | - It's a new CUDA function that activates the GPU. |
|| Wrong | || Wrong | ||
</quiz> | </quiz> | ||
Line 40: | Line 49: | ||
{{hidden begin | {{hidden begin | ||
− | |title = 3. | + | |title = 3. How do you flag a function to be a kernel?}} |
+ | <quiz display=simple> | ||
+ | { | ||
+ | |type="()"} | ||
+ | - __host__ | ||
+ | || Wrong. This specifies a function that runs on the CPU. | ||
+ | - __device__ | ||
+ | || Wrong. This indeed does specify a function that runs on the GPU, but it also needs to be called from the GPU, while we want a kernel to be launched by the CPU. | ||
+ | + __global__ | ||
+ | || Correct | ||
+ | - __GPU__ | ||
+ | || Wrong. This modifier doesn't exist. | ||
+ | </quiz> | ||
+ | {{hidden end}} | ||
+ | |||
+ | {{hidden begin | ||
+ | |title = 4. Let's say you coded your kernel function called "MyKernel". How do you run it?}} | ||
+ | <quiz display=simple> | ||
+ | { | ||
+ | |type="()"} | ||
+ | - MyKernel(); | ||
+ | || Wrong. This would just execute an ordinary function. | ||
+ | - CUDA.run(NoBlocks, NoThreads, MyKernel()); | ||
+ | || Wrong. There is no CUDA.run() | ||
+ | + <<<NoBlocks, NoThreads>>>MyKernel(); | ||
+ | || Correct | ||
+ | - __global(NoBlocks, NoThreads)__ MyKernel(); | ||
+ | || Wrong. __global__ and other modifiers cant have arguments and are part of a function definition, not launch. | ||
+ | </quiz> | ||
+ | {{hidden end}} | ||
+ | |||
+ | |||
+ | {{hidden begin | ||
+ | |title = 5. Inside your kernel function, how do you distribute your data over the GPU threads?}} | ||
<quiz display=simple> | <quiz display=simple> | ||
{ | { | ||
|type="()"} | |type="()"} | ||
− | - | + | - You don't have to, CUDA does that automatically for you. |
− | || | + | || Wrong |
− | + | + Each thread has has an index attached to it, which is addressed via threadIdx.x | |
− | || Correct | + | || Correct |
− | - | + | - If you use array-element-wise operations, e.g.: y.=a.*x.+b . This is managed by the NVIDIA preprocessor. |
− | || | + | || Wrong. There are no element-wise operators in C/C++ |
− | + | + | - You flag a line to be parallelized via keywords, e.g.: __device__ y=a*x+b |
− | || | + | || Wrong. These modifiers are used at function definitions. |
</quiz> | </quiz> | ||
{{hidden end}} | {{hidden end}} |
Latest revision as of 12:17, 3 January 2022
Tutorial | |
---|---|
Title: | Introduction to GPU Computing |
Provider: | HPC.NRW
|
Contact: | tutorials@hpc.nrw |
Type: | Multi-part video |
Topic Area: | GPU computing |
License: | CC-BY-SA |
Syllabus
| |
1. Introduction | |
2. Several Ways to SAXPY: CUDA C/C++ | |
3. Several Ways to SAXPY: OpenMP | |
4. Several Ways to SAXPY: Julia | |
5. Several Ways to SAXPY: NUMBA |
This video discusses the SAXPY via NVIDIA CUDA C/C++. CUDA is an application programming interface (API) for NVIDIA GPUs. In general, CUDA works with many programming languages, but this tutorial is going to focus on C/C++. CUDA gives access to a GPUs instruction set, which means we have to go through everything step-by-step, since many things do not happen automatically.
Video
Quiz