Я пытаюсь обработать массив больших структур с CUDA 2.0 (NVIDIA 590). Я хотел бы использовать для этого разделяемую память. Я экспериментировал с калькулятором занятости CUDA, пытаясь выделить максимальную общую память на поток, так что каждый поток может обрабатывать весь элемент массива. Однако максимум (разделяемая память на блок)/(потоки на блок), который я могу видеть в калькуляторе со 100% нагрузкой на мультипроцессор, составляет 32 байта, чего недостаточно для одного элемента (на порядок величины). Максимальное возможное значение 32 байта (разделяемая память на блок)/(потоки на блок)? Можно ли указать, какой alter4native предпочтительнее - выделить часть массива в глобальной памяти или просто использовать недогруженный многопроцессор? Или это может быть решено только экспериментом? Еще одна альтернатива, которую я вижу, - это обработать массив в несколько проходов, но это выглядит как последнее средство. Это первый раз, когда я пытаюсь что-то действительно сложное с CUDA, поэтому я мог бы пропустить некоторые другие варианты ...Максимум (разделяемая память на блок)/(потоки на блок) в CUDA со 100% загрузкой MP
ответ
Существует множество ограничений по оборудованию, которые необходимо учитывать при разработке ядра CUDA. Вот некоторые из ограничений, которые необходимо учитывать:
- максимальное количество потоков, которые Вы можете выполнить в одном блоке
- максимальное количество блоков, которые вы можете загрузить на потоковое мультипроцессорных сразу
- максимальное количество регистры в потоковом многопроцессорной
- максимальный объем разделяемой памяти в потоковом многопроцессорной
Какой бы из этих пределов вы попали первым становится ограничение, которое ограничивает ваш occu pancy (максимальная занятость, на что вы ссылаетесь на «100% многопроцессорную нагрузку»?). Как только вы достигнете определенного порога занятости, становится меньше внимания уделять занятости. Например, занятость 33% не означает, что вы сможете достичь 33% максимальной теоретической производительности графического процессора. Василий Волков дал большой резонанс на Технологической конференции GPU 2010 года, которая рекомендует не слишком беспокоиться о занятости и вместо этого пытаться минимизировать транзакции памяти, используя явные кеширующие трюки (и другие вещи) в ядре. Вы можете посмотреть разговор здесь: http://www.gputechconf.com/gtcnew/on-demand-GTC.php?sessionTopic=25&searchByKeyword=occupancy&submit=&select=+&sessionEvent=&sessionYear=&sessionFormat=#193
Единственный реальный способ убедиться, что вы используете дизайн ядра, который дает лучшую производительность, - это проверить все возможности. И вам нужно повторить это тестирование производительности для каждого типа устройства, на котором вы его запускаете, потому что у всех они имеют разные ограничения. Это, очевидно, может быть утомительным, особенно когда разные шаблоны проектирования приводят к принципиально различным ядрам. Я обойду это в некоторой степени, используя механизм шаблонов для динамического генерации ядер во время выполнения в соответствии с техническими характеристиками устройства, но это все равно немного хлопот.
Спасибо, эта лекция в значительной степени ответила на мое задание – mirror2image