Как правильно ускорить программу на GPU с использованием C++ AMP
Здравствуйте.
Пытаюсь реализовать EMMSP(extrapolation model most similar pattern) на GPU с использованием C++ AMP.
Суть алгоритма - перебор различных подпоследовательностей фиксированной длины из временного ряда. Простой перебор, просто распараллеливается, потоки работают независимо друг от друга. Данные (массив float от 18к до 1млн) загружены в общую память. Т.к. каждый поток работает со своим маленьким кусочком массива, я хотел загружать данные из глобальной памяти в более быструю блочную память, которая доступна не всем процессорам, а только тем, что находятся на одном блоке. Однако, на времени работы программы это никак не отразилось, при том, что согласно литературе блочная память работает в сотни раз быстрее глобальной и используется неоднократно при обработке данных.
У меня два объяснения этой ситуации: 1. я не правильно пользуюсь блочной памятью 2. каждый поток вычисляет регрессию, корреляцию между двумя кусками массива, при этом, очевидно, используются циклы, а значит и условные операторы, которые плохо влияют на производительность при работе с GPU. Вопрос: подскажите плз в чем может быть причина: 1, 2 или и то и другое, или что нибудь третье?
P.S.: если есть знающие C++ AMP отпишите плз, я прикреплю кусочек кода, максимально упрощенный, но демонстрирующий суть и используемые мной инструменты.
@Fesor, нет. Я просто выделяю массив данных в блочной памяти, затем в цикле копирую данные из глобальной в блочную. Даже если это не оптимальный вариант, он все равно должен быть быстрее, т.к. обращение к глобальной памяти происходит только 1 раз (условно говоря), тогда как в алгоритме эти данные используются много раз
@Perzh, по сути время доступа к блочной памяти должно быть сравнимо с временем доступа в регистры, глобальная же памяти очень медленна. А теперь представьте что вы можете ускорить копирование данных для блока в десять раз, и представьте что копирование данных занимает половину времени работы блока.
В любом случае рекомендую попробовать, как одно из основных средств оптимизации.
@Fesor, обязательно попробую, спасибо за совет. А что вы можете сказать по поводу циклов в ядре? Не получается ли так, что скорость упирается в множество циклов?