2012-04-26 2 views
0

Мое понимание различий между процессорами и графическими процессорами заключается в том, что графические процессоры не являются процессорами общего назначения, так что если видеокарта содержит 10 графических процессоров, каждый графический процессор использует один и тот же программный указатель и оптимизирует параллелизм на GPU Мне нужно обеспечить, чтобы каждый графический процессор фактически выполнял тот же код.OpenCL и несколько видеокарт

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

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

благодаря

ответ

2

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

Это неправда. Например, различные потоки на графическом процессоре могут выполняться в разное время из-за различий в латентности доступа к памяти. Вот почему в OpenCL есть примитивы синхронизации, такие как команда barrier. Вы никогда не можете предположить, что ваши потоки работают точно параллельно.

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

2

Я думаю, вы можете быть смущены тем, как потоки работают на графическом процессоре. Сначала рассмотрим проблему с несколькими GPU. Несколько графических процессоров НИКОГДА не используйте указатель программы, поэтому они почти никогда не будут заполнять ядро ​​одновременно.

На одном графическом процессоре гарантируется выполнение синхронизации только тех потоков, которые выполняются на одном и том же счетчике (или SM на языке NVIDIA) и являются частью одного и того же warp/wavefront. Вы никогда не можете рассчитывать на это, но для некоторых устройств компилятор может определить, что будет в этом случае (я специально думаю о некоторых устройствах AMD, если размер ворггруппы жестко запрограммирован до 64).

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

+0

Привет, Лукас, я могу быть смущен: o) .. Не могли бы вы прояснить один момент для меня. Когда вы ссылаетесь на GPU, это вычислительный блок на карте (CL_DEVICE_MAX_COMPUTE_UNITS с использованием clGetDeviceInfo) или же графический процессор относится к самой физической карте, которая может содержать множество вычислительных единиц? – mfc

+0

@mfc, графический процессор - это весь графический чип (карта). Графический процессор состоит из 1 или более вычислительных единиц. Каждый вычислительный блок состоит из нескольких элементов обработки (или ядер). Вы должны прочитать руководства по программированию от AMD, NVIDIA и Intel, чтобы убедиться, что вы хорошо понимаете архитектуру. –

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