Вызов функции шаблона для других функций

Я понимаю 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:

  • ошибка: явный тип отсутствует (предполагается «int»)
  • ошибка: переменная «RestoreThreadState» не может быть инициализирована
  • ошибка: значение типа «SimState *» нельзя использовать для инициализации объекта типа «int»
  • ошибка: ожидается «)»
  • предупреждение: объявление несовместимо с предыдущим «RestoreThreadState»

Дополнительные детали. Все эти функции являются функциями ядра CUDA. MCMLKernel это __global__ ядро и остальные функции, которые он вызывает __device__ Ядра. Я использую Nsight Eclipse Edition и вычисляю возможности графических процессоров 1.3 (четыре карты Tesla C1060).

0

Решение

__device__ void RestoreThreadState(...); является предварительным объявлением, означающим, что правильное определение следует в той же самой единице перевода (оно может даже быть ниже вызова функции).

__device__ void RestoreThreadState(...) {} является определением неоперативной функции.

__device__ int HitBoundary(PhotonStructGPU *photon); это предварительная декларация Вы даете определение?

Обновить

Вот суть на основе предоставленных вами фрагментов кода. Я сохранил описание ядра, функции устройства и типов в трех отдельных заголовках. Я могу скомпилировать его (хотя, очевидно, он не может быть запущен)

1

Другие решения

@ Евгений дал ответ на этот вопрос.

Я создал прототип функции так называемого

__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 шаблонная функция. Это дает мне предупреждение:

  • предупреждение: отсутствует оператор возврата в конце непустой функции «HitBoundary»

ОБНОВЛЕНИЕ: в другом исходном файле 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];
}

Вкратце: у меня есть четыре исходных файла

  1. main.cu
  2. kernel.cu
  3. rng.cu
  4. mem.cu

Каждый исходный файл, кроме main.cu имеет связанный заголовок

  1. kernel.cuh
  2. rng.cuh
  3. mem.cuh

где я хочу переслать-объявить функции для использования в main.cu.

Все хорошо, пока я не доберусь до функция шаблона который вызывает функции из kernel.cu а также rng.cu.

0

По вопросам рекламы [email protected]