πŸ’¬ Π‘Ρ‚Π°Ρ‚ΡŒΠΈ

Как Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ CUDA

Π’ ΠΌΠΈΡ€Π΅ Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… вычислСний тСхнология CUDA ΠΎΡ‚ NVIDIA ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ нСвСроятныС возмоТности для ускорСния рСсурсоСмких Π·Π°Π΄Π°Ρ‡. 🧠 Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠΎΡ‰ΡŒ графичСских процСссоров (GPU), CUDA позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ вычислСния, Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ прСвосходящиС возмоТности Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹Ρ… процСссоров (CPU).

πŸ’‘ Π’ этом ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΌ руководствС ΠΌΡ‹ погрузимся Π² ΠΌΠΈΡ€ CUDA ΠΈ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ вСсь процСсс запуска ΠΊΠΎΠ΄Π° Π½Π° GPU, начиная с основ ΠΈ заканчивая практичСскими ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ.

  1. πŸ’» ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ с CUDA
  2. βš™οΈ ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π½Π° CUDA
  3. πŸ”¨ Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ запуск CUDA-ΠΊΠΎΠ΄Π°
  4. πŸ’‘ ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Π‘Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… массивов
  5. c++
  6. Include <cuda.h>
  7. Include <stdio.h>
  8. __global__ void add(int *a, int *b, int *c) {
  9. Int main() {
  10. // Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π½Π° CPU
  11. // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π΄Π°Π½Π½Ρ‹Ρ…
  12. // Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π½Π° GPU
  13. // ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° GPU
  14. // Запуск ядра
  15. // ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π½Π° CPU
  16. // Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ²
  17. // ОсвобоТдСниС памяти
  18. πŸ”§ ΠžΡ‚Π»Π°Π΄ΠΊΠ° ΠΈ оптимизация CUDA-ΠΊΠΎΠ΄Π°
  19. πŸš€ Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅
  20. ❓ Часто Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ вопросы (FAQ)

πŸ’» ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ с CUDA

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ CUDA, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ваша систСма Π³ΠΎΡ‚ΠΎΠ²Π° ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ с этой Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ. Π’ΠΎΡ‚ пошаговоС руководство:

1. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° совмСстимости оборудования:
  • Π’ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚Π°: Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ваша Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ CUDA.
  • Для этого Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π΅Π΅ модСль Π½Π° сайтС NVIDIA ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ CUDA.
  • Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚Π°Ρ… доступна Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ сайтС NVIDIA.
  • ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма: CUDA совмСстима с Windows, Linux ΠΈ macOS.
  • Π£Ρ‚ΠΎΡ‡Π½ΠΈΡ‚Π΅ Π½Π° сайтС NVIDIA трСбования ΠΊ вСрсии вашСй ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы.
2. Установка Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² NVIDIA:
  • Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ²: Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ послСдниС вСрсии Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² для вашСй Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚Ρ‹ с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ сайта NVIDIA.
  • Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ модСль вашСй Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚Ρ‹ ΠΈ Π²Π΅Ρ€ΡΠΈΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы.
  • Установка Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ²: ЗапуститС установочный Ρ„Π°ΠΉΠ» Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² ΠΈ слСдуйтС инструкциям Π½Π° экранС.
  • ПослС установки Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° систСмы.
3. Установка CUDA Toolkit:
  • Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° CUDA Toolkit: Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΡΡ‰ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ CUDA Toolkit с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ сайта NVIDIA.
  • Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π²Π°ΡˆΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ систСму ΠΈ Π²Π΅Ρ€ΡΠΈΡŽ CUDA, ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΡƒΡŽ с вашСй Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚ΠΎΠΉ.
  • Установка CUDA Toolkit: ЗапуститС установочный Ρ„Π°ΠΉΠ» CUDA Toolkit ΠΈ слСдуйтС инструкциям Π½Π° экранС.
  • Π’ процСссС установки Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΎΠΏΡ†ΠΈΡŽ установки CUDA Toolkit, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ†ΠΈΠΈ установки Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² ΠΈ SDK, Ссли ΠΎΠ½ΠΈ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹.
4. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° установки CUDA:
  • Запуск ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°: ПослС установки CUDA Toolkit, запуститС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ CUDA, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ всС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ.
  • ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ находятся Π² ΠΏΠ°ΠΏΠΊΠ΅ C:\ProgramData\NVIDIA Corporation\CUDA Samples\v<вСрсия_CUDA>\.

βš™οΈ ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π½Π° CUDA

Π―Π·Ρ‹ΠΊ программирования CUDA C/C++ являСтся Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ стандартного C/C++, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, выполняСмый Π½Π° GPU.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ CUDA:
  • Π―Π΄Ρ€ΠΎ (Kernel): Ѐункция, запускаСмая Π½Π° GPU ΠΈ выполняСмая ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ мноТСством Π½ΠΈΡ‚Π΅ΠΉ.
  • ΠΠΈΡ‚ΡŒ (Thread): Минимальная Π΅Π΄ΠΈΠ½ΠΈΡ†Π° выполнСния ΠΊΠΎΠ΄Π° Π½Π° GPU.
  • Π‘Π»ΠΎΠΊ Π½ΠΈΡ‚Π΅ΠΉ (Thread Block): Π“Ρ€ΡƒΠΏΠΏΠ° Π½ΠΈΡ‚Π΅ΠΉ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΌ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Π΅ (SM) GPU.
  • Π‘Π΅Ρ‚ΠΊΠ° Π½ΠΈΡ‚Π΅ΠΉ (Thread Grid): Набор Π±Π»ΠΎΠΊΠΎΠ² Π½ΠΈΡ‚Π΅ΠΉ, запускаСмых Π½Π° GPU.

πŸ”¨ Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ запуск CUDA-ΠΊΠΎΠ΄Π°

1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²Π°ΡˆΡƒ Π»ΡŽΠ±ΠΈΠΌΡƒΡŽ IDE (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Visual Studio, Eclipse, ΠΈΠ»ΠΈ CLion) для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° C/C++.
  • Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ CUDA, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваш ΠΊΠΎΠ΄ ΠΌΠΎΠ³ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CUDA.
2. НаписаниС ΠΊΠΎΠ΄Π° ядра:

c++

__global__ void add(int *a, int *b, int *c) {

int i = blockIdx.x * blockDim.x + threadIdx.x;

c[i] = a[i] + b[i];

}

  • Код ядра опрСдСляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π° GPU.
  • ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово __global__ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ эта функция являСтся ядром CUDA.
  • Π’Π½ΡƒΡ‚Ρ€ΠΈ ядра ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ blockIdx, blockDim ΠΈ threadIdx для опрСдСлСния индСкса Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π½ΠΈΡ‚ΠΈ.
3. Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π½Π° GPU:

c++

int *a_d, *b_d, *c_d;

cudaMalloc((void **)&a_d, N * sizeof(int));

cudaMalloc((void **)&b_d, N * sizeof(int));

cudaMalloc((void **)&c_d, N * sizeof(int));

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ cudaMalloc для выдСлСния памяти Π½Π° GPU.
  • ΠŸΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ выдСляСмой памяти.
4. ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° GPU:

c++

cudaMemcpy(a_d, a, N * sizeof(int), cudaMemcpyHostToDevice);

cudaMemcpy(b_d, b, N * sizeof(int), cudaMemcpyHostToDevice);

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ cudaMemcpy для копирования Π΄Π°Π½Π½Ρ‹Ρ… с CPU Π½Π° GPU.
  • Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ копирования (с хоста Π½Π° устройство) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ cudaMemcpyHostToDevice.
5. Запуск ядра:

c++

int threadsPerBlock = 256;

int blocksPerGrid = (N + threadsPerBlock β€” 1) / threadsPerBlock;

add<<<blocksPerGrid, threadsPerBlock>>>(a_d, b_d, c_d);

  • ЗапуститС ядро, ΡƒΠΊΠ°Π·Π°Π² количСство Π±Π»ΠΎΠΊΠΎΠ² Π² сСткС (blocksPerGrid) ΠΈ количСство Π½ΠΈΡ‚Π΅ΠΉ Π² Π±Π»ΠΎΠΊΠ΅ (threadsPerBlock).
6. ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π½Π° CPU:

c++

cudaMemcpy(c, c_d, N * sizeof(int), cudaMemcpyDeviceToHost);

  • ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ядра скопируйтС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ с GPU Π½Π° CPU, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ cudaMemcpyDeviceToHost.
7. ОсвобоТдСниС памяти Π½Π° GPU:

c++

cudaFree(a_d);

cudaFree(b_d);

cudaFree(c_d);

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ cudaFree для освобоТдСния памяти, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π½Π° GPU.

πŸ’‘ ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Π‘Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… массивов

c++

Include <cuda.h>

Include <stdio.h>

__global__ void add(int *a, int *b, int *c) {

int i = blockIdx.x * blockDim.x + threadIdx.x;

c[i] = a[i] + b[i];

}

Int main() {

int N = 1024;

int *a, *b, *c;

int *a_d, *b_d, *c_d;

// Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π½Π° CPU

a = (int *)malloc(N * sizeof(int));

b = (int *)malloc(N * sizeof(int));

c = (int *)malloc(N * sizeof(int));

// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π΄Π°Π½Π½Ρ‹Ρ…

for (int i = 0; i < N; i++) {

a[i] = i;

b[i] = i * 2;

}

// Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π½Π° GPU

cudaMalloc((void **)&a_d, N * sizeof(int));

cudaMalloc((void **)&b_d, N * sizeof(int));

cudaMalloc((void **)&c_d, N * sizeof(int));

// ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° GPU

cudaMemcpy(a_d, a, N * sizeof(int), cudaMemcpyHostToDevice);

cudaMemcpy(b_d, b, N * sizeof(int), cudaMemcpyHostToDevice);

// Запуск ядра

int threadsPerBlock = 256;

int blocksPerGrid = (N + threadsPerBlock β€” 1) / threadsPerBlock;

add<<<blocksPerGrid, threadsPerBlock>>>(a_d, b_d, c_d);

// ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π½Π° CPU

cudaMemcpy(c, c_d, N * sizeof(int), cudaMemcpyDeviceToHost);

// Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ²

for (int i = 0; i < 10; i++) {

printf("%d + %d = %d\n", a[i], b[i], c[i]);

}

// ОсвобоТдСниС памяти

free(a);

free(b);

free(c);

cudaFree(a_d);

cudaFree(b_d);

cudaFree(c_d);

return 0;

}

πŸ”§ ΠžΡ‚Π»Π°Π΄ΠΊΠ° ΠΈ оптимизация CUDA-ΠΊΠΎΠ΄Π°

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ CUDA: NVIDIA Nsight ΠΈ CUDA-GDB ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ инструмСнты для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΊΠΎΠ΄Π° CUDA.
  • ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ инструмСнты профилирования, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ NVIDIA Nsight Systems ΠΈ NVIDIA Visual Profiler, для Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠ΄Π°.
  • ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ использования памяти: ΠœΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ CPU ΠΈ GPU ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ асинхронныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ памяти.
  • Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ использованиС Π±Π»ΠΎΠΊΠΎΠ² ΠΈ Π½ΠΈΡ‚Π΅ΠΉ: ΠŸΠΎΠ΄Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ количСство Π±Π»ΠΎΠΊΠΎΠ² ΠΈ Π½ΠΈΡ‚Π΅ΠΉ для вашСй Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ обСспСчСния.

πŸš€ Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

CUDA β€” это ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт для ускорСния вычислСний, Π½ΠΎ Π΅Π³ΠΎ освоСниС Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ усилий. πŸ’ͺ НачнитС с изучСния основ CUDA ΠΈ постСпСнно ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ ΠΊ Π±ΠΎΠ»Π΅Π΅ слоТным концСпциям.

πŸš€ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π° ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ NVIDIA, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π»ΡƒΠ±ΠΆΠ΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ CUDA ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ прилоТСния.

❓ Часто Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ вопросы (FAQ)

  • Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ CUDA?

CUDA (Compute Unified Device Architecture) β€” это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ-аппаратная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… вычислСний, разработанная NVIDIA. Она позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ графичСскиС процСссоры (GPU) для ускорСния вычислСний ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния.

  • КакиС Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ CUDA?

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ соврСмСнных Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚ NVIDIA GeForce, Quadro ΠΈ Tesla ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ CUDA. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ вашСй Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π½Π° сайтС NVIDIA.

  • Π§Π΅ΠΌ CUDA отличаСтся ΠΎΡ‚ OpenCL?

CUDA β€” это проприСтарная тСхнология NVIDIA, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ OpenCL β€” это ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ стандарт. CUDA ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ обСспСчиваСт Π±ΠΎΠ»Π΅Π΅ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚Π°Ρ… NVIDIA, Π½ΠΎ OpenCL Π±ΠΎΠ»Π΅Π΅ кроссплатформСнный.

  • Π“Π΄Π΅ Π½Π°ΠΉΡ‚ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ CUDA?

Полная докумСнтация ΠΏΠΎ CUDA доступна Π½Π° сайтС NVIDIA: https://developer.nvidia.com/cuda-toolkit-documentation.

  • Π“Π΄Π΅ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π° CUDA?

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π° CUDA ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² составС CUDA Toolkit, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π° сайтС NVIDIA ΠΈ Π½Π° GitHub.

Π’Π²Π΅Ρ€Ρ