2012-06-12 4 views
4

Я новичок в OpenCL, только что начал учиться. Я хотел знать, можно ли выполнить несколько потоков на графическом процессоре и оставшиеся потоки на процессоре? Другими словами, если я запускаю 100 потоков и предполагаю, что у меня 8-ядерный процессор, возможно ли, что 8 потоков из 100 потоков будут выполняться на процессоре, а оставшиеся 92 потока будут выполняться на GPU? Может ли OpenCL помочь мне выполнить эту работу? гладко?Использовать графический процессор и процессор с умом

+1

Нет, это совсем не так, как работает OpenCL. – talonmies

+0

Ohh ... @ talonmies, так как я могу достичь такой работы? С Pthreads на стороне хозяина? –

ответ

0

OpenCL код компилируются во время выполнения для выбранного устройства (CPU, модель GPU)

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

+0

несколько связанных вопросов можно найти здесь http://stackoverflow.com/questions/3245592/is-possible-to-span-an-opencl-kernel-to-run-concurrently-on-cpu-and-gpu?rq= 1 .... но я не могу четко понять это. –

2

Вы можете использовать несколько устройств openCL для работы над вашим алгоритмом, но необходимо распределить нагрузку достаточно тонко, чтобы работа на устройствах была сбалансирована должным образом, или же накладные расходы могут ухудшить производительность ,

Это ясно говорится в AMD OpenCL Programming Guide section 4.7 об использовании нескольких устройств OpenCL, так что мой ответ, да, вы можете разделить работы быть выполнен с несколькими устройствами, плавно, тогда и только тогда, когда вашего алгоритм планирования является достаточно умный, чтобы сбалансировать все это.

+0

Я работаю с графическими процессорами nVIDIA, и я думаю, этот трюк также может работать со своими GPU? –

+0

Да, вы можете. Но, как я уже сказал, только если у вас хороший алгоритм планирования, и, кстати, есть много переменных, которые вы должны учитывать, чтобы сделать хороший, например, накладные расходы на память, использование разделяемой памяти, насколько велик ваш регистр ядра, все из них повлияет на планировщик баланса нагрузки. – ardiyu07

+0

Обратите внимание, что очень легко перегрузить ваш процессор. Вы ДОЛЖНЫ избежать этого, иначе ваш GPU останется без работы большую часть времени, потому что процессор занят вычислением и не может обрабатывать события. Посмотрите на отличную статью о [Device Fisson от Intel] (http://software.intel.com/en-us/articles/opencl-device-fission-for-cpu-performance/) – Kentzo

5

Я хотел знать, можно ли выполнить несколько потоков на графическом процессоре и оставшиеся потоки на процессоре?

Да

Другими словами, если я запускаю 100 потоков и предположим, что я 8 ядра процессора, то возможно, что 8 потоков из 100 потоков будет выполняться на CPU и остальные 92 темы будет работать на GPU?

Нет. Это описание предполагает, что вы будете рассматривать GPU & CPU как единый вычислительный ресурс. Вы не можете этого сделать.

Это не значит, что вы не можете работать с одной и той же задачей.

  • Графический процессор и ЦП будут считаться отдельными устройствами OpenCL.
  • Вы можете написать код, который может разговаривать с несколькими устройствами.
  • Вы можете скомпилировать одно и то же ядро ​​для нескольких устройств.
  • Вы можете попросить несколько устройств выполнить работу одновременно.

... но ...

  • Ничего из этого не является автоматическим.
  • OpenCL не будет разделять один NDRange (или эквивалентный) вызов между несколькими устройствами.
  • Это означает, что вам придется планировать задачи между двумя устройствами самостоятельно.
  • Там будет довольно большое несоответствие скорости, поэтому для поддержания оптимальности потребуется больше, чем «92 здесь, 8 там».

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

+0

Иногда вы не можете распараллелить алгоритм, в этом случае процессор работает быстрее, чем GPU, поэтому я хотел бы дать такую ​​задачу процессору и позволить графическому процессору выполнять работу, которую он может сделать лучше. Я прочитал несколько исследований по поводу разницы в производительности между CUDA и OpenCL и обнаружил, что OpenCL НЕ работает лучше, чем CUDA, поэтому, помимо переносимости, стоит потратить некоторое время в OpenCL, чтобы получить выгоду от производительности? –

+0

Действительно, иногда алгоритм не имеет параллелизма для использования, поэтому его сохранение на ЦП имеет смысл, особенно если вы можете дать графическому процессору что-то еще. В терминах этой дискуссии CUDA vs OpenCL не имеет значения. –

Смежные вопросы