Получение сообщения об ошибке CUDA «несовместимо с предыдущим» variable_name «quot;

Я пытаюсь скомпилировать программу, включая ядро ​​с MSVS 2012 и CUDA. Я использую общую память, но в отличие от этот вопрос Что касается той же проблемы, я использую имя моей переменной для общей памяти этого ядра только один раз, поэтому не возникает проблем с переопределением. С таким кодом:

template<typename T>
__global__ void mykernel(
const T* __restrict__ data,
T*       __restrict__ results)
{
extern __shared__ T warp_partial_results[];
/* ... */
warp_partial_results[lane_id] = something;
/* ... */
results[something_else] = warp_partial_results[something_else];
/* ... */
}

который создается для нескольких типов (например, float, int, unsigned int), я получаю страшные

declaration is incompatible with previous "warp_partial_results"

сообщение. Что может вызвать это?

-1

Решение

CUDA не сразу «поддерживает» динамически распределенные массивы совместно используемой памяти в шаблонных функциях, поскольку (по-видимому) генерирует фактические определения этих extern-ов. Если вы создадите шаблонную функцию для нескольких типов, определения будут конфликтовать.

Обходной путь доступен в форме специализации шаблона через классы. Увидеть:

http://www.ecse.rpi.edu/~wrf/wiki/ParallelComputingSpring2015/cuda/nvidia/samples/0_Simple/simpleTemplates/sharedmem.cuh

Вы используете обходной путь следующим образом:

template<class T> __global__ void foo( T* g_idata, T* g_odata)
{
// shared memory
// the size is determined by the host application

SharedMem<T> shared;
T* sdata = shared.getPointer();

// .. the rest of the code remains unchanged!
}

getPointer() имеет* специализированная реализация для каждого типа, которая возвращает другой указатель, например extern __shared__ float* shared_mem_float или же extern __shared__ int* shared_mem_int и т.п.

(*) — На самом деле, нет. в прилагаемом заголовочном файле NVidia они специализируются на некоторых основных типах, и это все.

2

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

Других решений пока нет …

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