2012-04-16 5 views
1

Я пытаюсь обработать массив больших структур с CUDA 2.0 (NVIDIA 590). Я хотел бы использовать для этого разделяемую память. Я экспериментировал с калькулятором занятости CUDA, пытаясь выделить максимальную общую память на поток, так что каждый поток может обрабатывать весь элемент массива. Однако максимум (разделяемая память на блок)/(потоки на блок), который я могу видеть в калькуляторе со 100% нагрузкой на мультипроцессор, составляет 32 байта, чего недостаточно для одного элемента (на порядок величины). Максимальное возможное значение 32 байта (разделяемая память на блок)/(потоки на блок)? Можно ли указать, какой alter4native предпочтительнее - выделить часть массива в глобальной памяти или просто использовать недогруженный многопроцессор? Или это может быть решено только экспериментом? Еще одна альтернатива, которую я вижу, - это обработать массив в несколько проходов, но это выглядит как последнее средство. Это первый раз, когда я пытаюсь что-то действительно сложное с CUDA, поэтому я мог бы пропустить некоторые другие варианты ...Максимум (разделяемая память на блок)/(потоки на блок) в CUDA со 100% загрузкой MP

ответ

6

Существует множество ограничений по оборудованию, которые необходимо учитывать при разработке ядра 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

Единственный реальный способ убедиться, что вы используете дизайн ядра, который дает лучшую производительность, - это проверить все возможности. И вам нужно повторить это тестирование производительности для каждого типа устройства, на котором вы его запускаете, потому что у всех они имеют разные ограничения. Это, очевидно, может быть утомительным, особенно когда разные шаблоны проектирования приводят к принципиально различным ядрам. Я обойду это в некоторой степени, используя механизм шаблонов для динамического генерации ядер во время выполнения в соответствии с техническими характеристиками устройства, но это все равно немного хлопот.

+0

Спасибо, эта лекция в значительной степени ответила на мое задание – mirror2image