Я как раз собираюсь приступить к преобразованию программы, которую я написал, в CUDA, чтобы, надеюсь, увеличить скорость обработки.
Теперь очевидно, что моя старая программа выполняет множество функций одну за другой, и я разделил эти функции в своей основной программе и вызываю каждую по порядку.
void main ()
{
*initialization of variables*
function1()
function2()
function3()
print result;
}
Эти функции по своей сути являются последовательными, поскольку функция2 зависит от результатов функции1.
Итак, теперь я хочу преобразовать эти функции в ядра и выполнять задачи в функциях параллельно.
Это так же просто, как переписать каждую функцию параллельно, а затем в моей основной программе вызывать каждое ядро одно за другим?Это медленнее, чем должно быть? Например, могу ли я напрямую выполнить следующую параллельную операцию на моем графическом процессоре, не возвращаясь к ЦП для инициализации следующего ядра?
Очевидно, что я буду хранить все переменные времени выполнения в памяти графического процессора, чтобы ограничить объем передаваемых данных, поэтому должен ли я даже беспокоиться о времени, которое требуется между вызовами ядра?
Я надеюсь, что этот вопрос ясен, если нет, пожалуйста, попросите меня уточнить. Спасибо.
И вот дополнительный вопрос, чтобы я мог проверить свое здравомыслие. В конечном итоге ввод этой программы представляет собой видеофайл, и благодаря различным функциям каждый кадр приводит к результату. Мой план состоит в том, чтобы захватить несколько кадров за раз (, скажем, 8 уникальных кадров ), а затем разделить общее количество блоков, которые у меня есть, между этими 8 кадрами, и тогда несколько потоков в блоках будут выполнять еще больше параллельных операций. на данных изображения, таких как сложение векторов, преобразование Фурье и т. д.
Это правильный подход к проблеме?