Я хочу использовать разделяемую память между вызовом ядра одного ядра. Могу ли я использовать общую память между вызовом ядра?Как использовать общую память между вызовом ядра CUDA?
ответ
Нет, вы не можете. Общая память имеет жизненный цикл блока резьбы. Переменная, хранящаяся в ней, может быть доступна всем нитям, принадлежащим одной группе, во время одного вызова функции .
Попытайтесь заблокировать страницу, но скорость должна быть намного медленнее, чем графическая память. cudaHostAlloc (void ** ptr, size_t size, cudaHostAllocMapped); , затем отправьте ptr на код ядра.
Раньше вы могли сделать это нестандартным способом, когда у вас будет уникальный идентификатор для каждого блока разделяемой памяти, а следующее ядро проверяет идентификатор и, следовательно, выполняет требуемую обработку в этом блоке разделяемой памяти. Это было трудно реализовать, так как вам нужно было обеспечить полное заполнение каждого ядра и иметь дело с различными угловыми случаями. Кроме того, без официальной поддержки вы не полагаетесь на совместимость между вычислительными устройствами и версиями cuda.
Общая память имеет продолжительность жизненного цикла блока, а не область ядра. – talonmies
@talonmies, Спасибо! Извините, я имею в виду то же самое, но ошибался в терминологии. Я имею в виду, что вместо глобальной памяти (на самом деле, пока вы не вызываете cudaFree), нет способа получить переменную между глобальными вызовами функций. – geek