Максимальное количество инструкций GLSL

Есть ли максимальное количество инструкций языка ассемблера для загрузки в блок фрагмента программы? У меня есть алгоритм для переноса с процессора на gpu и, по-видимому, он не подходит для gpu.

Ответы

Ответ 1

Существует несколько жестких и мягких ограничений, некоторые из которых не сразу очевидны:

  • Слоты для команд: общее количество инструкций, которые аппаратное обеспечение может размещать в локальной памяти.
  • Выполненные инструкции: максимальное количество команд, которые будут выполняться (включая инструкции, которые выполняются несколько раз в цикле)
  • Одна инструкция GLSL может отображать до десятков или более инструкций
  • Несколько инструкций GLSL могут отображать одну команду в зависимости от качества оптимизатора (например, multiply-add, dot, lerp)
  • Ограниченные временные регистры (только 32) могут потребовать больше инструкций, чем необходимо для аппаратного обеспечения до SM4 (нет такой проблемы с 4096).
  • Swizzling обычно не требует дополнительных инструкций в настоящее время, но работает на некоторых старых аппаратных средствах и может в некоторых ситуациях на некоторых аппаратных средствах (например, gl_FragColor - такой кандидат).
  • Независимо от фактических инструкций, совместимое с OpenGL 2.0 оборудование ограничено 8 зависимыми выборками текстур (неограниченное на оборудовании, которое может работать с OpenGL 2.1 или выше).

У вас есть эти гарантированные минимумы (у большинства карт больше):

  • 512 слотов для вершинных и пиксельных шейдеров на оборудовании, совместимом с OpenGL 2.x(SM3)
    • 65536 выполненных инструкций
  • 4096 вершин и 65536 пиксельных шейдерных слотов для команд на оборудовании 3.x(SM4)
    • 65536 Выполненные инструкции вершинного шейдера, неограниченные инструкции пиксельных шейдеров
  • Не менее 24 динамических ветвей возможно на оборудовании 2.x(SM3)
  • Полностью динамическое ветвление (без ограничений) на оборудовании SM4.
  • Только условное перемещение доступно на SM2.x, все остальное должно быть выполнено путем дублирования кода и разворачивания цикла или должно завершиться неудачно.

Ответ 2

Существует ограничение на максимальное количество инструкций, которые может иметь шейдер. Насколько мне известно, он варьируется от GPU до GPU. Если ваш шейдер слишком велик, компиляция вызовет ошибку.