Можно ли выгрузить функцию на графическую карту?

У меня есть многопоточное приложение C++, и я хочу повысить производительность и снизить общую загрузку ЦП с помощью Intel HD Graphics.

Я не использую CILK. (Приложение написано на чистом C++)

Я прочитал следующую ссылку: Как для передачи вычислений графической технологии Intel(R)

Но не нашел способа обрабатывать написанные функции или потоки на графической карте.

Является ли это возможным ? Есть ли способ использовать компилятор Intel для разгрузки функций (или потоков) в Intel HD Graphics?

Спасибо


person user3668129    schedule 27.04.2015    source источник
comment
Неявно (насколько я знаю). Вы должны вручную кодировать эти части самостоятельно (используя, например, CUDA или OpenCL или аналогичные фреймворки)   -  person Maghoumi    schedule 27.04.2015
comment
использование CUDA или OpenCL означает, что мне нужно перекодировать функции, которые я хочу разгрузить. Я хочу использовать тот же код и просто разгрузить функцию на видеокарту (с помощью компилятора Intel, как объяснено в предоставленной мной ссылке)   -  person user3668129    schedule 27.04.2015


Ответы (1)


Да, это возможно. Но это не просто.

Вы можете использовать CUDA, OpenCL или DirectCompute для того, что хотите, однако вам нужно написать параллельную версию вашей функции. Запуск «последовательной» функции на графическом процессоре определенно не интересен. Распараллеливание алгоритма может быть самой сложной задачей, базовые API-интерфейсы примерно одинаковы.

Я сочувствую этому:

  • код, который у вас есть, создан для (однопоточных) процессоров, поэтому является последовательным
  • код, который вы хотите, чтобы GPU запускал, должен быть параллельным

Я не знаю ни одного инструмента, способного распараллелить алгоритм.

person Synxis    schedule 27.04.2015
comment
Спасибо, но если я буду использовать графический процессор, я не могу использовать больше ядер (ядра процессора + ядра графического процессора), нет? (Поэтому последовательное многопоточное приложение может одновременно запускать больше потоков)... - person user3668129; 27.04.2015
comment
GPU и CPU не работают одинаково. Обычно не стоит разделять одну и ту же работу между процессором и графическим процессором, потому что для хороших параллельных алгоритмов графический процессор будет в 1000 раз быстрее, а для высокопоследовательных алгоритмов он даже не будет работать на графическом процессоре. - person Synxis; 27.04.2015
comment
Обратите внимание, что вы по-прежнему можете использовать GPU и CPU одновременно, но вам нужно спроектировать свое приложение для этого, т.е. определить, какая часть вашего приложения будет ускорена в GPU, а остальная часть — в CPU. - person Synxis; 27.04.2015
comment
Это именно то, что мне нужно: запустить часть (некоторые потоки) на процессоре, а другие потоки на графическом процессоре. (Примечание: я не использую параллельные алгоритмы). Итак, по ссылке, которую я добавил, я не могу найти способ, как это сделать... - person user3668129; 27.04.2015
comment
Это невозможно. Графический процессор должен выполнять только очень небольшие задачи. Кроме того, потоки на графическом процессоре более или менее синхронизированы, а это означает, что традиционный последовательный алгоритм (например, с условиями) будет очень неэффективным. И последнее, но не менее важное: вы не можете делиться памятью (это может измениться через несколько лет). - person Synxis; 27.04.2015
comment
Я просто подумал, что было бы неплохо уменьшить общую загрузку процессора (результаты команды top), перенеся некоторые задачи на GPU. - person user3668129; 27.04.2015