Я провел простой эксперимент, реализовав наивный алгоритм поиска символов, выполняющий поиск 1 000 000 строк по 50 символов в каждой (карта 50 mil char) как на ЦП, так и на графическом процессоре (с использованием вычислительного конвейера iOS8 Metal).
Реализация CPU использует простой цикл, реализация Metal предоставляет каждому ядру 1 строку для обработки (исходный код ниже).
К моему удивлению, реализация Metal в среднем в 2-3 раза медленнее, чем простой линейный процессор (если я использую 1 ядро) и в 3-4 раза медленнее, если я использую 2 ядра (каждое из них просматривает половину базы данных)! Я экспериментировал с разными потоками для каждой группы (16, 32, 64, 128, 512), но все же получил очень похожие результаты.
Айфон 6:
CPU 1 core: approx 0.12 sec
CPU 2 cores: approx 0.075 sec
GPU: approx 0.35 sec (relEase mode, validation disabled)
Я вижу, что шейдер Metal тратит более 90% доступа к памяти (см. ниже).
Что можно сделать для его оптимизации?
Буду признателен за любую информацию, так как в Интернете не так много источников (кроме стандартных руководств по программированию Apple), предоставляющих подробную информацию о внутренних механизмах доступа к памяти и компромиссах, характерных для фреймворка Metal.
ДЕТАЛИ РЕАЛИЗАЦИИ МЕТАЛЛА:
Суть кода хоста: https://gist.github.com/lukaszmargielewski/0a3b16d4661dd7d7e00d
Код ядра (шейдера): https://gist.github.com/lukaszmargielewski/6b64d06d2d106d110126
Результаты профилирования захвата кадров GPU: