Чтение хранилища общей / локальной памяти / банка загрузки конфликтует с аппаратными счетчиками для исполняемого файла OpenCL под Nvidia

#cuda #opencl #nvidia #performancecounter #bank-conflict

#cuda #opencl #nvidia #счетчик производительности #банк-конфликт

Вопрос:

Можно использовать nvprof для доступа / чтения счетчиков конфликтов в банке для CUDA exec:

 nvprof --events shared_st_bank_conflict,shared_ld_bank_conflict my_cuda_exe
  

Однако это не работает для кода, который использует OpenCL, а не код CUDA.

  • Есть ли какой-либо способ извлечь эти счетчики nvprof из среды OpenCL, возможно, непосредственно из ptx?
  • В качестве альтернативы, есть ли какой-либо способ преобразовать сборку PTX, сгенерированную компилятором nvidia OpenCL с использованием clGetProgramInfo with CL_PROGRAM_BINARIES , в ядро CUDA и запустить ее с помощью cuModuleLoadDataEx и, таким образом, иметь возможность использовать nvprof ?
  • Существует ли какой-либо серверный процессор моделирования, который позволяет устанавливать такие параметры, как размер банка и т. Д.?

Дополнительная опция:

  • Используйте конвертер opencl в код cuda, включающий функции, отсутствующие в CUDA, такие как vloadn / vstoren, float16 и другие различные средства доступа. #define работает только для простых ядер. Есть ли какой-либо инструмент, который его предоставляет?

Комментарии:

1. Можете ли вы передать PTX, созданный OpenCL cuModuleLoadDataEx ? Нет никакой гарантии, что одна и та же ptxas компиляция из PTX в SASS одинакова, но это разумное предположение. Возможные варианты ptxas могут отличаться от OpenCL и CUDA (например, правила округления). Нет никакой гарантии, что вы будете профилировать одни и те же программы, но, возможно, это хорошее приближение.

Ответ №1:

Есть ли какой-либо способ извлечь эти счетчики за пределы nvprof из среды OpenCL, возможно, непосредственно из ptx?

Нет. Этого нет ни в CUDA, ни в вычислительных шейдерах в OpenGL, DirectX или Vulkan.

В качестве альтернативы, есть ли какой-либо способ преобразовать сборку PTX, сгенерированную компилятором nvidia OpenCL, используя clGetProgramInfo с
CL_PROGRAM_BINARIES, в ядро CUDA и запустить ее с помощью
cuModuleLoadDataEx и, таким образом, иметь возможность использовать nvprof?

Нет. OpenCL PTX и CUDA PTX не совпадают и не могут использоваться взаимозаменяемо

Существует ли какой-либо серверный процессор моделирования, который позволяет устанавливать такие параметры, как размер банка и т. Д.?

Об этом я не знаю.

Комментарии:

1. «OpenCL PTX и CUDA PTX — это не одно и то же», конечно. Однако во многих случаях ядер, которые были скомпилированы как для CUDA (с определениями для таких вещей, как get_global_id), так и для OpenCL, PTX были очень-очень похожи, вплоть до небольших различий в заголовках. Таким образом, теоретически преобразование может быть возможным. Но нужно понять, как это сделать.

2. Вы спросили: «Есть ли какой-либо способ извлечь эти счетчики за пределы nvprof… возможно, непосредственно из ptx», и ответ на этот вопрос отрицательный, вы не можете манипулировать данными профилирования или получать доступ к ним из пользовательского кода. Есть некоторые открытые программистом счетчики триггеров, которые вы можете увеличить, и вы можете включать и выключать сбор данных профилирования, но это все

3. Награждение за ответ, но не принятие, поскольку я искал какое-либо направление / решение, и оно не было предоставлено.

4. Очень сложно предложить решение, когда его не существует. Если вы хотите заменить текущее положение дел своей собственной альтернативной реальностью, вы имеете на это полное право. Но вам нужно признать, что вы используете четвертый уровень compute API поставщика с точки зрения поддержки (после CUDA, вычислительных функций graphics API и API, управляемых компилятором), и вы не должны ожидать, что он будет выполнять больше, чем просто работать. Если вы привязаны к OpenCL, используйте другого поставщика. Если вы привязаны к NVIDIA, используйте CUDA. Это суровая реальность, нравится вам это или нет.