2014-05-26 2 views
0

Я прочитал документацию и книги (также эти посты: OpenCL: query number of processing elements; Understanding work-items and work-groups; OpenCL: Work items, Processing elements, NDRange) о модели выполнения и теории о разделении данных с помощью NDrange.Как использовать NDrange на практике?

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

  2. Я хотел бы знать, как они работают и взаимодействуют на практике, для вычисления одномерного массива и для двумерного массива, такого как изображение.

ответ

1
  1. Хорошее разделение требует знания аппаратного обеспечения GPU. Например, давайте посмотрим на карты AMD, такие как Radeon 6970. Общее количество ядер - 1536. Они упакованы в 24 SIMD-устройства. Каждый блок состоит из 16 потоковых процессоров с архитектурой VLIW4. Итак, у нас есть 16 * 4 (из-за VLIW4) * 24 = 1536 ядер. Каждый SIMD-блок имеет некоторые ресурсы (кеши и т. Д.) Для всех ядер в нем. Следовательно, хороший размер для локальной группы в случае Radeon 6970 несколько кратен 64. Вы можете запросить свой OpenCL-устройство для количества вычислительных единиц. В нашем случае вы должны получить 24. Таким образом, для OpenCL на Radeon 6970 Computing Unit = SIMD Unit. Пожалуйста, учтите, что ручное разделение может привести к снижению производительности на устройствах различной архитектуры.

  2. Хороший пример местных групповых пособий можно найти на Nvidia developer zone. Взгляните на образец кода битной сортировки, который покажет вам, как использовать локальные группы.

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