In order to successfully complete this assignment you need to participate both individually and in groups during class. Have one of the instructors check your notebook and sign you out before leaving class. Turn in your assignment using D2L.
ICA 20: CUDA Blocks/Grids/Threads#

Image from: https://en.wikipedia.org/wiki/Phalanx
Agenda for today’s class (70 minutes)#
(20 minutes) Pre class Review
(50 minutes) 1D Wave Example
1. Pre-class Review#
✅ DO THIS: Discuss with your group the process for indexing a 2D array as was discussed in the PCA.

2. 1D Wave Example#
See if you can adapt the 1D wave code to work using CUDA. Benchmark both the CPU and GPU versions and see if you can get a speedup.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char ** argv) {
int nx = 500;
int nt = 100000;
int i,it;
double x[nx];
double y[nx];
double v[nx];
double dvdt[nx];
double dt;
double dx;
double max,min;
double dx2inv;
double tmax;
int nxm1;
max=10.0;
min=0.0;
dx = (max-min)/(double)(nx);
x[0] = min;
for(i=1;i<nx-1;i++) {
x[i] = min+(double)i*dx;
}
x[nx-1] = max;
tmax=10.0;
dt= (tmax-0.0)/(double)(nt);
for (i=0;i<nx;i++) {
y[i] = exp(-(x[i]-5.0)*(x[i]-5.0));
v[i] = 0.0;
dvdt[i] = 0.0;
}
dx2inv=1.0/(dx*dx);
nxm1=nx-1;
for(it=0;it<nt-1;it++) {
for(i=1;i<nxm1;i++)
dvdt[i]=(y[i+1]+y[i-1]-2.0*y[i])*(dx2inv);
for(i=1; i<nxm1; i++) {
v[i] = v[i] + dt*dvdt[i];
y[i] = y[i] + dt*v[i];
}
}
for(i=nx/2-10; i<nx/2+10; i++) {
printf("%g %g\n",x[i],y[i]);
}
return 0;
}
Congratulations, we’re done!#
Have one of the instructors check your notebook and sign you out before leaving class. Turn in your assignment using D2L.
Written by Dr. Dirk Colbry, Michigan State University (Updated by Dr. Nathan Haut in Spring 2025)
This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.