Правильный способ написания функций ядра в CUDA?

Я как раз собираюсь приступить к преобразованию программы, которую я написал, в CUDA, чтобы, надеюсь, увеличить скорость обработки.

Теперь очевидно, что моя старая программа выполняет множество функций одну за другой, и я разделил эти функции в своей основной программе и вызываю каждую по порядку.

void main ()
{
  *initialization of variables*
  function1()
  function2()
  function3()
  print result;
}

Эти функции по своей сути являются последовательными, поскольку функция2 зависит от результатов функции1.

Итак, теперь я хочу преобразовать эти функции в ядра и выполнять задачи в функциях параллельно.

Это так же просто, как переписать каждую функцию параллельно, а затем в моей основной программе вызывать каждое ядро ​​одно за другим?Это медленнее, чем должно быть? Например, могу ли я напрямую выполнить следующую параллельную операцию на моем графическом процессоре, не возвращаясь к ЦП для инициализации следующего ядра?

Очевидно, что я буду хранить все переменные времени выполнения в памяти графического процессора, чтобы ограничить объем передаваемых данных, поэтому должен ли я даже беспокоиться о времени, которое требуется между вызовами ядра?

Я надеюсь, что этот вопрос ясен, если нет, пожалуйста, попросите меня уточнить. Спасибо.

И вот дополнительный вопрос, чтобы я мог проверить свое здравомыслие. В конечном итоге ввод этой программы представляет собой видеофайл, и благодаря различным функциям каждый кадр приводит к результату. Мой план состоит в том, чтобы захватить несколько кадров за раз (, скажем, 8 уникальных кадров ), а затем разделить общее количество блоков, которые у меня есть, между этими 8 кадрами, и тогда несколько потоков в блоках будут выполнять еще больше параллельных операций. на данных изображения, таких как сложение векторов, преобразование Фурье и т. д.
Это правильный подход к проблеме?

7
задан Panos Kal. 9 August 2017 в 04:33
поделиться