Должен ли я освободить указатели памяти устройства для них после выполнения сопоставления каждый раз и перераспределить (cudaMalloc ()) при следующем обратном вызове?
Вероятно, нет. Это может показаться ненужным и трудоемким.
Или есть более эффективный способ выделить память только один раз и использовать ее повторно?
Возможно. Например, вы можете определить максимально необходимый размер, выделить его, затем передать указатель на него в цикл обработки событий и повторно использовать выделение.
Функции обнаружения и сопоставления также используют такие объекты, как cudaResourceDesc и cudaTextureDesc, которые выходят из области действия в конце каждого выполнения и, следовательно, должны быть уничтожены. Должен ли я обращаться с ними любым другим конкретным способом?
Точно так же вы можете создавать их в большем объеме и передавать ссылки на них в вашу систему обработки событий. Тем не менее, я думаю, что основным потребителем времени здесь будет копирование данных для заполнения текстуры и привязка текстуры. Это должно быть повторено в любом случае (предположительно). Но если у вас есть базовое выделение для резервного хранилища для объекта текстуры, то вам, вероятно, не потребуется перераспределять его, см. Предыдущие комментарии.
Полагаю, мне нужна cudaDeviceSynchronize () после выполнения каждой из этих двух функций. Я прав?
Для меня не очевидно, что это необходимо. Вы не показали полный пример, но если в конце ваших функций есть копия данных с устройства на хост, этого, вероятно, будет достаточно. cudaMemcpy
является функцией блокировки. Если вы работаете в физически / логически объединенной ситуации с памятью, такой как TX1 / TX2, то да, вам может потребоваться точка синхронизации, чтобы убедиться, что данные действительны, прежде чем использовать их в коде хоста.
Могу ли я безопасно оставить «эталонные» дескрипторы в памяти графического процессора и обновлять их только тогда, когда это необходимо?
Не знаю, почему нет. Выделение, созданное с помощью cudaMalloc
, не «выходит из области видимости» до тех пор, пока не будет завершено приложение или явно не будет разрешено с помощью cudaFree
. Если вы копируете данные в такое распределение, они должны оставаться без изменений в течение всего срока действия вашего приложения, если только вы не перезаписаете их каким-либо образом (или не освободите базовое распределение).