āđāļ CUDA āđāļāļĢāļāđāļāđāļāļŦāļāđāļ§āļĒāļāļēāļĢāļāļģāļāļēāļāļāļĩāđāđāļĨāđāļāļāļĩāđāļŠāļļāļ āļāļķāđāļāđāļāļāļāđāļēāļāļāļēāļāđāļāļĢāļ CPU āļāļķāđāļāļĄāļĩāļāđāļģāļŦāļāļąāļāļāđāļāļāļāđāļēāļāļĄāļēāļ āđāļāļĢāļ GPU āļĄāļĩāļāđāļģāļŦāļāļąāļāđāļāļēāļĄāļēāļ āđāļāļĢāđāļāļĢāļĄ CUDA āļāļąāđāļ§āđāļāļŠāļēāļĄāļēāļĢāļāđāļĢāļĩāļĒāļāđāļāđāđāļāļĢāļāđāļāđāļŦāļĨāļēāļĒāļāļąāļāļŦāļĢāļ·āļāļŦāļĨāļēāļĒāļĨāđāļēāļāđāļāļĢāļāļāļĢāđāļāļĄāļāļąāļ
CUDA āļāļąāļāļĢāļ°āđāļāļĩāļĒāļāđāļāļĢāļāđāļāđāļāļĨāļģāļāļąāļāļāļąāđāļ:
CUDA āļĄāļĩāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļŦāļĨāļēāļĒāļāļĢāļ°āđāļ āļ āđāļāļĒāđāļāđāļĨāļ°āļāļĢāļ°āđāļ āļāļāđāļāļ°āļĄāļĩāļĨāļąāļāļĐāļāļ°āđāļāļāļēāļ°āļāļāļāļāļąāļ§āđāļāļ:
āļāļēāļĢāļāļģāļāļ§āļēāļĄāđāļāđāļēāđāļāđāļĨāļ°āļāļēāļĢāđāļāđāļĨāļģāļāļąāļāļāļąāđāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāļĩāđāļāļĒāđāļēāļāļĄāļĩāļāļĢāļ°āļŠāļīāļāļāļīāļāļĨāļāļ·āļāđāļāđāļāļŠāļīāđāļāļŠāļģāļāļąāļāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļĢāļąāļāļāļĢāļļāļāđāļāļĢāđāļāļĢāļĄ CUDA
āđāļĄāļĨāđāļ
āđāļ CUDA āđāļāļāļĢāđāđāļāļĨāļāļ·āļāļāļąāļāļāđāļāļąāļāļāļĩāđāļāļģāļāļēāļāļāļ GPU āđāļāļĒāļāļ°āļāļđāļāđāļĢāļĩāļĒāļāđāļāđāļāļēāļāđāļāļĒāđāļāļĢāļāļāļģāļāļ§āļāļĄāļēāļāđāļāļāļāļāļēāļāļāļąāļ āļāļĩāđāļāļ·āļāļāļąāļ§āļāļĒāđāļēāļāļāđāļēāļĒāđ āļāļāļāđāļāļāļĢāđāđāļāļĨ CUDA:
__global__ void vectorAdd(float *a, float *b, float *c, int n)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n)
c[i] = a[i] + b[i];
}
āđāļāļāļĢāđāđāļāļĨāļāļĩāđāļāļ°āđāļāļīāđāļĄāđāļ§āļāđāļāļāļĢāđāļŠāļāļāļāļąāļ§āļāļēāļĄāļāļāļāđāļāļĢāļ°āļāļāļ __global__ āļāļģāļŠāļģāļāļąāļāļĢāļ°āļāļļāļ§āđāļēāļāļąāļāļāđāļāļąāļāļāļĩāđāđāļāđāļāđāļāļāļĢāđāđāļāļĨ CUDA
āđāļāļāļāļģāļĨāļāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ CUDA
āļāļēāļĢāļāļģāļāļ§āļēāļĄāđāļāđāļēāđāļāđāļĄāđāļāļĨāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ CUDA āļāļ·āļāđāļāđāļāļŠāļīāđāļāļŠāļģāļāļąāļāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāđāļāļĩāļĒāļāđāļāđāļ GPU āļāļĩāđāļĄāļĩāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ āđāļĄāđāļāļĨāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ CUDA āļāļ°āļĢāļ§āļĄāļĢāļ°āļāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāđāļŪāļŠāļāđ (CPU) āđāļĨāļ°āļāļļāļāļāļĢāļāđ (GPU) āđāļāđāļēāļāđāļ§āļĒāļāļąāļ āđāļĨāļ°āđāļāļīāļāđāļāļĒāļĨāļģāļāļąāļāļāļąāđāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāļąāđāļāļŦāļĄāļ āļāđāļ§āļĒāđāļŦāđāļāļąāļāļāļąāļāļāļēāļŠāļēāļĄāļēāļĢāļāļāļ§āļāļāļļāļĄāļāļēāļĢāļāļąāļāļ§āļēāļāļāđāļāļĄāļđāļĨāļāļĒāđāļēāļāļāļąāļāđāļāļāđāļāļ·āđāļāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļŠāļđāļāļŠāļļāļ
āđāļāļĒāļāļēāļĢāļāļģāļāļ§āļēāļĄāđāļāđāļēāđāļāđāļĨāļ°āđāļāđāļāļĢāļ°āđāļĒāļāļāđāļāļēāļāļāļģāđāļŦāļāđāļāđāļŦāļĨāđāļēāļāļĩāđ āļāļļāļāļŠāļēāļĄāļēāļĢāļāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄ CUDA āļāļĩāđāļĨāļāđāļ§āļĨāļēāđāļāļāļēāļĢāđāļāđāļēāļāļķāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāđāļĨāļ°āđāļāļīāđāļĄāļāļĢāļīāļĄāļēāļāļāļēāļāļŠāļđāļāļŠāļļāļāđāļāđ
āļāļēāļĢāđāļĒāļāļāļĢāļ°āđāļ āļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ CUDA āļāļĒāđāļēāļāļĨāļ°āđāļāļĩāļĒāļ
āđāļĄāđāļāļĨāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāļāļ CUDA āđāļāļĒāđāļŦāđāđāļŦāđāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāļĢāļ°āđāļ āļāļāđāļēāļāđ āđāļāļĒāđāļāđāļĨāļ°āļāļĢāļ°āđāļ āļāļĄāļĩāļāļāļāđāļāļ āļāļēāļĒāļļāļāļēāļĢāđāļāđāļāļēāļ āđāļĨāļ°āļĨāļąāļāļĐāļāļ°āļāļēāļĢāļāļģāļāļēāļāļāļĩāđāđāļāļāļāđāļēāļāļāļąāļ āļāđāļāđāļāļāļĩāđāļāļ·āļāļ āļēāļāļĢāļ§āļĄāļāļāļāļāļĢāļ°āđāļ āļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ CUDA āļāļĩāđāđāļāđāļāļąāļāļāļąāđāļ§āđāļāļāļĩāđāļŠāļļāļ:
āļĨāļāļāļ°āđāļāļĩāļĒāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāļĩāđāđāļĢāđāļ§āļāļĩāđāļŠāļļāļāļāļĩāđāļĄāļĩāđāļŦāđāļŠāļģāļŦāļĢāļąāļāđāļāļĢāļ CUDA āļāļķāđāļāđāļāđāļŠāļģāļŦāļĢāļąāļāļāļąāļāđāļāđāļāļāļąāļ§āđāļāļĢ
CUDA āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāđāļĢāļĩāļĒāļāļĢāļđāđāļāļāļāđāļāļĢāļ·āđāļāļāļāļąāļāļĢ: āļāļēāļĢāđāļāđāļāļēāļāļāļĢāļīāļ
āđāļāļĢāļāļŠāļĢāđāļēāļāļāļāļāđāļāļāļāļĨāļīāđāļāļāļąāļ CUDA C/C++ āđāļāļĒāļāļĩāđāđāļāđāļāđāļŪāļŠāļāđ (CPU) āļāļąāļāļāļēāļĢāļāļēāļĢāļāļģāļāļēāļāļāļāļāđāļāđāļāļāļđāđāļāļāļēāļāļāļāļāļļāļāļāļĢāļāđ (GPU)
āļāļāļāļāļĩāđāđāļĢāļēāđāļāđāļāļĢāļāļāļāļĨāļļāļĄāļāļ·āđāļāļāļēāļāđāļĨāđāļ§ āļĄāļēāļŠāļģāļĢāļ§āļāļāļąāļāļ§āđāļē CUDA āļŠāļēāļĄāļēāļĢāļāļāļģāđāļāđāļāđāļāļąāļāļāļēāļāļāļēāļĢāđāļĢāļĩāļĒāļāļĢāļđāđāļāļāļāđāļāļĢāļ·āđāļāļāļāļąāđāļ§āđāļāđāļāđāļāļĒāđāļēāļāđāļĢ
āļāļēāļĢāļāļđāļāđāļĄāļāļĢāļīāļāļāđ
āļāļēāļĢāļāļđāļāđāļĄāļāļĢāļīāļāļāđāđāļāđāļāļāļēāļĢāļāļģāđāļāļīāļāļāļēāļĢāļāļ·āđāļāļāļēāļāđāļāļāļąāļĨāļāļāļĢāļīāļāļķāļĄāļāļēāļĢāđāļĢāļĩāļĒāļāļĢāļđāđāļāļāļāđāļāļĢāļ·āđāļāļāļāļģāļāļ§āļāļĄāļēāļ āđāļāļĒāđāļāļāļēāļ°āļāļĒāđāļēāļāļĒāļīāđāļāđāļāđāļāļĢāļ·āļāļāđāļēāļĒāļāļĢāļ°āļŠāļēāļāđāļāļĩāļĒāļĄ CUDA āļŠāļēāļĄāļēāļĢāļāđāļĢāđāļāļāļ§āļēāļĄāđāļĢāđāļ§āļāļēāļĢāļāļģāđāļāļīāļāļāļēāļĢāļāļĩāđāđāļāđāļāļĒāđāļēāļāļĄāļēāļ āļāļĩāđāļāļ·āļāļāļēāļĢāđāļāđāļāļēāļāļāļĩāđāđāļĢāļĩāļĒāļāļāđāļēāļĒ:
__global__ void matrixMulKernel(float *A, float *B, float *C, int N)
{
int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;
float sum = 0.0f;
if (row < N && col < N) {
for (int i = 0; i < N; i++) {
sum += A[row * N + i] * B[i * N + col];
}
C[row * N + col] = sum;
}
}
// Host function to set up and launch the kernel
void matrixMul(float *A, float *B, float *C, int N)
{
dim3 threadsPerBlock(16, 16);
dim3 numBlocks((N + threadsPerBlock.x - 1) / threadsPerBlock.x,
(N + threadsPerBlock.y - 1) / threadsPerBlock.y);
matrixMulKernelnumBlocks, threadsPerBlock(A, B, C, N);
}
āļāļēāļĢāđāļāđāļāļēāļāļāļĩāđāđāļāđāļāđāļĄāļāļĢāļīāļāļāđāđāļāļēāļāđāļāļļāļāļāļāļāđāļāđāļāļāļĨāđāļāļ āđāļāļĒāđāļāđāļĨāļ°āđāļāļĢāļāļāļ°āļāļģāļāļ§āļāļāļāļāđāļāļĢāļ°āļāļāļāļŦāļāļķāđāļāļāļāļāļāļĨāļĨāļąāļāļāđ āđāļĄāđāļ§āđāļēāđāļ§āļāļĢāđāļāļąāļāļāļ·āđāļāļāļēāļāļāļĩāđāļāļ°āđāļĢāđāļ§āļāļ§āđāļēāļāļēāļĢāđāļāđāļāļēāļ CPU āļŠāļģāļŦāļĢāļąāļāđāļĄāļāļĢāļīāļāļāđāļāļāļēāļāđāļŦāļāđāđāļĨāđāļ§ āđāļāđāļāđāļĒāļąāļāļĄāļĩāļāļ·āđāļāļāļĩāđāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāđāļāļīāđāļĄāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāđāļāļĒāđāļāđāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāļĩāđāđāļāđāļĢāđāļ§āļĄāļāļąāļāđāļĨāļ°āđāļāļāļāļīāļāļāļ·āđāļāđ
CUDA āļĢāļāļāļĢāļąāļāļāļēāļĢāļāļģāļāļēāļāđāļāļāļāļ°āļāļīāļāđāļāļĢāļāļąāļŠ āļāđāļ§āļĒāđāļŦāđāļāļļāļāļŠāļēāļĄāļēāļĢāļāļāļąāļāļāđāļāļāļāļēāļĢāļāļģāļāļ§āļāļāļąāļāļāļēāļĢāļāđāļēāļĒāđāļāļāļāđāļāļĄāļđāļĨāđāļāđ āļāļķāđāļāļĄāļĩāļāļĢāļ°āđāļĒāļāļāđāļāļĒāđāļēāļāļĒāļīāđāļāđāļāļĢāļ°āļāļāļāļēāļĢāđāļĢāļĩāļĒāļāļĢāļđāđāļāļāļāđāļāļĢāļ·āđāļāļ āļāļķāđāļāļāļļāļāļŠāļēāļĄāļēāļĢāļāđāļāļĢāļĩāļĒāļĄāļāđāļāļĄāļđāļĨāļāļļāļāļāđāļāđāļāđāļāđāđāļāļāļāļ°āļāļĩāđāļāļģāļĨāļąāļāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāļļāļāļāļąāļāļāļļāļāļąāļ
āđāļĄāđāļ§āđāļē CUDA āļāļ°āđāļŦāđāļāļĢāļ°āđāļĒāļāļāđāļĄāļŦāļēāļĻāļēāļĨāļāđāļāļāļēāļĢāđāļĢāļĩāļĒāļāļĢāļđāđāļāļāļāđāļāļĢāļ·āđāļāļāļāļąāļāļĢ āđāļāđāļŠāļīāđāļāļŠāļģāļāļąāļāļāļ·āļāļāļēāļĢāļāļĢāļ°āļŦāļāļąāļāļāļķāļāļāļ§āļēāļĄāļāđāļēāļāļēāļĒāļāļĩāđāļāļēāļāđāļāļīāļāļāļķāđāļ:
āđāļ CUDA āļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāļ°āļāļđāļāļāļąāļāļāļēāļĢāđāļĒāļāļāļąāļāļŠāļģāļŦāļĢāļąāļāđāļŪāļŠāļāđāđāļĨāļ°āļāļļāļāļāļĢāļāđ āļāđāļāđāļāļāļĩāđāļāļ·āļāļāļąāļāļāđāļāļąāļāļŦāļĨāļąāļāļāļĩāđāđāļāđāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļąāļāļāļēāļĢāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ:
CUDA āđāļāđāļāđāļāļĢāļ·āđāļāļāļĄāļ·āļāļāļąāļāļāļĢāļāļāļĨāļąāļāļŠāļģāļŦāļĢāļąāļāļ§āļīāļĻāļ§āļāļĢāļāļēāļĢāđāļĢāļĩāļĒāļāļĢāļđāđāļāļāļāđāļāļĢāļ·āđāļāļāļāļĩāđāļāđāļāļāļāļēāļĢāđāļĢāđāļāļāļ§āļēāļĄāđāļĢāđāļ§āđāļŦāđāļāļąāļāđāļĄāđāļāļĨāđāļĨāļ°āļāļąāļāļāļēāļĢāļāļļāļāļāđāļāļĄāļđāļĨāļāļāļēāļāđāļŦāļāđ āļāđāļ§āļĒāļāļēāļĢāļāļģāļāļ§āļēāļĄāđāļāđāļēāđāļāđāļĄāđāļāļĨāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ CUDA āļāļēāļĢāđāļāļīāđāļĄāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļāļēāļĢāđāļāđāļēāļāļķāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ āđāļĨāļ°āļāļēāļĢāđāļāđāļāļĢāļ°āđāļĒāļāļāđāļāļēāļ GPU āļŦāļĨāļēāļĒāļāļąāļ§ āļāļļāļāļŠāļēāļĄāļēāļĢāļāļāļĢāļąāļāļāļĢāļļāļāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļāļāļāđāļāļāļāļĨāļīāđāļāļāļąāļāļāļēāļĢāđāļĢāļĩāļĒāļāļĢāļđāđāļāļāļāđāļāļĢāļ·āđāļāļāđāļāđāļāļĒāđāļēāļāļĄāļĩāļāļąāļĒāļŠāļģāļāļąāļ
āđāļĄāđāļ§āđāļēāļāļāļāļ§āļēāļĄāļāļĩāđāļāļ°āļāļĢāļāļāļāļĨāļļāļĄāļāļ·āđāļāļāļēāļāđāļĨāļ°āļŦāļąāļ§āļāđāļāļāļąāđāļāļŠāļđāļāļāļēāļāļŠāđāļ§āļāđāļĨāđāļ§ āđāļāđ CUDA āļāļ·āļāđāļāđāļāļŠāļēāļāļēāļāļĩāđāļāļ§āđāļēāļāļāļ§āļēāļāđāļĨāļ°āļĄāļĩāļāļēāļĢāļāļąāļāļāļēāļāļĒāđāļēāļāļāđāļāđāļāļ·āđāļāļ āļāļīāļāļāļēāļĄāļāđāļēāļ§āļŠāļēāļĢāđāļāļĩāđāļĒāļ§āļāļąāļāļāļēāļĢāđāļāļīāļāļāļąāļ§ CUDA āļĨāđāļēāļŠāļļāļ āļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ GPU āđāļĨāļ°āđāļĨāļāļĢāļēāļĢāļĩāļāļēāļĢāđāļĢāļĩāļĒāļāļĢāļđāđāļāļāļāđāļāļĢāļ·āđāļāļāđāļāļ·āđāļāđāļāđāļāļĢāļ°āđāļĒāļāļāđāļāļēāļāđāļāļāđāļāđāļĨāļĒāļĩāļāļąāļāļāļĢāļāļāļĨāļąāļāļāļĩāđāđāļŦāđāđāļāđāļĄāļēāļāļāļĩāđāļŠāļļāļ