Хороший вопрос, и ответ зависит от того, что вам нужно с ним делать после. Позвольте мне объяснить.
Как только эта проблема может быть решена в O (n) (где n - длина ввода) на ЦП, вы будете страдать от выделения и копирования памяти (Хост -> Устройство (вход) и Устройство -> Хост (результат). )) недостатки. Это приведет к снижению производительности по сравнению с простым решением ЦП.
Даже если ваш массив уже находится в памяти устройства, каждый вычислительный блок должен считывать его в локальный или регистр (по крайней мере, для доступа к памяти устройства), и это не может быть выполнено значительно быстрее, чем на процессоре.
В целом CUDA хорошо ускоряет производительность, если:
Асимптотическая сложность вычислений высока по сравнению с длиной входных данных. Например, длина входных данных равна n, а сложность O (n ^ 2) или O (n ^ 3).
Существует способ разбить задачу на независимые или слабо зависимые подзадачи.
Так что, будь я на вашем месте, я бы не стал делать такие вычисления на CUDA, если это возможно. И если бы это была какая-то отдельная функция или преобразование выходного формата для какой-то другой функции, я бы сделал это в CPU.
Если это часть более сложного алгоритма, ответ будет более сложным. Если бы я был на вашем месте, я бы попытался как-то изменить формат [0,3,5]
, потому что это добавляет ограничения на использование вычислительных мощностей CUDA. Вы не можете эффективно разделить свою задачу на независимые блоки. Например, если я обработаю 10 целых чисел в одном вычислительном потоке и следующие 10 целых чисел в другом. Второй не знает, где разместить свои выводы, пока первый не закончен. Может быть, я разделю массив на подмассивы и сохраню ответ для каждого подмассива отдельно. Это сильно зависит от того, какие вычисления вы делаете.