«Автоматическое отображение Фортран-программ на графический процессор»



бет6/7
Дата19.07.2016
өлшемі1.18 Mb.
#209881
түріДипломная работа
1   2   3   4   5   6   7

5.2 Оценка производительности

Одна из главных характеристик, которые необходимо получить в данном исследовании – суммарное время исполнения всех построенных функций-ядер. Таким образом, суммарное время выполнения всех ядровых функций:


T =  (14)
где T(Ki) – время работы i-й функции, Ri – количество запусков данной ядровой функции, mобщее количество ядровых функций.
Ri = num_launches * Si (15)
где num_launches – количество запусков вычислительной решётки блоков, необходимое для вычисления значений функции-ядра, а Siколичество запусков i-й ядровой функции в исходном алгоритме.
При этом общее время выполнения программы:
T0 = T + Trenew (16)
где Tсуммарное время выполнения всех функций ядер, а Trenew время, затраченное на обмен значениями между глобальной памятью ускорителя и хостом.
Trenew = (17)
где Vj объём обновляемой информации для j-го региона, а outer_bandwidthэффективная пропускная способность коммуникационной сети между ускорителем и хостом.

5.2.1 Внешний параллелизм

При запуске вычислительной решётки параллельная работа сохраняется на двух уровнях – между блоками вычислительной решётки и между нитями в каждом блоке. Внешним параллелизмом назовём максимальное количество блоков вычислительной решётки ядровой функции, запущенных в любой момент времени на каждом из потоковых мультипроцессоров ускорителя. Общее число блоков в решётке может быть сколь угодно большим, тогда как число запущенных блоков может быть ограничено в силу:




  • нехватки регистров на потовом мультипроцессоре;

  • нехватки разделяемой памяти;

  • превышения лимита активных варпов (т.е. одновременно исполняющихся на одном мультипроцессоре).

Пусть вычислительная решётка для i-й функции ядра содержит Ni блоков, из которых Pi способны быть вычислены одновременно.


Тогда, на основе [10]:
Число варпов в одном блоке:

warps_in_block = ceil (block_size / warp_size, 1), (18)
где block_size – размер блока в нитях, а warp_size – количество нитей в варпе.
Число регистров, используемых блоком:

regs_in_block =ceil(required_regs * warp_size, thread_alloc_gran)*warps_in_block (19)
где required_regs – вычислено при подсчёте использования ресурсов, thread_alloc_gran – кратное для округления количества регистров вверх. Округление производится на ускорителе в каждом варпе (согласно compute_capability 2.0). При этом если количество требуемых регистров превышает максимальное возможное число регистров на потоковом мультипроцессоре, то по исчерапании лимита регистров последующие обращения к переменным (не загруженным на регистры) трактуются как обращения в глобальную память ускорителя. В таком случае предиктор считает, что на потоковом мультипроцессоре заняты все регистры, и увеличивает число транзакций в глобальную память. Если произошло обращение к переменной, адресующей массив, то будет производиться анализ выровненности доступа, иначе – доступ считается невыровненным.
Объём в байтах разделяемой памяти:

shmem_in_block = ceil (required_shared_mem, 512) (20)
Ограничение внешнего параллелизма по числу варпов:

warp_limit = max_warps_per_sm / warps_in_block (21)
Ограничение внешнего параллелизма по числу регистров:

reg_limit = max_regs_per_sm / regs_in_block (22)
Ограничение внешнего параллелизма по объёму разделяемой памяти:

mem_limit = shmem_per_sm / shmem_in_block (23)
Внешний параллелизм:

Pi = min (max_blocks_per_sm, warp_limit, reg_limit, mem_limit) (24)

Исследования [10] показывают, что задержку на переключения контекста блоков можно считать малой, поэтому вводится линейная модель – считается, что для каждого переключения необходимо некоторое количество тактов ожидания (параметр switch_latency). Тогда в общем затраты по переключению оцениваются, как произведение количества переключений на эту задержку в тактах.

Итого, время выполнения i-й ядровой функции:
T(Ki) =  * (C(Ki) + Sync(Ki)) + Pi*switch_latency (25)
где C(Ki) – это время работы одного мультипроцессора над Pi одновременно запущенными на нём блоками, а Sync(Ki) – затраты на синхронизацию.

5.2.2 Внутренний параллелизм

Потоковый мультипроцессор исполняет инструкции на уровне варпов (группа из 32 нитей). Все варпы активных блоков формируют очередь на исполнение. На каждом новом цикле, планировщик инструкций (два планировщика, начниная с архитектуры Fermi) выбирает очередную инструкцию из некоторого варпа и исполняет её над всеми нитями этого варпа. Задержка в тактах на исполнение инструкции зависит от её типа. Особенно большие задержки вызывают операции с глобальной памятью. До получения результатов операции планировщик не имеет права выбирать на запуск следующую инструкцию из данного варпа, зато присутствует возможность выбора инструкции из прочих варпов, представленных к исполнению.

Принцип сокрытия задержек одних команд выполнением других – это фундаментальный подход, благодаря которому удаётся существенно повысить интенсивность использования аппаратных ресурсов ускорителя. Если бы он не соблюдался, загруженность ускорителя была бы низкой, а запуск программы – неэффективным.

В значительной степени эффективность определяется тем, насколько хорошо удаётся совмещать вычислительные инструкции и ожидание данных из памяти ускорителя. Вслед за работой [10] вводятся следующие основные характеристики:




  1. Внутренний параллелизм по обращениям к памяти (MWP).

  2. Внутренний параллелизм по вычислениям (CWP).


Внутренним параллелизмом по обращениям к памяти (MWP) будем называть максимальное число активных варпов, которые могут осуществить одновременный доступ к глобальной памяти ускорителя за один период ожидания обмена. Периодом ожидания обмена называется число тактов, прошедших с момента выдачи мультипроцессором инструкции обмена с глобальной памятью до завершения поступления данных для всех нитей в варпе, выдавшем инструкцию. MWP показывает, какое количество варпов успеет совершить взаимодействие с памятью, пока не будет полностью обслужен первый выдавший инструкцию обмена. Таким образом MWP характеризует степень сокрытия задержки операции с памятью. Очевидно, MWP ограничен пропускной способностью памяти и количеством активных варпов на мультипроцессоре. Также влияние на MWP оказывают задержки между двумя соседними обращениями в память (отличаются для выровненного и невыровненного доступа).
Период ожидания обмена для выровненного доступа:

mem_l_coal = glob_mem_latency (26)
равен числу тактов, требуемых для обслуживания одной транзакции [12].

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


Период ожидания обмена для невыровненного доступа:

mem_l_uncoal = glob_mem_latency + (uncoal_per_access – 1)*delay_uncoal (27)
Для вычисления среднего значения периода ожидания вводится весовая модель, т.к. для всех запущенных варпов невозможно оценить стоимость задержки и синхронизаций в тактах, основываясь на имеющихся в модели данных. Обозначим за Wcoal вес выровненного доступа в глобальную память, за Wuncoal – невыровненного. Тогда,
Wсoal =  (28)

Wuncoal = (29)

mem_l = mem_l_coal * Wcoal + mem_l_uncoal * Wuncoal (30)
Для вычисления минимальной средней задержки между двумя последовательными доступами в память была введена модель подсчёта средневзвешенного значения.

Минимальная задержка между двумя последовательными доступами в память:

departure_delay = (delay_uncoal * uncoal_per_access) * Wuncoal +

+ (delay_coal * coal_per_access) * Wcoal (31)
Значение средней задержки основано на величине задержки в случае выровненного (delay_coal) и невыровненного доступа (delay_uncoal), на их количестве.
Таким образом, с учётом вычисленной задержки, получаем максимально возможное число обслуживаемых варпов за один период обмена [10]:
Полный внутренний параллелизм по доступам в память:

mwp_full =  (32)
Данный показатель ограничивается пропускной способностью памяти и количеством активных варпов на мультипроцессоре.
Количество активных варпов – Vacti = Pi * warps_in_block (33)
Пропускная способность памяти, потребляемая каждым варпом:

bw_per_warp =  (34)
Ограничение MWP по пропускной способности:

mwp_bw_limit =  (35)
Итого, внутренний параллелизм по доступам в память (MWP):
MWP = min( mwp_max, mwp_bw_limit, Vact) (36)
Потоковый мультипроцессор за период ожидания обмена может выполнять арифметические операции других варпов. Причём, чем меньше арифметико-логических инструкций содержится в каждом из этих варпов, тем большее их количество будет обслужено. Внутренним параллелизмом по вычислениям (CWP) будем называть максимальное число активных варпов, инструкции которых могут быть выполнены мультипроцессором в течение периода ожидания обмена (при этом всегда учитывается варп, который ждёт получения результатов в течение периода обмена). Очевидно, что CWP, как и MWP, не может быть больше числа активных варпов.
Число тактов обслуживания арифметико-логических инструкций:

comp_cycles = (num_arithm* arithm_latency + num_reciproc * reciproc_latency) * * num_iter_per_thread (37)

Число тактов обслуживания операций с памятью:

mem_cycles = (mem_l_uncoal * uncoal_mem_access +

+ mem_l_coal * coal_mem_access) * num_iter_per_thread (38)

Внутренний параллелизм по вычислениям:

CWP = min (1 + , Vact) (39)
Будем называть вычислительным периодом число тактов, приходящихся на один период ожидания обмена:
comp_p =  (40)



Достарыңызбен бөлісу:
1   2   3   4   5   6   7




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет