Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取CUDA错误“;声明与先前的“声明”不兼容;变量“u name”;_C++_Compiler Errors_Cuda_Initialization_Gpu Shared Memory - Fatal编程技术网

C++ 获取CUDA错误“;声明与先前的“声明”不兼容;变量“u name”;

C++ 获取CUDA错误“;声明与先前的“声明”不兼容;变量“u name”;,c++,compiler-errors,cuda,initialization,gpu-shared-memory,C++,Compiler Errors,Cuda,Initialization,Gpu Shared Memory,我正在尝试编译一个包含MSVS 2012和CUDA内核的程序。我使用共享内存,但与关于同一问题的讨论不同,我只为这个内核的共享内存使用了一次变量名,因此没有重新定义的问题。代码如下: template<typename T> __global__ void mykernel( const T* __restrict__ data, T* __restrict__ results) { extern __shared__ T warp_partia

我正在尝试编译一个包含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];
    /* ... */
}

信息。什么原因会导致这种情况?

CUDA不会立即在模板函数中“支持”动态分配的共享内存阵列,因为它(显然)会生成这些外部内存的实际定义。如果为多个类型实例化模板化函数,则定义将发生冲突

一种变通方法是通过类以模板专门化的形式提供的。见:

您可以按如下方式使用变通方法:

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!
}
template\uuuu global\uuuuu void foo(T*g\u idata,T*g\u odata)
{
//共享内存
//大小由主机应用程序决定
SharedMem-shared;
T*sdata=shared.getPointer();
//…代码的其余部分保持不变!
}
getPointer()
对每种类型都有*一个专门的实现,它返回一个不同的指针,例如
extern\uuuuu shared\uuuuu float*shared\u mem\u float
extern\uu shared\uuuuu int*shared\u mem\u int


(*)-不太可能。在NVidia提供的头文件中,它们专门用于一些基本类型,就是这样。

CUDA不会立即在模板函数中“支持”动态分配的共享内存数组,因为它(显然)会生成这些外部函数的实际定义。如果为多个类型实例化模板化函数,则定义将发生冲突

一种变通方法是通过类以模板专门化的形式提供的。见:

您可以按如下方式使用变通方法:

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!
}
template\uuuu global\uuuuu void foo(T*g\u idata,T*g\u odata)
{
//共享内存
//大小由主机应用程序决定
SharedMem-shared;
T*sdata=shared.getPointer();
//…代码的其余部分保持不变!
}
getPointer()
对每种类型都有*一个专门的实现,它返回一个不同的指针,例如
extern\uuuuu shared\uuuuu float*shared\u mem\u float
extern\uu shared\uuuuu int*shared\u mem\u int


(*)-不太可能。在NVidia提供的头文件中,它们专门用于一些基本类型,就是这样。

CUDA不会立即在模板函数中“支持”动态分配的共享内存数组,因为它(显然)会生成这些外部函数的实际定义。如果为多个类型实例化模板化函数,则定义将发生冲突

一种变通方法是通过类以模板专门化的形式提供的。见:

您可以按如下方式使用变通方法:

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!
}
template\uuuu global\uuuuu void foo(T*g\u idata,T*g\u odata)
{
//共享内存
//大小由主机应用程序决定
SharedMem-shared;
T*sdata=shared.getPointer();
//…代码的其余部分保持不变!
}
getPointer()
对每种类型都有*一个专门的实现,它返回一个不同的指针,例如
extern\uuuuu shared\uuuuu float*shared\u mem\u float
extern\uu shared\uuuuu int*shared\u mem\u int


(*)-不太可能。在NVidia提供的头文件中,它们专门用于一些基本类型,就是这样。

CUDA不会立即在模板函数中“支持”动态分配的共享内存数组,因为它(显然)会生成这些外部函数的实际定义。如果为多个类型实例化模板化函数,则定义将发生冲突

一种变通方法是通过类以模板专门化的形式提供的。见:

您可以按如下方式使用变通方法:

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!
}
template\uuuu global\uuuuu void foo(T*g\u idata,T*g\u odata)
{
//共享内存
//大小由主机应用程序决定
SharedMem-shared;
T*sdata=shared.getPointer();
//…代码的其余部分保持不变!
}
getPointer()
对每种类型都有*一个专门的实现,它返回一个不同的指针,例如
extern\uuuuu shared\uuuuu float*shared\u mem\u float
extern\uu shared\uuuuu int*shared\u mem\u int



(*)-不太可能。在NVidia提供的头文件中,它们专门用于一些基本类型,仅此而已。

投票结束,您还没有提供SSCCE.org代码。因此,我们期望:“与您编写的代码问题相关的问题必须在问题本身中描述特定的问题,并包括复制该问题的有效代码。请参阅SSCCE.org以获取指导。”对于“与我的代码问题相关的概念性问题”或“可能导致此问题的原因”类型的问题,不排除在外。提供一个完整的、可编译的代码来演示问题,以及您正在使用的compile命令。将在几分钟内添加代码。到目前为止,您显示的代码还不完整。当我尝试将其破解成可编译代码时,它不会给我任何编译错误。请研究并提供一个完整的、可编译的代码来演示错误。@RobertCrovella:我不能公开分享我的实际代码。然而,我自己找到了解决方案,见下文。没有人问你实际的代码。只是一个复制器,为了演示这一点,它的创建非常简单。很高兴你找到了解决办法。要明确的是,您的第一句话是“CUDA不立即支持
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。虽然从您的回答中可以明显看出,但更确切地说,问题在于“动态分配的
\uuuu共享的\uuuu
mmemory数组…”静态分配的数组在模板函数中工作得很好,即使有多个实例化。投票结束,您还没有提供SSCCE.org代码。因此,“关于您编写的代码问题的问题”