Я понимаю template functions
обычно должны быть объявлены и определены в заголовочных файлах.
У меня проблема в том, что мой template function
делает звонки на другие функции. Прототипы этих других функций находятся в том же заголовочном файле до сама функция шаблона.
Эта часть кода:
//header.h
template <int ignoreAdetection>
__global__ void MCMLKernel(SimState d_state, GPUThreadStates tstates)
{
// photon structure stored in registers
PhotonStructGPU photon;
// random number seeds
UINT64 rnd_x;
UINT32 rnd_a;
// Flag to indicate if this thread is active
UINT32 is_active;
// Restore the thread state from global memory.
RestoreThreadState(&d_state, &tstates, &photon, &rnd_x, &rnd_a, &is_active);
...
...
}
Функция RestoreThreadState
является первой из нескольких функций, вызываемых из этой функции шаблона. Другие вызываются в цикле for.
Я не уверен, должна ли эта функция шаблона быть или не должна быть в заголовочном файле. Если должен быть в заголовочном файле, как я могу вызвать эти другие функции?
Ошибки, которые я получаю от компилятора во время создания экземпляра MCMLKernel:
Дополнительные детали. Все эти функции являются функциями ядра CUDA. MCMLKernel
это __global__
ядро и остальные функции, которые он вызывает __device__
Ядра. Я использую Nsight Eclipse Edition и вычисляю возможности графических процессоров 1.3 (четыре карты Tesla C1060).
__device__ void RestoreThreadState(...);
является предварительным объявлением, означающим, что правильное определение следует в той же самой единице перевода (оно может даже быть ниже вызова функции).
__device__ void RestoreThreadState(...) {}
является определением неоперативной функции.
__device__ int HitBoundary(PhotonStructGPU *photon);
это предварительная декларация Вы даете определение?
Обновить
Вот суть на основе предоставленных вами фрагментов кода. Я сохранил описание ядра, функции устройства и типов в трех отдельных заголовках. Я могу скомпилировать его (хотя, очевидно, он не может быть запущен)
@ Евгений дал ответ на этот вопрос.
Я создал прототип функции так называемого
__device__ void RestoreThreadState(SimState *d_state, GPUThreadStates *tstates,
PhotonStructGPU *photon,
UINT64 *rnd_x, UINT32 *rnd_a,
UINT32 *is_active);
Но с примером, приведенным Евгением, это должно быть так (НЕ ПРОТОТИП! Смотрите другой ответ)
__device__ void RestoreThreadState(SimState *d_state, GPUThreadStates *tstates,
PhotonStructGPU *photon,
UINT64 *rnd_x, UINT32 *rnd_a,
UINT32 *is_active){}
Обратите внимание {}
в конце.
Далее в коде я вызываю функции, которые на самом деле возвращают такие значения
__device__ int HitBoundary(PhotonStructGPU *photon);
Вызывается из того же MCMLKernel
шаблонная функция. Это дает мне предупреждение:
ОБНОВЛЕНИЕ: в другом исходном файле kernel.cu У меня есть следующее объявление и определение (причина, по которой у меня проблемы с несколькими определениями):
__device__ void RestoreThreadState(SimState *d_state, GPUThreadStates *tstates,
PhotonStructGPU *photon,
UINT64 *rnd_x, UINT32 *rnd_a,
UINT32 *is_active)
{
UINT32 tid = blockIdx.x * NUM_THREADS_PER_BLOCK + threadIdx.x;
*rnd_x = d_state->x[tid];
*rnd_a = d_state->a[tid];
photon->x = tstates->photon_x[tid];
photon->y = tstates->photon_y[tid];
photon->z = tstates->photon_z[tid];
photon->ux = tstates->photon_ux[tid];
photon->uy = tstates->photon_uy[tid];
photon->uz = tstates->photon_uz[tid];
photon->w = tstates->photon_w[tid];
photon->sleft = tstates->photon_sleft[tid];
photon->layer = tstates->photon_layer[tid];
*is_active = tstates->is_active[tid];
}
Вкратце: у меня есть четыре исходных файла
Каждый исходный файл, кроме main.cu имеет связанный заголовок
где я хочу переслать-объявить функции для использования в main.cu.
Все хорошо, пока я не доберусь до функция шаблона который вызывает функции из kernel.cu а также rng.cu.