Как использовать постоянную память CUDA удобным для программиста способом?

Я работаю над приложением для обработки чисел, используя платформу CUDA. У меня есть некоторые статические данные, которые должны быть доступны для всех потоков, поэтому я поместил их в постоянную память следующим образом:

__device__ __constant__ CaseParams deviceCaseParams;

Я использую вызов cudaMemcpyToSymbol для передачи этих параметров с хоста на устройство:

void copyMetaData(CaseParams* caseParams)
{
    cudaMemcpyToSymbol("deviceCaseParams", caseParams, sizeof(CaseParams));
}

который работает.

В любом случае, похоже (методом проб и ошибок, а также из чтения сообщений в сети), что по какой-то нездоровой причине объявление deviceCaseParams и его операция копирования (вызов cudaMemcpyToSymbol) должны находиться в том же файле . На данный момент у меня есть эти два в файле .cu, но я действительно хочу иметь структуру параметров в файле .cuh, чтобы любая реализация могла видеть его, если захочет. Это означает, что у меня также должна быть функция copyMetaData в файле заголовка, но это мешает связыванию (символ уже определен), поскольку оба файла .cpp и .cu включают этот заголовок (и, таким образом, компилятор MS C ++ и nvcc компилируют его. ).

Есть ли здесь у кого-нибудь советы по дизайну?

Обновление: См. Комментарии

10
задан Yngve Sneen Lindal 24 October 2010 в 12:03
поделиться