Skip to content

Ускорение векторных операций с помощью SIMD#24

Merged
netkeep80 merged 4 commits intonetkeep80:mainfrom
konard:issue-23-04bc443dadad
Jan 28, 2026
Merged

Ускорение векторных операций с помощью SIMD#24
netkeep80 merged 4 commits intonetkeep80:mainfrom
konard:issue-23-04bc443dadad

Conversation

@konard
Copy link
Contributor

@konard konard commented Jan 28, 2026

Описание

Реализованы SIMD-оптимизированные версии базовых векторных операций (сложение, вычитание, умножение) для ускорения обучения нейросети согласно issue #23.

Поддерживаемые наборы инструкций

В порядке приоритета:

  1. AVX (256-bit) - 8 float за операцию
  2. SSE (128-bit) - 4 float за операцию
  3. Скалярный код - fallback для систем без SIMD

Изменения

Новые файлы:

  • include/simd_ops.h - SIMD-оптимизированные векторные операции
  • cmake/test_simd_benchmark.cmake - тест SIMD оптимизаций
  • experiments/test_simd_speedup.sh - скрипт измерения ускорения
  • experiments/test_simd_micro.cpp - микро-бенчмарк операций

Изменённые файлы:

  • main.cpp - операции op_1 - op_4 теперь используют SIMD, добавлен флаг --no-simd
  • CMakeLists.txt - опции для включения SIMD (-march=native для GCC/Clang, /arch:AVX2 для MSVC)

Использование

# Автоматическое определение SIMD (по умолчанию)
./NNets -c configs/benchmark.json -b

# Отключение SIMD для сравнения
./NNets -c configs/benchmark.json -b --no-simd

Результаты микро-бенчмарка

Size Op Scalar (ns) SIMD (ns) Speedup
16 ADD 2.98 2.09 1.43x
16 MUL 3.68 1.79 2.05x
48 ADD 4.32 3.48 1.24x
48 MUL 4.68 3.31 1.42x
256 SUB 20.94 14.75 1.42x
1000 SUB 80.46 58.65 1.37x

Примечание об ускорении обучения

Ускорение обучения нейросети составляет ~1-5% из-за того, что:

  1. Векторные операции вызываются с небольшими размерами (количество образов)
  2. Значительная часть времени уходит на генерацию случайных чисел и управление нейронами

Однако SIMD-оптимизации закладывают основу для будущего масштабирования на большие датасеты.

Тесты

Все 9 тестов проходят успешно:

  • ✅ test_simple_classification
  • ✅ test_default_classification
  • ✅ test_benchmark_training_speed
  • ✅ test_model_save_load
  • ✅ test_extended_classification
  • ✅ test_multithreading_benchmark
  • ✅ test_verify_mode
  • ✅ test_retraining_mode
  • ✅ test_simd_optimization (новый)

Test plan

  • Локальная сборка с CMake
  • Все существующие тесты проходят
  • SIMD детектируется и включается автоматически
  • Флаг --no-simd работает корректно
  • Микро-бенчмарк показывает ускорение операций
  • CI на Linux/Windows/macOS

Fixes #23


🤖 Generated with Claude Code

konard and others added 2 commits January 28, 2026 10:58
Adding CLAUDE.md with task information for AI processing.
This file will be removed when the task is complete.

Issue: netkeep80#23
Реализованы SIMD-оптимизированные версии базовых векторных операций
(сложение, вычитание, умножение) с поддержкой AVX (256-bit) и SSE (128-bit).

### Изменения:

1. **Новый файл `include/simd_ops.h`**:
   - AVX-версии операций (обработка 8 float за раз)
   - SSE-версии операций (обработка 4 float за раз)
   - Скалярные версии (fallback)
   - Автоматический выбор оптимальной реализации на этапе компиляции
   - Runtime-флаг UseSIMD для отключения SIMD

2. **Обновлён `main.cpp`**:
   - Операции op_1 - op_4 теперь используют SIMD-версии
   - Добавлен флаг --no-simd для отключения SIMD
   - Вывод информации о SIMD в benchmark режиме

3. **Обновлён `CMakeLists.txt`**:
   - Опция ENABLE_SIMD_NATIVE для автоопределения CPU
   - Опции ENABLE_AVX и ENABLE_SSE для явного указания
   - Флаг -march=native для GCC/Clang по умолчанию
   - Флаг /arch:AVX2 для MSVC по умолчанию

4. **Добавлен тест `cmake/test_simd_benchmark.cmake`**:
   - Проверка работы с включённым SIMD
   - Проверка работы флага --no-simd

5. **Добавлены эксперименты**:
   - `experiments/test_simd_speedup.sh` - сравнение с/без SIMD
   - `experiments/test_simd_micro.cpp` - микро-бенчмарк операций

### Результаты микро-бенчмарка:

| Size | Op  | Scalar | SIMD  | Speedup |
|------|-----|--------|-------|---------|
| 16   | MUL | 3.68ns | 1.79ns| 2.05x   |
| 48   | MUL | 4.68ns | 3.31ns| 1.42x   |
| 256  | SUB | 20.94ns| 14.75ns| 1.42x  |

### Тесты:
Все 9 тестов проходят успешно.

Fixes netkeep80#23

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@konard konard changed the title [WIP] Ускорение векторных операций с плавающей точкой Ускорение векторных операций с помощью SIMD Jan 28, 2026
Служебный файл для AI-ассистента больше не нужен.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@konard konard marked this pull request as ready for review January 28, 2026 10:10
@konard
Copy link
Contributor Author

konard commented Jan 28, 2026

🤖 Solution Draft Log

This log file contains the complete execution trace of the AI solution draft process.

💰 Cost estimation:

  • Public pricing estimate: $5.766900 USD
  • Calculated by Anthropic: $4.031493 USD
  • Difference: $-1.735407 (-30.09%)
    📎 Log file uploaded as Gist (937KB)
    🔗 View complete solution draft log

Now working session is ended, feel free to review and add any feedback on the solution draft.

@netkeep80 netkeep80 merged commit 2970d34 into netkeep80:main Jan 28, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Ускорение векторных операций с плавающей точкой

2 participants