hyperion/10-linux/30-computer-arch/GPU CPU.md

50 lines
No EOL
6.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Ты абсолютно прав насчет того, что GPU — это "много слабых процессоров", но твои догадки про отсутствие кэша и памяти не совсем верны. Давай разберем "кишочки" архитектурно, используя правильные термины.
Главное отличие можно описать одной фразой: **CPU оптимизирован под Latency (задержку), а GPU — под Throughput (пропускную способность).**
### 1. Архитектура кристалла (Die Layout)
Если посмотреть на фото кристалла под микроскопом, разница бросается в глаза:
* **CPU:** Огромную часть площади занимает **Control Unit** (блок управления) и **Кэш** (L1/L2/L3). Сами вычислительные блоки (**ALU** — Arithmetic Logic Unit) занимают меньшую часть места.
* *Зачем:* CPU — это менеджер-бюрократ. Его задача — выполнять сложные, запутанные инструкции, где много условий `if/else`. Он тратит миллиарды транзисторов на **Branch Prediction** (предсказание ветвлений) и **Out-of-Order Execution** (внеочередное исполнение), чтобы угадать, какую инструкцию ты захочешь выполнить следующей, пока текущая еще считается.[3][5]
* **GPU:** Почти весь кристалл забит тысячами мелких **ALU**. Control Unit крошечный и тупой.
* *Зачем:* GPU — это армия рабочих. Им не нужно гадать. Им дают команду: "Умножь эти 10 миллионов чисел на 2". Им не нужен сложный менеджмент, им нужна грубая сила.[1]
### 2. SIMD и "Проблема ветвлений"
Это, пожалуй, самое главное "кишечное" отличие.
* **CPU (SISD/MIMD):** Каждое ядро может делать что-то свое. Одно ядро играет музыку, другое считает физику.
* **GPU (SIMT - Single Instruction, Multiple Threads):**
Ядра GPU сгруппированы в "пачки" (у NVIDIA это называется **Warp**, обычно 32 потока).
* **Как это работает:** Блок управления посылает **одну** инструкцию сразу на 32 ядра. Все 32 ядра *обязаны* сделать одно и то же действие, но с разными данными.
* **Где GPU умирает:** Если ты напишешь код с условием `if (x > 0) { do_A() } else { do_B() }`, и внутри одного варпа у половины потоков `x > 0`, а у другой нет, происходит **Warp Divergence**. Сначала половина ядер делает `do_A`, пока вторая половина *простаивает и ждет*, а потом наоборот. Производительность падает в разы. CPU такие ветвления щелкает как орешки.[6][3]
### 3. Миф про память и кэш
Твое предположение, что у GPU нет кэша и он не работает с памятью — **неверно**.
* **Память (VRAM):** У GPU есть свой контроллер памяти, и он *намного* мощнее, чем у CPU.
* Шина данных CPU: узкая (64-128 бит), но с низкой задержкой.
* Шина данных GPU: огромная (128-384 бит и более, память GDDR6X). Это широченная труба. GPU может прокачивать терабайты данных в секунду.
* **Кэш:** У GPU есть кэши L1 и L2, и даже Shared Memory (управляемый вручную кэш). Просто они работают иначе. Они нужны не для того, чтобы хранить данные долго (как у CPU), а чтобы "склеивать" (coalescing) запросы. Если 32 потока просят 32 соседних байта из памяти, GPU объединит их в один запрос. Если они просят данные вразнобой — GPU "захлебнется".[5][6]
### 4. Ответ на Rust-часть: "Графический инжиниринг"
Ты правильно уловил суть. Когда ты пишешь на Rust под GPU (будь то `wgpu` для графики или `burn`/`candle` для ML), ты занимаешься **оркестрацией**:
1. **Host Code (CPU/Rust):** Ты подготавливаешь данные, загружаешь текстуры/веса в VRAM (через шину PCIe) и формируешь **Command Buffer** (список команд).
2. **Device Code (Shader/Kernel):** Ты пишешь (или библиотека генерирует) маленькие программы (шейдеры на WGSL/GLSL или ядра CUDA), которые загружаются на GPU.
3. **Dispatch:** Ты с CPU пинаешь GPU: "Выполни вот этот шейдер 1 миллион раз".
Твое взаимодействие "напрямую с видеокартой" заключается в правильном управлении памятью и создании таких структур данных, чтобы тысячи глупых ядер GPU могли читать их линейно, не прыгая по памяти (иначе потеряешь всю мощь).
**Итог:** GPU — это не просто много слабых CPU. Это архитектура, где пожертвовали *управлением* и *логикой* ради *математической плотности* и *ширины канала памяти*.
[1](https://aws.amazon.com/ru/compare/the-difference-between-gpus-cpus/)
[2](https://timeweb.cloud/blog/gpu-i-cpu-v-chem-raznica)
[3](https://habr.com/ru/companies/otus/articles/844260/)
[4](https://tproger.ru/articles/gpu-protiv-cpu--chto-nuzhno-znat-dlya-raboty-s-ii-v-2025)
[5](https://www.cloud4y.ru/blog/cpu-gpu-what-is-the-difference/)
[6](https://www.ittelo.ru/news/cpu-i-gpu-v-chem-raznitsa/)
[7](https://oblakoru.ru/blogs/cpu-i-gpu-v-chem-raznicza-i-chto-vybrat/)
[8](https://www.fastvideo.ru/blog/cpu-vs-gpu-fast-image-processing.htm)
[9](https://mws.ru/blog/cpu-i-gpu-v-chem-otlichie/)
[10](https://www.youtube.com/watch?v=R_9B_DCe1-E)