Согласно «Руководству по оптимальным методам OpenCL» от nVidia,
Совместно используемая память содержит параметры или аргументы, которые передаются ядрам при запуске.
У меня есть ядро с довольно длинным списком аргументов, которому нужна вся доступная локальная память (48 КБ).В Linux, CUDA10 и Tesla P100 я сталкиваюсь с проблемой вторжения аргументов ядра в локальную память (но по какой-то причине только для списков аргументов из 3 или более указателей и только для 4 байтов независимо от количества аргументов);это не происходит вообще на MacOS с установленной платформой CUDA10 и драйвером nVidia.
В любом случае, предлагаемое руководство решение -
В ядрах с длинными списками аргументовможет быть полезно поместить некоторые аргументы в постоянную память (и ссылаться на них там), а не использовать разделяемую память.
Проблема в том, что все мои аргументы являются указателями, и, кажется, невозможно получить адрес GPU-буфера в OpenCL стандартными средствами.Единственное решение, которое я могу придумать, - запустить маленькое ядро, сохранив все необходимые указатели в некоторой структуре, а затем использовать его в качестве единственного аргумента для основного ядра (возможно, пометив его как __constant
).Это похоже на хак, и я подозреваю, что физический адрес буфера может быть изменен драйвером OpenCL в любое время.
Есть ли лучший обходной путь?Возможно, можно как-то отключить хранение аргументов в локальной памяти?