Я работаю над хрустящим приложением, использующим CUDA. У меня есть некоторые статические данные, которые должны быть доступны для всех потоков, поэтому я поместил их в постоянную память следующим образом:
__device__ __constant__ CaseParams deviceCaseParams;
Я использую вызов cudaMemcpyToSymbol для переноса этих параметров с хоста на устройство:
void copyMetaData(CaseParams* caseParams)
{
cudaMemcpyToSymbol("deviceCaseParams", caseParams, sizeof(CaseParams));
}
который работает.
В любом случае, кажется (по пробной версии и ошибкам, а также из чтения сообщений в сети), что по какой-то больной причине объявление deviceCaseParams и его копирование (вызов cudaMemcpyToSymbol) должны быть в одном файле, На данный момент у меня эти два файла .cu, но я действительно хочу иметь структуру параметров в файле .cuh, чтобы любая реализация могла видеть это, если захочет. Это означает, что я также должен иметь функцию copyMetaData в заголовочном файле, но это испортит связывание (уже определенный символ), так как оба файла .cpp и .cu включают этот заголовок (и, таким образом, компилятор MS С++ и nvcc компилирует его).
Есть ли у кого-нибудь советы по дизайну здесь?
Обновление: См. комментарии