Uma Implementação de Código para Dominar a Computação em GPU com CuPy, Kernels CUDA Personalizados, Streams, Matrizes Esparsas e Profiling

Uma Implementação de Código para Dominar a Computação em GPU com CuPy, Kernels CUDA Personalizados, Streams, Matrizes Esparsas e Profiling

Neste tutorial, aprofundamos no CuPy como uma alternativa poderosa e acelerada por GPU ao NumPy para computação numérica de alta performance em Python. Começamos inspecionando o dispositivo CUDA disponível, verificando a versão do CuPy, detalhes do runtime, memória da GPU e capacidade de computação, para que possamos entender o ambiente de hardware antes de executar computações pesadas. Em seguida, comparamos NumPy e […] A publicação A C

Neste tutorial, aprofundamos no CuPy como uma alternativa poderosa e acelerada por GPU ao NumPy para computação numérica de alta performance em Python. Começamos inspecionando o dispositivo CUDA disponível, verificando a versão do CuPy, detalhes do runtime, memória da GPU e capacidade de computação, para que possamos entender o ambiente de hardware antes de executar computações pesadas. Em seguida, comparamos NumPy e CuPy em grandes workloads de multiplicação de matrizes e FFT para ver como a aceleração da GPU altera a velocidade de execução. Além disso, trabalhamos com pools de memória, kernels element-wise personalizados, kernels de redução, kernels CUDA brutos, streams CUDA, matrizes esparsas, solvers lineares densos, processamento de imagens em GPU, interoperabilidade DLPack, profiling baseado em eventos, cupyx.jit e fusão de kernels. Através desses exemplos, construímos um entendimento prático de como o CuPy nos permite escrever código Python familiar enquanto ainda acessa recursos avançados de desempenho de nível CUDA. Copy Code Copied Use um navegador diferente import sys, time, subprocess try: import cupy as cp except ImportError: subprocess.check_call([sys.executable, "-m", "pip", "install", "-q", "cupy-cuda12x"]) import cupy as cp import numpy as np import matplotlib.pyplot as plt from cupyx.scipy import sparse as cps from cupyx.scipy import ndimage as cdi from cupyx import jit def header(t): print("
" + "="*64 + f"
{t}
" + "="*64) def bench(fn, *args, n=5, warmup=2, gpu=True): for _ in range(warmup): fn(args) if gpu: cp.cuda.Stream.null.synchronize() t0 = time.perf_counter() for _ in range(n): r = fn(args) if gpu: cp.cuda.Stream.null.synchronize() return (time.perf_counter() - t0) / n header("1. INTROSPECÇÃO GPU") props = cp.cuda.runtime.getDeviceProperties(0) print(f"Versão CuPy: {cp.version}") print(f"Runtime CUDA: {cp.cuda.runtime.runtimeGetVersion()}") print(f"Dispositivo: {props['name'].decode()}") print(f"Capacidade de computação: {props['major']}.{props['minor']}") print(f"SMs: {props['multiProcessorCount']}") print(f"Memória global: {props['totalGlobalMem']/1e9:.2f} GB") header("2. BENCHMARK NUMPY vs CUPY") N = 4096 A_np = np.random.rand(N, N).astype(np.float32) B_np = np.random.rand(N, N).astype(np.float32) A_cp, B_cp = cp.asarray(A_np), cp.asarray(B_np) t_np = bench(np.matmul, A_np, B_np, n=2, gpu=False) t_cp = bench(cp.matmul, A_cp, B_cp, n=3, gpu=True) print(f"Matmul {N}x{N} NumPy={t_np1000:7.1f} ms CuPy={t_cp1000:7.1f} ms ({t_np/t_cp:.1f}x)") x_np = np.random.rand(2**21).astype(np.complex64) x_cp = cp.asarray(x_np) t_np = ben

computação em GPUCuPyCUDA