āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāđ€āļĢāļē

Master CUDA: āļŠāļģāļŦāļĢāļąāļšāļ§āļīāļĻāļ§āļāļĢāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļˆāļąāļāļĢ

āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ AI 101

Master CUDA: āļŠāļģāļŦāļĢāļąāļšāļ§āļīāļĻāļ§āļāļĢāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļˆāļąāļāļĢ

mm
āļ§āļąāļ™āļ—āļĩāđˆāļ­āļąāļžāđ€āļ”āļ— on
Master CUDA: āļŠāļģāļŦāļĢāļąāļšāļ§āļīāļĻāļ§āļāļĢāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļˆāļąāļāļĢ

āļžāļĨāļąāļ‡āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļ›āļąāļˆāļˆāļąāļĒāļŠāļģāļ„āļąāļāđƒāļ™āļāļēāļĢāļœāļĨāļąāļāļ”āļąāļ™āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡āļŠāļīāđˆāļ‡āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđ„āļ›āđ„āļ”āđ‰āđƒāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āđ€āļĄāļ·āđˆāļ­āđ‚āļĄāđ€āļ”āļĨāļĄāļĩāļ„āļ§āļēāļĄāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļĄāļēāļāļ‚āļķāđ‰āļ™āđāļĨāļ°āļŠāļļāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļĒāļēāļĒāļ•āļąāļ§āđāļšāļšāļ—āļ§āļĩāļ„āļđāļ“ āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđāļšāļš CPU āđāļšāļšāļ”āļąāđ‰āļ‡āđ€āļ”āļīāļĄāļĄāļąāļāļˆāļ°āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļ•āļ­āļšāļŠāļ™āļ­āļ‡āļ„āļ§āļēāļĄāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ‚āļ­āļ‡āļ‡āļēāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŠāļĄāļąāļĒāđƒāļŦāļĄāđˆāđ„āļ”āđ‰ āļ™āļĩāđˆāļ„āļ·āļ­āļ—āļĩāđˆāļĄāļēāļ‚āļ­āļ‡ CUDA (Compute Unified Device Architecture) āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđāļ™āļ§āļ—āļēāļ‡āđƒāļ™āļāļēāļĢāđ€āļĢāđˆāļ‡āđ€āļ§āļīāļĢāđŒāļāđ‚āļŸāļĨāļ§āđŒāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡

CUDAāļžāļąāļ’āļ™āļēāđ‚āļ”āļĒ NVIDIA āđ€āļ›āđ‡āļ™āđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđāļšāļšāļ‚āļ™āļēāļ™āđāļĨāļ°āļĢāļđāļ›āđāļšāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđƒāļŠāđ‰āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļˆāļēāļāļžāļĨāļąāļ‡āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ­āļąāļ™āļĄāļŦāļēāļĻāļēāļĨāļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĢāļēāļŸāļīāļ (GPU) āđāļĄāđ‰āļ§āđˆāļēāđƒāļ™āļ•āļ­āļ™āđāļĢāļ GPU āļˆāļ°āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ­āļ­āļāđāļšāļšāļĄāļēāđ€āļžāļ·āđˆāļ­āļāļēāļĢāđ€āļĢāļ™āđ€āļ”āļ­āļĢāđŒāļāļĢāļēāļŸāļīāļ āđāļ•āđˆāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡ GPU āļ—āļģāđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āļŠāļģāļŦāļĢāļąāļšāļ‚āđ‰āļ­āļāļģāļŦāļ™āļ”āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđāļšāļšāļ‚āļ™āļēāļ™āļ‚āļ­āļ‡āļ­āļąāļĨāļāļ­āļĢāļīāļ—āļķāļĄāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ•āđˆāļēāļ‡āđ†

āđƒāļ™āļšāļ—āļ„āļ§āļēāļĄāļ™āļĩāđ‰ āđ€āļĢāļēāļˆāļ°āļĄāļēāļŠāļģāļĢāļ§āļˆāļ§āđˆāļē CUDA āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ›āļāļīāļ§āļąāļ•āļīāđ‚āļ›āļĢāđ€āļˆāđ‡āļāļ•āđŒāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ‚āļ­āļ‡āļ„āļļāļ“āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ„āļĢ āđ‚āļ”āļĒāļˆāļ°āđ€āļˆāļēāļ°āļĨāļķāļāļ–āļķāļ‡āđāļ™āļ§āļ„āļīāļ”āļŦāļĨāļąāļ āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ āđāļĨāļ°āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļˆāļĢāļīāļ‡ āđ„āļĄāđˆāļ§āđˆāļēāļ„āļļāļ“āļˆāļ°āđ€āļ›āđ‡āļ™āļ§āļīāļĻāļ§āļāļĢ ML āļ—āļĩāđˆāļĄāļĩāļ›āļĢāļ°āļŠāļšāļāļēāļĢāļ“āđŒāļ‹āļķāđˆāļ‡āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđ€āļ§āļīāļĢāđŒāļāđ‚āļŸāļĨāļ§āđŒāļ‚āļ­āļ‡āļ„āļļāļ“ āļŦāļĢāļ·āļ­āđ€āļ›āđ‡āļ™āļĄāļ·āļ­āđƒāļŦāļĄāđˆāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļˆāļēāļāļžāļĨāļąāļ‡āļ‚āļ­āļ‡āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ”āđ‰āļ§āļĒ GPU āļ„āļđāđˆāļĄāļ·āļ­āļ™āļĩāđ‰āļˆāļ°āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļ„āļļāļ“āļĄāļĩāļ„āļ§āļēāļĄāļĢāļđāđ‰āđ€āļžāļ·āđˆāļ­āļĒāļāļĢāļ°āļ”āļąāļšāļ„āļ§āļēāļĄāļžāļĒāļēāļĒāļēāļĄāđƒāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ‚āļ­āļ‡āļ„āļļāļ“āđ„āļ›āļ­āļĩāļāļ‚āļąāđ‰āļ™

āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđāļšāļšāļ„āļđāđˆāļ‚āļ™āļēāļ™āđāļĨāļ° CUDA

āļāđˆāļ­āļ™āļ—āļĩāđˆāđ€āļĢāļēāļˆāļ°āļžāļđāļ”āļ–āļķāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡ CUDAāļāļēāļĢāđ€āļ‚āđ‰āļēāđƒāļˆāđāļ™āļ§āļ„āļīāļ”āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđāļšāļšāļ‚āļ™āļēāļ™āļ–āļ·āļ­āđ€āļ›āđ‡āļ™āļŠāļīāđˆāļ‡āļŠāļģāļ„āļąāļ āđ‚āļ”āļĒāļžāļ·āđ‰āļ™āļāļēāļ™āđāļĨāđ‰āļ§ āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđāļšāļšāļ‚āļ™āļēāļ™āđ€āļ›āđ‡āļ™āļĢāļđāļ›āđāļšāļšāļŦāļ™āļķāđˆāļ‡āļ‚āļ­āļ‡āļāļēāļĢāļ„āļģāļ™āļ§āļ“āļ—āļĩāđˆāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ„āļģāļ™āļ§āļ“āļŦāļĨāļēāļĒāđ† āļ­āļĒāđˆāļēāļ‡āļžāļĢāđ‰āļ­āļĄāļāļąāļ™ āļŦāļĨāļąāļāļāļēāļĢāļ™āļĩāđ‰āđ€āļĢāļĩāļĒāļšāļ‡āđˆāļēāļĒāđāļ•āđˆāļ—āļĢāļ‡āļžāļĨāļąāļ‡ āļ™āļąāđˆāļ™āļ„āļ·āļ­ āļĄāļąāļāļˆāļ°āđāļšāđˆāļ‡āļ›āļąāļāļŦāļēāđƒāļŦāļāđˆāđ† āļ­āļ­āļāđ€āļ›āđ‡āļ™āļ›āļąāļāļŦāļēāļĒāđˆāļ­āļĒāđ† āđāļĨāđ‰āļ§āļˆāļķāļ‡āđāļāđ‰āđ„āļ‚āđ„āļ›āļžāļĢāđ‰āļ­āļĄāđ† āļāļąāļ™

āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļšāļĨāļģāļ”āļąāļšāđāļšāļšāđ€āļ”āļīāļĄ āļ‹āļķāđˆāļ‡āļ‡āļēāļ™āļ•āđˆāļēāļ‡āđ† āļˆāļ°āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ—āļĩāļĨāļ°āļ­āļĒāđˆāļēāļ‡ āļ­āļēāļˆāđ€āļ›āļĢāļĩāļĒāļšāđ„āļ”āđ‰āļāļąāļšāđ€āļĨāļ™āđ€āļ”āļĩāļĒāļ§āļšāļ™āļ—āļēāļ‡āļŦāļĨāļ§āļ‡ āđƒāļ™āļ—āļēāļ‡āļāļĨāļąāļšāļāļąāļ™ āļāļēāļĢāļ„āļģāļ™āļ§āļ“āđāļšāļšāļ„āļđāđˆāļ‚āļ™āļēāļ™āļāđ‡āđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļšāļāļēāļĢāđ€āļžāļīāđˆāļĄāđ€āļĨāļ™āļŦāļĨāļēāļĒāđ€āļĨāļ™āļšāļ™āļ—āļēāļ‡āļŦāļĨāļ§āļ‡āļ™āļąāđ‰āļ™ āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļāļēāļĢāļˆāļĢāļēāļˆāļĢ (āļŦāļĢāļ·āļ­āđƒāļ™āļāļĢāļ“āļĩāļ‚āļ­āļ‡āđ€āļĢāļēāļ„āļ·āļ­āļāļēāļĢāļ„āļģāļ™āļ§āļ“) āđ„āļŦāļĨāđ„āļ›āļžāļĢāđ‰āļ­āļĄāđ† āļāļąāļ™āđ„āļ”āđ‰āļĄāļēāļāļ‚āļķāđ‰āļ™

CUDA āļ™āļģāđāļ™āļ§āļ„āļīāļ”āļ™āļĩāđ‰āļĄāļēāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰āļāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđ€āļ‰āļžāļēāļ°āļ‚āļ­āļ‡ GPU āļ‹āļķāđˆāļ‡āđāļ•āļāļ•āđˆāļēāļ‡āļˆāļēāļ CPU āļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ­āļ­āļāđāļšāļšāļĄāļēāđ€āļžāļ·āđˆāļ­āļˆāļąāļ”āļāļēāļĢāļāļąāļšāļ‡āļēāļ™āļ—āļĩāđˆāļŦāļĨāļēāļāļŦāļĨāļēāļĒāļ”āđ‰āļ§āļĒāļ•āļĢāļĢāļāļ°āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļ—āļĩāđˆāļ‹āļąāļšāļ‹āđ‰āļ­āļ™ GPU āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ›āļĢāļąāļšāđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ—āļĩāđˆāļ„āļĨāđ‰āļēāļĒāļ„āļĨāļķāļ‡āļāļąāļ™āđāļĨāļ°āđ€āļĢāļĩāļĒāļšāļ‡āđˆāļēāļĒāļˆāļģāļ™āļ§āļ™āļĄāļēāļāđāļšāļšāļ‚āļ™āļēāļ™āļāļąāļ™ āļ‹āļķāđˆāļ‡āļ—āļģāđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ„āļģāļ™āļ§āļ“āļ›āļĢāļ°āđ€āļ āļ—āļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļžāļšāđ„āļ”āđ‰āļ—āļąāđˆāļ§āđ„āļ›āđƒāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āđ€āļŠāđˆāļ™ āļāļēāļĢāļ„āļđāļ“āđ€āļĄāļ—āļĢāļīāļāļ‹āđŒāđāļĨāļ°āļāļēāļĢāļĄāđ‰āļ§āļ™āļĢāļ§āļĄ

āļĄāļēāđāļĒāļāļĒāđˆāļ­āļĒāđāļ™āļ§āļ„āļīāļ”āļŦāļĨāļąāļāđ† āļāļąāļ™:

  1. āđ€āļ˜āļĢāļ”āđāļĨāļ°āļĨāļģāļ”āļąāļšāļŠāļąāđ‰āļ™āļ‚āļ­āļ‡āđ€āļ˜āļĢāļ”

āđƒāļ™ CUDA āđ€āļ˜āļĢāļ”āđ€āļ›āđ‡āļ™āļŦāļ™āđˆāļ§āļĒāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļĩāđˆāđ€āļĨāđ‡āļāļ—āļĩāđˆāļŠāļļāļ” āļ‹āļķāđˆāļ‡āđāļ•āļāļ•āđˆāļēāļ‡āļˆāļēāļāđ€āļ˜āļĢāļ” CPU āļ‹āļķāđˆāļ‡āļĄāļĩāļ™āđ‰āļģāļŦāļ™āļąāļāļ„āđˆāļ­āļ™āļ‚āđ‰āļēāļ‡āļĄāļēāļ āđ€āļ˜āļĢāļ” GPU āļĄāļĩāļ™āđ‰āļģāļŦāļ™āļąāļāđ€āļšāļēāļĄāļēāļ āđ‚āļ›āļĢāđāļāļĢāļĄ CUDA āļ—āļąāđˆāļ§āđ„āļ›āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ€āļ˜āļĢāļ”āđ„āļ”āđ‰āļŦāļĨāļēāļĒāļžāļąāļ™āļŦāļĢāļ·āļ­āļŦāļĨāļēāļĒāļĨāđ‰āļēāļ™āđ€āļ˜āļĢāļ”āļžāļĢāđ‰āļ­āļĄāļāļąāļ™

CUDA āļˆāļąāļ”āļĢāļ°āđ€āļšāļĩāļĒāļšāđ€āļ˜āļĢāļ”āđ€āļ›āđ‡āļ™āļĨāļģāļ”āļąāļšāļŠāļąāđ‰āļ™:

  • āđ€āļ˜āļĢāļ”āļ–āļđāļāļˆāļąāļ”āļāļĨāļļāđˆāļĄāđ€āļ›āđ‡āļ™āļšāļĨāđ‡āļ­āļ„
  • āļšāļĨāđ‡āļ­āļāļ–āļđāļāļˆāļąāļ”āđ€āļĢāļĩāļĒāļ‡āđ€āļ›āđ‡āļ™āļāļĢāļīāļ”

āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđāļšāļšāļĨāļģāļ”āļąāļšāļŠāļąāđ‰āļ™āļ™āļĩāđ‰āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļ›āļĢāļąāļšāļ‚āļ™āļēāļ”āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ GPU āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™ āļ™āļĩāđˆāļ„āļ·āļ­āļ āļēāļžāđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒāđ†:

|-- Block (0,0)
| |-- Thread (0,0)
| |-- Thread (0,1)
| |-- ...
|-- Block (0,1)
| |-- Thread (0,0)
| |-- Thread (0,1)
| |-- ...
|-- ...
  1. āļĨāļģāļ”āļąāļšāļŠāļąāđ‰āļ™āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ

CUDA āļĄāļĩāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļŦāļĨāļēāļĒāļ›āļĢāļ°āđ€āļ āļ— āđ‚āļ”āļĒāđāļ•āđˆāļĨāļ°āļ›āļĢāļ°āđ€āļ āļ—āļāđ‡āļˆāļ°āļĄāļĩāļĨāļąāļāļĐāļ“āļ°āđ€āļ‰āļžāļēāļ°āļ‚āļ­āļ‡āļ•āļąāļ§āđ€āļ­āļ‡:

  • āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļąāđˆāļ§āđ‚āļĨāļ: āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļ”āđ‰āļˆāļēāļāđ€āļ˜āļĢāļ”āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āđāļ•āđˆāļˆāļ°āļĄāļĩāļ„āļ§āļēāļĄāļĨāđˆāļēāļŠāđ‰āļēāļ—āļĩāđˆāļŠāļđāļ‡āļāļ§āđˆāļē
  • āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļĩāđˆāđƒāļŠāđ‰āļĢāđˆāļ§āļĄāļāļąāļ™: āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļĩāđˆāļĢāļ§āļ”āđ€āļĢāđ‡āļ§āļ—āļĩāđˆāđƒāļŠāđ‰āļĢāđˆāļ§āļĄāļāļąāļ™āļ āļēāļĒāđƒāļ™āļšāļĨāđ‡āļ­āļāļ‚āļ­āļ‡āđ€āļ˜āļĢāļ”
  • āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ āļēāļĒāđƒāļ™: āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ•āļąāļ§āļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ°āđ€āļ˜āļĢāļ”
  • āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ„āļ‡āļ—āļĩāđˆ: āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļšāļšāļ­āđˆāļēāļ™āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§āļŠāļģāļŦāļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ„āļ‡āļ—āļĩāđˆ

āļāļēāļĢāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđāļĨāļ°āļāļēāļĢāđƒāļŠāđ‰āļĨāļģāļ”āļąāļšāļŠāļąāđ‰āļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ™āļĩāđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļœāļĨāļ–āļ·āļ­āđ€āļ›āđ‡āļ™āļŠāļīāđˆāļ‡āļŠāļģāļ„āļąāļāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ CUDA

  1. āđ€āļĄāļĨāđ‡āļ”

āđƒāļ™ 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

āļŠāļļāļ”āļ‚āļ­āļ‡āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļāļēāļĢāļ„āļģāļ™āļ§āļ“ GPU āđ„āļĨāļšāļĢāļēāļĢāļĩ āļĄāļīāļ”āđ€āļ”āļīāļĨāđāļ§āļĢāđŒ āđāļĨāļ°āļ āļēāļĐāļēāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļšāđ‚āļ”āļĒ CUDA

āļāļēāļĢāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđ‚āļĄāđ€āļ”āļĨāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ CUDA āļ–āļ·āļ­āđ€āļ›āđ‡āļ™āļŠāļīāđˆāļ‡āļŠāļģāļ„āļąāļāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ„āđ‰āļ” GPU āļ—āļĩāđˆāļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž āđ‚āļĄāđ€āļ”āļĨāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ CUDA āļˆāļ°āļĢāļ§āļĄāļĢāļ°āļšāļšāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ‚āļŪāļŠāļ•āđŒ (CPU) āđāļĨāļ°āļ­āļļāļ›āļāļĢāļ“āđŒ (GPU) āđ€āļ‚āđ‰āļēāļ”āđ‰āļ§āļĒāļāļąāļ™ āđāļĨāļ°āđ€āļ›āļīāļ”āđ€āļœāļĒāļĨāļģāļ”āļąāļšāļŠāļąāđ‰āļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāļˆāļąāļ”āļ§āļēāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™āđ€āļžāļ·āđˆāļ­āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļŠāļđāļ‡āļŠāļļāļ”

āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļ‚āļ­āļ‡āļĨāļģāļ”āļąāļšāļŠāļąāđ‰āļ™āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ

āļĢāļ°āļšāļšāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŠāļĄāļąāļĒāđƒāļŦāļĄāđˆ āļĢāļ§āļĄāļ–āļķāļ‡ GPU āđƒāļŠāđ‰āļĨāļģāļ”āļąāļšāļŠāļąāđ‰āļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ€āļžāļ·āđˆāļ­āđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļāļēāļĢāļ—āļģāļ‡āļēāļ™ āļĨāļģāļ”āļąāļšāļŠāļąāđ‰āļ™āļ™āļĩāđ‰āļ›āļĢāļ°āļāļ­āļšāļ”āđ‰āļ§āļĒāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļŦāļĨāļēāļĒāļĢāļ°āļ”āļąāļšāļ—āļĩāđˆāļĄāļĩāļ„āđˆāļēāļŦāļ™āđˆāļ§āļ‡āđ€āļ§āļĨāļē āđāļšāļ™āļ”āđŒāļ§āļīāļ”āļ—āđŒ āđāļĨāļ°āļ„āļ§āļēāļĄāļˆāļļāļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™ āļŦāļĨāļąāļāļāļēāļĢāļ‚āļ­āļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡āļĄāļĩāļšāļ—āļšāļēāļ—āļŠāļģāļ„āļąāļāđƒāļ™āļāļĢāļ“āļĩāļ™āļĩāđ‰:

  1. āļ—āđ‰āļ­āļ‡āļ–āļīāđˆāļ™āļŠāļąāđˆāļ§āļ„āļĢāļēāļ§:āļŦāļēāļāļĄāļĩāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ āļāđ‡āļĄāļĩāđāļ™āļ§āđ‚āļ™āđ‰āļĄāļ—āļĩāđˆāļˆāļ°āļĄāļĩāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļ‹āđ‰āļģāđƒāļ™āđ€āļĢāđ‡āļ§āđ† āļ™āļĩāđ‰
  2. āļ—āļĩāđˆāļ•āļąāđ‰āļ‡āđ€āļŠāļīāļ‡āļžāļ·āđ‰āļ™āļ—āļĩāđˆ:āļŦāļēāļāļĄāļĩāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļ•āļģāđāļŦāļ™āđˆāļ‡āđƒāļāļĨāđ‰āđ€āļ„āļĩāļĒāļ‡āļāđ‡āļĄāļĩāđāļ™āļ§āđ‚āļ™āđ‰āļĄāļ—āļĩāđˆāļˆāļ°āļ–āļđāļāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļ”āđ‰āļ§āļĒāđ€āļŠāđˆāļ™āļāļąāļ™

āđ‚āļ”āļĒāļāļēāļĢāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđāļĨāļ°āđƒāļŠāđ‰āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļˆāļēāļāļ•āļģāđāļŦāļ™āđˆāļ‡āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰ āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ CUDA āļ—āļĩāđˆāļĨāļ”āđ€āļ§āļĨāļēāđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļĨāļ°āđ€āļžāļīāđˆāļĄāļ›āļĢāļīāļĄāļēāļ“āļ‡āļēāļ™āļŠāļđāļ‡āļŠāļļāļ”āđ„āļ”āđ‰

āļāļēāļĢāđāļĒāļāļ›āļĢāļ°āđ€āļ āļ—āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ CUDA āļ­āļĒāđˆāļēāļ‡āļĨāļ°āđ€āļ­āļĩāļĒāļ”

āđ‚āļĄāđ€āļ”āļĨāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ‚āļ­āļ‡ CUDA āđ€āļœāļĒāđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ›āļĢāļ°āđ€āļ āļ—āļ•āđˆāļēāļ‡āđ† āđ‚āļ”āļĒāđāļ•āđˆāļĨāļ°āļ›āļĢāļ°āđ€āļ āļ—āļĄāļĩāļ‚āļ­āļšāđ€āļ‚āļ• āļ­āļēāļĒāļļāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ āđāļĨāļ°āļĨāļąāļāļĐāļ“āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™ āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰āļ„āļ·āļ­āļ āļēāļžāļĢāļ§āļĄāļ‚āļ­āļ‡āļ›āļĢāļ°āđ€āļ āļ—āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ CUDA āļ—āļĩāđˆāđƒāļŠāđ‰āļāļąāļ™āļ—āļąāđˆāļ§āđ„āļ›āļ—āļĩāđˆāļŠāļļāļ”:

  1. āļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļĩāđˆāđ€āļĢāđ‡āļ§āļ—āļĩāđˆāļŠāļļāļ”āļ—āļĩāđˆāļĄāļĩāđƒāļŦāđ‰āļŠāļģāļŦāļĢāļąāļšāđ€āļ˜āļĢāļ” CUDA āļ‹āļķāđˆāļ‡āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļˆāļąāļ”āđ€āļāđ‡āļšāļ•āļąāļ§āđāļ›āļĢ
  2. āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļĩāđˆāđƒāļŠāđ‰āļĢāđˆāļ§āļĄāļāļąāļ™:āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļĩāđˆāđƒāļŠāđ‰āļĢāđˆāļ§āļĄāļāļąāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ˜āļĢāļ”āļ āļēāļĒāđƒāļ™āļšāļĨāđ‡āļ­āļāđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļĄāļĩāļ„āđˆāļēāļ„āļ§āļēāļĄāļŦāļ™āđˆāļ§āļ‡āļ•āđˆāļģāļāļ§āđˆāļēāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļąāđˆāļ§āđ„āļ›āđāļĨāļ°āļĄāļĩāļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāđƒāļ™āļāļēāļĢāļ‹āļīāļ‡āđ‚āļ„āļĢāđ„āļ™āļ‹āđŒāđ€āļ˜āļĢāļ”
  3. āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ āļēāļĒāđƒāļ™:āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļŠāđˆāļ§āļ™āļ•āļąāļ§āļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ°āđ€āļ˜āļĢāļ” āđƒāļŠāđ‰āđ€āļĄāļ·āđˆāļ­āļĢāļĩāļˆāļīāļŠāđ€āļ•āļ­āļĢāđŒāđ„āļĄāđˆāđ€āļžāļĩāļĒāļ‡āļžāļ­
  4. āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļąāđˆāļ§āđ‚āļĨāļ:āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāļ—āļĩāđˆāļŠāļļāļ”āļ—āļĩāđˆāđ€āļ˜āļĢāļ”āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļ”āđ‰ āļĄāļĩāļ„āđˆāļēāļ„āļ§āļēāļĄāļŦāļ™āđˆāļ§āļ‡āđ€āļ§āļĨāļēāļŠāļđāļ‡ āđāļĨāļ°āđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›āđāļĨāđ‰āļ§āļˆāļ°āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ‚āļ”āļĒāđ€āļ˜āļĢāļ”āļŦāļĨāļēāļĒāđ€āļ˜āļĢāļ”
  5. āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ„āļ‡āļ—āļĩāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļšāļšāļ­āđˆāļēāļ™āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§āļ—āļĩāđˆāļ–āļđāļāđāļ„āļŠāđ„āļ§āđ‰āđ€āļžāļ·āđˆāļ­āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļ„āđˆāļēāļ„āļ‡āļ—āļĩāđˆ
  6. āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļžāļ·āđ‰āļ™āļœāļīāļ§:āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļšāļšāļ­āđˆāļēāļ™āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§āđāļšāļšāļžāļīāđ€āļĻāļĐāļ—āļĩāđˆāļ›āļĢāļąāļšāđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļŠāļģāļŦāļĢāļąāļšāļĢāļđāļ›āđāļšāļšāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļšāļēāļ‡āļĢāļđāļ›āđāļšāļš āđ‚āļ”āļĒāļĄāļąāļāđƒāļŠāđ‰āđƒāļ™āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļāļĢāļēāļŸāļīāļ

CUDA āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļˆāļąāļāļĢ: āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļˆāļĢāļīāļ‡

āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āļ­āļ‡āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™ CUDA C/C++ āđ‚āļ”āļĒāļ—āļĩāđˆāđ‚āļ„āđ‰āļ”āđ‚āļŪāļŠāļ•āđŒ (CPU) āļˆāļąāļ”āļāļēāļĢāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ„āđ‰āļ”āļ„āļđāđˆāļ‚āļ™āļēāļ™āļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ (GPU)

āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āļ­āļ‡āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™ CUDA C/C++ āđ‚āļ”āļĒāļ—āļĩāđˆāđ‚āļ„āđ‰āļ”āđ‚āļŪāļŠāļ•āđŒ (CPU) āļˆāļąāļ”āļāļēāļĢāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ„āđ‰āļ”āļ„āļđāđˆāļ‚āļ™āļēāļ™āļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ (GPU)

āļ•āļ­āļ™āļ™āļĩāđ‰āđ€āļĢāļēāđ„āļ”āđ‰āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄāļžāļ·āđ‰āļ™āļāļēāļ™āđāļĨāđ‰āļ§ āļĄāļēāļŠāļģāļĢāļ§āļˆāļāļąāļ™āļ§āđˆāļē CUDA āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āđƒāļŠāđ‰āļāļąāļšāļ‡āļēāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ—āļąāđˆāļ§āđ„āļ›āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ„āļĢ

  1. āļāļēāļĢāļ„āļđāļ“āđ€āļĄāļ—āļĢāļīāļāļ‹āđŒ

āļāļēāļĢāļ„āļđāļ“āđ€āļĄāļ—āļĢāļīāļāļ‹āđŒāđ€āļ›āđ‡āļ™āļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļžāļ·āđ‰āļ™āļāļēāļ™āđƒāļ™āļ­āļąāļĨāļāļ­āļĢāļīāļ—āļķāļĄāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļˆāļģāļ™āļ§āļ™āļĄāļēāļ āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āđƒāļ™āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ›āļĢāļ°āļŠāļēāļ—āđ€āļ—āļĩāļĒāļĄ 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 āļŠāļģāļŦāļĢāļąāļšāđ€āļĄāļ—āļĢāļīāļāļ‹āđŒāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāđāļĨāđ‰āļ§ āđāļ•āđˆāļāđ‡āļĒāļąāļ‡āļĄāļĩāļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđ‚āļ”āļĒāđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļĩāđˆāđƒāļŠāđ‰āļĢāđˆāļ§āļĄāļāļąāļ™āđāļĨāļ°āđ€āļ—āļ„āļ™āļīāļ„āļ­āļ·āđˆāļ™āđ†

  1. āļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ„āļ­āļ™āđ‚āļ§āļĨāļđāļŠāļąāđˆāļ™

Convolutional Neural Networks (āļ‹āļĩāđ€āļ­āđ‡āļ™āđ€āļ­āđ‡āļ™) āļžāļķāđˆāļ‡āļžāļēāļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāđāļšāļš Convolution āđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļĄāļēāļ CUDA āļŠāļēāļĄāļēāļĢāļ–āđ€āļžāļīāđˆāļĄāļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āđƒāļ™āļāļēāļĢāļ„āļģāļ™āļ§āļ“āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļēāļ āļ™āļĩāđˆāļ„āļ·āļ­āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ Convolution 2D āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļšāļ‡āđˆāļēāļĒ:

__global__ void convolution2DKernel(float *input, float *kernel, float *output, 
                                    int inputWidth, int inputHeight, 
                                    int kernelWidth, int kernelHeight)
{
    int x = blockIdx.x * blockDim.x + threadIdx.x;
    int y = blockIdx.y * blockDim.y + threadIdx.y;
    
    if (x < inputWidth && y < inputHeight) {
        float sum = 0.0f;
        for (int ky = 0; ky < kernelHeight; ky++) {
            for (int kx = 0; kx < kernelWidth; kx++) {
                int inputX = x + kx - kernelWidth / 2;
                int inputY = y + ky - kernelHeight / 2;
                if (inputX >= 0 && inputX < inputWidth && inputY >= 0 && inputY < inputHeight) {
                    sum += input[inputY * inputWidth + inputX] * 
                           kernel[ky * kernelWidth + kx];
                }
            }
        }
        output[y * inputWidth + x] = sum;
    }
}

āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ™āļĩāđ‰āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ„āļ­āļ™āđ‚āļ§āļĨāļđāļŠāļąāđˆāļ™ 2 āļĄāļīāļ•āļī āđ‚āļ”āļĒāđāļ•āđˆāļĨāļ°āđ€āļ˜āļĢāļ”āļˆāļ°āļ„āļģāļ™āļ§āļ“āļžāļīāļāđ€āļ‹āļĨāđ€āļ­āļēāļ•āđŒāļžāļļāļ•āļŦāļ™āļķāđˆāļ‡āļžāļīāļāđ€āļ‹āļĨ āđƒāļ™āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļī āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļĩāđˆāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļĄāļēāļāļ‚āļķāđ‰āļ™āļˆāļ°āđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļĢāđˆāļ§āļĄāļāļąāļ™āđ€āļžāļ·āđˆāļ­āļĨāļ”āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļąāđˆāļ§āđ‚āļĨāļāđāļĨāļ°āļ›āļĢāļąāļšāđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļŠāļģāļŦāļĢāļąāļšāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āļ•āđˆāļēāļ‡āđ†

  1. āđ‚āļ„āļ•āļĢāļĨāļēāļ”āļŠāļļāđˆāļĄ (SGD)

SGD āđ€āļ›āđ‡āļ™āļ­āļąāļĨāļāļ­āļĢāļīāļ—āļķāļĄāļāļēāļĢāđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ—āļĩāđˆāļŠāļģāļ„āļąāļāđƒāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ CUDA āļŠāļēāļĄāļēāļĢāļ–āļ„āļģāļ™āļ§āļ“āļāļēāļĢāđ„āļĨāđˆāļĢāļ°āļ”āļąāļšāđāļšāļšāļ‚āļ™āļēāļ™āđ„āļ”āđ‰āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļˆāļļāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļĨāļēāļĒāļˆāļļāļ” āļ™āļĩāđˆāļ„āļ·āļ­āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđāļšāļšāļ‡āđˆāļēāļĒāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ–āļ”āļ–āļ­āļĒāđ€āļŠāļīāļ‡āđ€āļŠāđ‰āļ™:

__global__ void sgdKernel(float *X, float *y, float *weights, float learningRate, int n, int d)
{
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    if (i < n) {
        float prediction = 0.0f;
        for (int j = 0; j < d; j++) {
            prediction += X[i * d + j] * weights[j];
        }
        float error = prediction - y[i];
        for (int j = 0; j < d; j++) {
            atomicAdd(&weights[j], -learningRate * error * X[i * d + j]);
        }
    }
}

void sgd(float *X, float *y, float *weights, float learningRate, int n, int d, int iterations)
{
    int threadsPerBlock = 256;
    int numBlocks = (n + threadsPerBlock - 1) / threadsPerBlock;
    
    for (int iter = 0; iter < iterations; iter++) {
        sgdKernel<<<numBlocks, threadsPerBlock>>>(X, y, weights, learningRate, n, d);
    }
}

āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ™āļĩāđ‰āļˆāļ°āļ­āļąāļ›āđ€āļ”āļ•āļ™āđ‰āļģāļŦāļ™āļąāļāđāļšāļšāļ‚āļ™āļēāļ™āļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ°āļˆāļļāļ”āļ‚āđ‰āļ­āļĄāļđāļĨ atomicAdd āļŸāļąāļ‡āļāđŒāļŠāļąāđˆāļ™āļ™āļĩāđ‰āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļāļēāļĢāļ­āļąāļžāđ€āļ”āļ•āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āļ‚āļ­āļ‡āļ™āđ‰āļģāļŦāļ™āļąāļāļ­āļĒāđˆāļēāļ‡āļ›āļĨāļ­āļ”āļ āļąāļĒ

āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž CUDA āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡

āđāļĄāđ‰āļ§āđˆāļēāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āļˆāļ°āļŠāļēāļ˜āļīāļ•āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰ CUDA āļŠāļģāļŦāļĢāļąāļšāļ‡āļēāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āđāļ•āđˆāļāđ‡āļĒāļąāļ‡āļĄāļĩāđ€āļ—āļ„āļ™āļīāļ„āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļŦāļĨāļēāļĒāļ›āļĢāļ°āļāļēāļĢāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđ„āļ”āđ‰āļ­āļĩāļāļ”āđ‰āļ§āļĒ:

  1. āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļšāļšāļĢāļ§āļĄ

GPU āļˆāļ°āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļ•āđ‡āļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđ€āļĄāļ·āđˆāļ­āđ€āļ˜āļĢāļ”āđƒāļ™āļ•āļģāđāļŦāļ™āđˆāļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļĩāđˆāļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āļāļąāļ™āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđāļšāļšāļ§āļēāļĢāđŒāļ› āļ•āļĢāļ§āļˆāļŠāļ­āļšāđƒāļŦāđ‰āđāļ™āđˆāđƒāļˆāļ§āđˆāļēāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāļ°āļĢāļđāļ›āđāļšāļšāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āļ­āļ‡āļ„āļļāļ“āļŠāđˆāļ‡āđ€āļŠāļĢāļīāļĄāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļšāļšāļĢāļ§āļĄ

  1. āļāļēāļĢāđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļĢāđˆāļ§āļĄāļāļąāļ™

āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļšāļšāđāļŠāļĢāđŒāļ™āļąāđ‰āļ™āđ€āļĢāđ‡āļ§āļāļ§āđˆāļēāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļąāđˆāļ§āđ„āļ›āļĄāļēāļ āđƒāļŠāđ‰āđ€āļžāļ·āđˆāļ­āđāļ„āļŠāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļšāđˆāļ­āļĒāđ† āļ āļēāļĒāđƒāļ™āļšāļĨāđ‡āļ­āļāđ€āļ˜āļĢāļ”

āļāļēāļĢāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļĨāļģāļ”āļąāļšāļŠāļąāđ‰āļ™āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ€āļ›āđ‡āļ™āļŠāļīāđˆāļ‡āļŠāļģāļ„āļąāļāđ€āļĄāļ·āđˆāļ­āļ—āļģāļ‡āļēāļ™āļāļąāļš CUDA

āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļĨāļģāļ”āļąāļšāļŠāļąāđ‰āļ™āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ”āđ‰āļ§āļĒ CUDA

āđ„āļ”āļ­āļ°āđāļāļĢāļĄāļ™āļĩāđ‰āđāļŠāļ”āļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļĄāļąāļĨāļ•āļīāđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ‹āļ­āļĢāđŒāļ—āļĩāđˆāļĄāļĩāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļĢāđˆāļ§āļĄāļāļąāļ™ āđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ‹āļ­āļĢāđŒāđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļĄāļĩāđāļ„āļŠāļ‚āļ­āļ‡āļ•āļąāļ§āđ€āļ­āļ‡ āļ‹āļķāđˆāļ‡āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđƒāļŠāđ‰āļšāđˆāļ­āļĒāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĢāļ§āļ”āđ€āļĢāđ‡āļ§ āđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ‹āļ­āļĢāđŒāļŠāļ·āđˆāļ­āļŠāļēāļĢāļāļąāļ™āļœāđˆāļēāļ™āļšāļąāļŠāļ—āļĩāđˆāđƒāļŠāđ‰āļĢāđˆāļ§āļĄāļāļąāļ™ āļ‹āļķāđˆāļ‡āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ‹āļ­āļĢāđŒāļāļąāļšāļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļĩāđˆāđƒāļŠāđ‰āļĢāđˆāļ§āļĄāļāļąāļ™āļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāļāļ§āđˆāļē

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™āđƒāļ™āļāļēāļĢāļ„āļđāļ“āđ€āļĄāļ—āļĢāļīāļāļ‹āđŒ:

__global__ void matrixMulSharedKernel(float *A, float *B, float *C, int N)
{
    __shared__ float sharedA[TILE_SIZE][TILE_SIZE];
    __shared__ float sharedB[TILE_SIZE][TILE_SIZE];
    
    int bx = blockIdx.x; int by = blockIdx.y;
    int tx = threadIdx.x; int ty = threadIdx.y;
    
    int row = by * TILE_SIZE + ty;
    int col = bx * TILE_SIZE + tx;
    
    float sum = 0.0f;
    
    for (int tile = 0; tile < (N + TILE_SIZE - 1) / TILE_SIZE; tile++) {
        if (row < N && tile * TILE_SIZE + tx < N)
            sharedA[ty][tx] = A[row * N + tile * TILE_SIZE + tx];
        else
            sharedA[ty][tx] = 0.0f;
        
        if (col < N && tile * TILE_SIZE + ty < N)
            sharedB[ty][tx] = B[(tile * TILE_SIZE + ty) * N + col];
        else
            sharedB[ty][tx] = 0.0f;
        
        __syncthreads();
        
        for (int k = 0; k < TILE_SIZE; k++)
            sum += sharedA[ty][k] * sharedB[k][tx];
        
        __syncthreads();
    }
    
    if (row < N && col < N)
        C[row * N + col] = sum;
}

āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āļ—āļĩāđˆāļ›āļĢāļąāļšāđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļ™āļĩāđ‰āđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļĢāđˆāļ§āļĄāļāļąāļ™āđ€āļžāļ·āđˆāļ­āļĨāļ”āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļąāđˆāļ§āđ‚āļĨāļ āļ‹āļķāđˆāļ‡āļˆāļ°āļŠāđˆāļ§āļĒāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļŠāļģāļŦāļĢāļąāļšāđ€āļĄāļ—āļĢāļīāļāļ‹āđŒāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ™āļąāļĒāļŠāļģāļ„āļąāļ

  1. āļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāđāļšāļšāļ­āļ°āļ‹āļīāļ‡āđ‚āļ„āļĢāļ™āļąāļŠ

CUDA āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļšāļšāļ­āļ°āļ‹āļīāļ‡āđ‚āļ„āļĢāļ™āļąāļŠ āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļ—āļąāļšāļ‹āđ‰āļ­āļ™āļāļēāļĢāļ„āļģāļ™āļ§āļ“āļāļąāļšāļāļēāļĢāļ–āđˆāļēāļĒāđ‚āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰ āļ‹āļķāđˆāļ‡āļĄāļĩāļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āđƒāļ™āļĢāļ°āļšāļšāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āļ‹āļķāđˆāļ‡āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āđ€āļ•āļĢāļĩāļĒāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļļāļ”āļ•āđˆāļ­āđ„āļ›āđ„āļ”āđ‰āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļŠāļļāļ”āļ›āļąāļˆāļˆāļļāļšāļąāļ™

cudaStream_t stream1, stream2;
cudaStreamCreate(&stream1);
cudaStreamCreate(&stream2);

// Asynchronous memory transfers and kernel launches
cudaMemcpyAsync(d_data1, h_data1, size, cudaMemcpyHostToDevice, stream1);
myKernel<<<grid, block, 0, stream1>>>(d_data1, ...);

cudaMemcpyAsync(d_data2, h_data2, size, cudaMemcpyHostToDevice, stream2);
myKernel<<<grid, block, 0, stream2>>>(d_data2, ...);

cudaStreamSynchronize(stream1);
cudaStreamSynchronize(stream2);
  1. āđāļāļ™ Tensor

āļŠāļģāļŦāļĢāļąāļšāļ āļēāļĢāļ°āļ‡āļēāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Tensor Cores āļ‚āļ­āļ‡ NVIDIA (āļĄāļĩāđƒāļŦāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āđƒāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ GPU āđƒāļŦāļĄāđˆāļāļ§āđˆāļē) āļŠāļēāļĄāļēāļĢāļ–āđƒāļŦāđ‰āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļ—āļĩāđˆāđ€āļžāļīāđˆāļĄāļ‚āļķāđ‰āļ™āļ­āļĒāđˆāļēāļ‡āļĄāļēāļāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ„āļđāļ“āđ€āļĄāļ—āļĢāļīāļāļ‹āđŒāđāļĨāļ°āļāļēāļĢāļĄāđ‰āļ§āļ™āļĢāļ§āļĄ āđ„āļĨāļšāļĢāļēāļĢāļĩāđ€āļŠāđˆāļ™ āļ”āļĩāđ€āļ­āđ‡āļ™āđ€āļ­āđ‡āļ™ āđāļĨāļ° cuBLAS āđƒāļŠāđ‰āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļˆāļēāļ Tensor Cores āđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļīāđ€āļĄāļ·āđˆāļ­āļžāļĢāđ‰āļ­āļĄāđƒāļŠāđ‰āļ‡āļēāļ™

āļ„āļ§āļēāļĄāļ—āđ‰āļēāļ—āļēāļĒāđāļĨāļ°āļāļēāļĢāļžāļīāļˆāļēāļĢāļ“āļē

āđāļĄāđ‰āļ§āđˆāļē CUDA āļˆāļ°āđƒāļŦāđ‰āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļĄāļŦāļēāļĻāļēāļĨāļ•āđˆāļ­āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļˆāļąāļāļĢ āđāļ•āđˆāļŠāļīāđˆāļ‡āļŠāļģāļ„āļąāļāļ„āļ·āļ­āļāļēāļĢāļ•āļĢāļ°āļŦāļ™āļąāļāļ–āļķāļ‡āļ„āļ§āļēāļĄāļ—āđ‰āļēāļ—āļēāļĒāļ—āļĩāđˆāļ­āļēāļˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™:

  1. āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ:āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ GPU āļĄāļĩāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āđ€āļĄāļ·āđˆāļ­āđ€āļ—āļĩāļĒāļšāļāļąāļšāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļĢāļ°āļšāļš āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđ€āļ›āđ‡āļ™āļŠāļīāđˆāļ‡āļŠāļģāļ„āļąāļ āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āđ€āļĄāļ·āđˆāļ­āļ—āļģāļ‡āļēāļ™āļāļąāļšāļŠāļļāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļĢāļ·āļ­āđ‚āļĄāđ€āļ”āļĨāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆ
  2. āļ„āđˆāļēāđƒāļŠāđ‰āļˆāđˆāļēāļĒāđƒāļ™āļāļēāļĢāļ–āđˆāļēāļĒāđ‚āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨ: āļāļēāļĢāđ‚āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡ CPU āđāļĨāļ° GPU āļ­āļēāļˆāđ€āļ›āđ‡āļ™āļ„āļ­āļ‚āļ§āļ”āđ„āļ”āđ‰ āļĨāļ”āļāļēāļĢāļ–āđˆāļēāļĒāđ‚āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāđ‰āđ€āļŦāļĨāļ·āļ­āļ™āđ‰āļ­āļĒāļ—āļĩāđˆāļŠāļļāļ”āđāļĨāļ°āđƒāļŠāđ‰āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļšāļšāļ­āļ°āļ‹āļīāļ‡āđ‚āļ„āļĢāļ™āļąāļŠāđ€āļĄāļ·āđˆāļ­āļ—āļģāđ„āļ”āđ‰
  3. āļ„āļ§āļēāļĄāđāļĄāđˆāļ™āļĒāļģ:āđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›āđāļĨāđ‰āļ§ GPU āļĄāļąāļāļˆāļ°āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĒāļ­āļ”āđ€āļĒāļĩāđˆāļĒāļĄāđƒāļ™āļāļēāļĢāļ„āļģāļ™āļ§āļ“āļ„āļ§āļēāļĄāđāļĄāđˆāļ™āļĒāļģāđāļšāļšāļ‹āļīāļ‡āđ€āļāļīāļĨ (FP32) āđāļĄāđ‰āļ§āđˆāļēāļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāļ„āļ§āļēāļĄāđāļĄāđˆāļ™āļĒāļģāđāļšāļšāļ”āļąāļšāđ€āļšāļīāļĨ (FP64) āļˆāļ°āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđāļĨāđ‰āļ§āļāđ‡āļ•āļēāļĄ āđāļ•āđˆāļāđ‡āļĄāļąāļāļˆāļ°āļŠāđ‰āļēāļāļ§āđˆāļē āļ‡āļēāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļˆāļģāļ™āļ§āļ™āļĄāļēāļāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļ”āļĩāļāļąāļšāļ„āļ§āļēāļĄāđāļĄāđˆāļ™āļĒāļģāļ—āļĩāđˆāļ•āđˆāļģāļāļ§āđˆāļē (āđ€āļŠāđˆāļ™ FP16) āļ‹āļķāđˆāļ‡ GPU āļŠāļĄāļąāļĒāđƒāļŦāļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļˆāļąāļ”āļāļēāļĢāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļĄāļēāļ
  4. āļ„āļ§āļēāļĄāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļ‚āļ­āļ‡āđ‚āļ„āđ‰āļ”:āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ„āđ‰āļ” CUDA āļ—āļĩāđˆāļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ­āļēāļˆāļĄāļĩāļ„āļ§āļēāļĄāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļĄāļēāļāļāļ§āđˆāļēāđ‚āļ„āđ‰āļ” CPU āļāļēāļĢāđƒāļŠāđ‰āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļˆāļēāļāđ„āļĨāļšāļĢāļēāļĢāļĩāđ€āļŠāđˆāļ™ āļ”āļĩāđ€āļ­āđ‡āļ™āđ€āļ­āđ‡āļ™, cuBLAS āđāļĨāļ°āđ€āļŸāļĢāļĄāđ€āļ§āļīāļĢāđŒāļāđ€āļŠāđˆāļ™ TensorFlow āļŦāļĢāļ·āļ­ PyTorch āļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ§āļĒāđāļĒāļāļ„āļ§āļēāļĄāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļšāļēāļ‡āļŠāđˆāļ§āļ™āļ­āļ­āļāđ„āļ›āđ„āļ”āđ‰

āļāļēāļĢāļĒāđ‰āļēāļĒāđ„āļ›āđƒāļŠāđ‰ GPU āļŦāļĨāļēāļĒāļ•āļąāļ§

āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ‚āļĄāđ€āļ”āļĨāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļĩāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāđāļĨāļ°āļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļĄāļēāļāļ‚āļķāđ‰āļ™ GPU āđ€āļžāļĩāļĒāļ‡āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§āļ­āļēāļˆāđ„āļĄāđˆāđ€āļžāļĩāļĒāļ‡āļžāļ­āļ•āđˆāļ­āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ›āļĢāļīāļĄāļēāļ“āļ‡āļēāļ™āļ­āļĩāļāļ•āđˆāļ­āđ„āļ› CUDA āļ—āļģāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ›āļĢāļąāļšāļ‚āļ™āļēāļ”āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļ‚āļ­āļ‡āļ„āļļāļ“āđƒāļŦāđ‰āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ GPU āļŦāļĨāļēāļĒāļ•āļąāļ§āđ„āļ”āđ‰ āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āļ āļēāļĒāđƒāļ™āđ‚āļŦāļ™āļ”āđ€āļ”āļĩāļĒāļ§āļŦāļĢāļ·āļ­āļ—āļąāđˆāļ§āļ—āļąāđ‰āļ‡āļ„āļĨāļąāļŠāđ€āļ•āļ­āļĢāđŒ

āđ€āļŦāļ•āļļāļœāļĨāđƒāļ™āļāļēāļĢāđƒāļŠāđ‰ GPU āļŦāļĨāļēāļĒāļ•āļąāļ§

  1. āļ‚āļ™āļēāļ”āđ‚āļ”āđ€āļĄāļ™āļ—āļĩāđˆāļĄāļĩāļ›āļąāļāļŦāļē:āļŠāļļāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļĢāļ·āļ­āđ‚āļĄāđ€āļ”āļĨāļ‚āļ­āļ‡āļ„āļļāļ“āļ­āļēāļˆāļĄāļĩāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāđ€āļāļīāļ™āļāļ§āđˆāļēāļ—āļĩāđˆāļˆāļ°āđƒāļŠāđˆāļĨāļ‡āđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ‚āļ­āļ‡ GPU āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§āđ„āļ”āđ‰
  2. āļ›āļĢāļīāļĄāļēāļ“āļ‡āļēāļ™āđāļĨāļ°āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž:āđāļĄāđ‰āļ§āđˆāļēāļ‡āļēāļ™āđ€āļ”āļĩāļĒāļ§āļˆāļ°āļžāļ­āļ”āļĩāļāļąāļš GPU āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§ āđāļ•āđˆāļāļēāļĢāđƒāļŠāđ‰ GPU āļŦāļĨāļēāļĒāļ•āļąāļ§āļŠāļēāļĄāļēāļĢāļ–āđ€āļžāļīāđˆāļĄāļ›āļĢāļīāļĄāļēāļ“āļ‡āļēāļ™āđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‡āļēāļ™āļŦāļĨāļēāļĒāļ‡āļēāļ™āļžāļĢāđ‰āļ­āļĄāđ† āļāļąāļ™

āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ CUDA

āđƒāļ™āļāļēāļĢāđƒāļŠāđ‰ CUDA āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđ€āļ‚āđ‰āļēāđƒāļˆāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āļ‹āļķāđˆāļ‡āđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ (āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļšāļ™ GPU) āđāļĨāļ°āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļŪāļŠāļ•āđŒ (CPU) āđāļĨāļ°āļ­āļļāļ›āļāļĢāļ“āđŒ (GPU)

āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ‚āļŪāļŠāļ•āđŒāđ€āļ—āļĩāļĒāļšāļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒ

āđƒāļ™ CUDA āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļˆāļ°āļ–āļđāļāļˆāļąāļ”āļāļēāļĢāđāļĒāļāļāļąāļ™āļŠāļģāļŦāļĢāļąāļšāđ‚āļŪāļŠāļ•āđŒāđāļĨāļ°āļ­āļļāļ›āļāļĢāļ“āđŒ āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰āļ„āļ·āļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļŦāļĨāļąāļāļ—āļĩāđˆāđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ:

  • āļ„āļđāļ”āđ‰āļēāļĄāļąāļĨāļĨāđ‡āļ­āļ„: āļˆāļąāļ”āļŠāļĢāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ
  • āļ„āļīāļ§āļ”āđ‰āļēāđ€āļĄāļĄāļžāļĩ: āļ„āļąāļ”āļĨāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļŪāļŠāļ•āđŒāđāļĨāļ°āļ­āļļāļ›āļāļĢāļ“āđŒ
  • āļ„āļđāļ”āđ‰āļēāļŸāļĢāļĩ: āđ€āļžāļīāđˆāļĄāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡: āļāļēāļĢāļĢāļ§āļĄāļ­āļēāļĢāđŒāđ€āļĢāļĒāđŒāļŠāļ­āļ‡āļ•āļąāļ§

āļĄāļēāļ”āļđāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļĢāļ§āļĄāļ­āļēāļĢāđŒāđ€āļĢāļĒāđŒāļŠāļ­āļ‡āļŠāļļāļ”āđ‚āļ”āļĒāđƒāļŠāđ‰ CUDA āļāļąāļ™:

__global__ void sumArraysOnGPU(float *A, float *B, float *C, int N) {
    int idx = threadIdx.x + blockIdx.x * blockDim.x;
    if (idx < N) C[idx] = A[idx] + B[idx];
}

int main() {
    int N = 1024;
    size_t bytes = N * sizeof(float);

    float *h_A, *h_B, *h_C;
    h_A = (float*)malloc(bytes);
    h_B = (float*)malloc(bytes);
    h_C = (float*)malloc(bytes);

    float *d_A, *d_B, *d_C;
    cudaMalloc(&d_A, bytes);
    cudaMalloc(&d_B, bytes);
    cudaMalloc(&d_C, bytes);

    cudaMemcpy(d_A, h_A, bytes, cudaMemcpyHostToDevice);
    cudaMemcpy(d_B, h_B, bytes, cudaMemcpyHostToDevice);

    int blockSize = 256;
    int gridSize = (N + blockSize - 1) / blockSize;

    sumArraysOnGPU<<<gridSize, blockSize>>>(d_A, d_B, d_C, N);

    cudaMemcpy(h_C, d_C, bytes, cudaMemcpyDeviceToHost);

    cudaFree(d_A);
    cudaFree(d_B);
    cudaFree(d_C);

    free(h_A);
    free(h_B);
    free(h_C);

    return 0;
}

āđƒāļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ™āļĩāđ‰ āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļˆāļ°āļ–āļđāļāļˆāļąāļ”āļŠāļĢāļĢāđƒāļŦāđ‰āļ—āļąāđ‰āļ‡āđ‚āļŪāļŠāļ•āđŒāđāļĨāļ°āļ­āļļāļ›āļāļĢāļ“āđŒ āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āļ–āļđāļāđ‚āļ­āļ™āđ„āļ›āļĒāļąāļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ āđāļĨāļ°āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļˆāļ°āļ–āļđāļāđ€āļ›āļīāļ”āļ•āļąāļ§āđ€āļžāļ·āđˆāļ­āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ„āļģāļ™āļ§āļ“

āļŠāļĢāļļāļ›

CUDA āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ­āļąāļ™āļ—āļĢāļ‡āļžāļĨāļąāļ‡āļŠāļģāļŦāļĢāļąāļšāļ§āļīāļĻāļ§āļāļĢāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļĢāđˆāļ‡āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āđƒāļŦāđ‰āļāļąāļšāđ‚āļĄāđ€āļ”āļĨāđāļĨāļ°āļˆāļąāļ”āļāļēāļĢāļŠāļļāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆ āļ”āđ‰āļ§āļĒāļāļēāļĢāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđ‚āļĄāđ€āļ”āļĨāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ CUDA āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āđāļĨāļ°āļāļēāļĢāđƒāļŠāđ‰āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļˆāļēāļ GPU āļŦāļĨāļēāļĒāļ•āļąāļ§ āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ‚āļ­āļ‡āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ™āļąāļĒāļŠāļģāļ„āļąāļ

āđāļĄāđ‰āļ§āđˆāļēāļšāļ—āļ„āļ§āļēāļĄāļ™āļĩāđ‰āļˆāļ°āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄāļžāļ·āđ‰āļ™āļāļēāļ™āđāļĨāļ°āļŦāļąāļ§āļ‚āđ‰āļ­āļ‚āļąāđ‰āļ™āļŠāļđāļ‡āļšāļēāļ‡āļŠāđˆāļ§āļ™āđāļĨāđ‰āļ§ āđāļ•āđˆ CUDA āļ–āļ·āļ­āđ€āļ›āđ‡āļ™āļŠāļēāļ‚āļēāļ—āļĩāđˆāļāļ§āđ‰āļēāļ‡āļ‚āļ§āļēāļ‡āđāļĨāļ°āļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡ āļ•āļīāļ”āļ•āļēāļĄāļ‚āđˆāļēāļ§āļŠāļēāļĢāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāđ€āļ›āļīāļ”āļ•āļąāļ§ CUDA āļĨāđˆāļēāļŠāļļāļ” āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ GPU āđāļĨāļ°āđ„āļĨāļšāļĢāļēāļĢāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļˆāļēāļāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ­āļąāļ™āļ—āļĢāļ‡āļžāļĨāļąāļ‡āļ™āļĩāđ‰āđƒāļŦāđ‰āđ„āļ”āđ‰āļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ”

āļ‰āļąāļ™āđƒāļŠāđ‰āđ€āļ§āļĨāļēāļŦāđ‰āļēāļ›āļĩāļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļēāļŦāļĄāļāļĄāļļāđˆāļ™āļ­āļĒāļđāđˆāļāļąāļšāđ‚āļĨāļāđāļŦāđˆāļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĨāļ°āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āđ€āļŠāļīāļ‡āļĨāļķāļāļ—āļĩāđˆāļ™āđˆāļēāļŠāļ™āđƒāļˆ āļ„āļ§āļēāļĄāļŦāļĨāļ‡āđƒāļŦāļĨāđāļĨāļ°āļ„āļ§āļēāļĄāđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļāļ‚āļ­āļ‡āļ‰āļąāļ™āļ—āļģāđƒāļŦāđ‰āļ‰āļąāļ™āļĄāļĩāļŠāđˆāļ§āļ™āļĢāđˆāļ§āļĄāđƒāļ™āđ‚āļ„āļĢāļ‡āļāļēāļĢāļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļ‹āļ­āļŸāļ•āđŒāđāļ§āļĢāđŒāļ—āļĩāđˆāļŦāļĨāļēāļāļŦāļĨāļēāļĒāļāļ§āđˆāļē 50 āđ‚āļ„āļĢāļ‡āļāļēāļĢ āđ‚āļ”āļĒāđ€āļ™āđ‰āļ™āđ€āļ‰āļžāļēāļ°āļ—āļĩāđˆ AI/ML āļ„āļ§āļēāļĄāļ­āļĒāļēāļāļĢāļđāđ‰āļ­āļĒāļēāļāđ€āļŦāđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āļ‚āļ­āļ‡āļ‰āļąāļ™āļĒāļąāļ‡āļ”āļķāļ‡āļ‰āļąāļ™āđ„āļ›āļŠāļđāđˆāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ āļēāļĐāļēāļ˜āļĢāļĢāļĄāļŠāļēāļ•āļī āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļŠāļēāļ‚āļēāļ—āļĩāđˆāļ‰āļąāļ™āļāļĢāļ°āļ•āļ·āļ­āļĢāļ·āļ­āļĢāđ‰āļ™āļ—āļĩāđˆāļˆāļ°āļŠāļģāļĢāļ§āļˆāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ