C++ 如何修复CUDA编程中的此错误,致命C1070:文件中的#if/#endif对不匹配?

C++ 如何修复CUDA编程中的此错误,致命C1070:文件中的#if/#endif对不匹配?,c++,c,cuda,gpu,reduction,C++,C,Cuda,Gpu,Reduction,我从这个例子中得到了warp shuffle操作的代码。我编译了它,得到了如下错误:致命C1070:文件中的#if/#endif对不匹配我很难修复此错误。有人能帮我吗? 任何尝试都将不胜感激。 谢谢大家! 代码如下: #ifndef _REDUCE_KERNEL_H_ #define _REDUCE_KERNEL_H_ #include <stdio.h> template <class T, unsigned int blockSize> __global__ v

我从这个例子中得到了warp shuffle操作的代码。我编译了它,得到了如下错误:致命C1070:文件中的#if/#endif对不匹配我很难修复此错误。有人能帮我吗? 任何尝试都将不胜感激。 谢谢大家!

代码如下:

#ifndef _REDUCE_KERNEL_H_
#define _REDUCE_KERNEL_H_

#include <stdio.h>


template <class T, unsigned int blockSize>
__global__ void
reduce5(T *g_idata, T *g_odata, unsigned int n)
{
    T *sdata = SharedMemory<T>();

    // perform first level of reduction,
    // reading from global memory, writing to shared memory
    unsigned int tid = threadIdx.x;
    unsigned int i = blockIdx.x*(blockSize*2) + threadIdx.x;

    T mySum = (i < n) ? g_idata[i] : 0;

    if (i + blockSize < n)
        mySum += g_idata[i+blockSize];

    sdata[tid] = mySum;
    __syncthreads();

    // do reduction in shared mem
    if ((blockSize >= 512) && (tid < 256))
    {
        sdata[tid] = mySum = mySum + sdata[tid + 256];
    }

    __syncthreads();

    if ((blockSize >= 256) &&(tid < 128))
    {
            sdata[tid] = mySum = mySum + sdata[tid + 128];
    }

     __syncthreads();

    if ((blockSize >= 128) && (tid <  64))
    {
       sdata[tid] = mySum = mySum + sdata[tid +  64];
    }

    __syncthreads();

#if (__CUDA_ARCH__ >= 300 )
    if ( tid < 32 )
    {
        // Fetch final intermediate sum from 2nd warp
        if (blockSize >=  64) mySum += sdata[tid + 32];
        // Reduce final warp using shuffle
        for (int offset = warpSize/2; offset > 0; offset /= 2) 
        {
            mySum += __shfl_down(mySum, offset);
        }
    }
#else
    // fully unroll reduction within a single warp
    if ((blockSize >=  64) && (tid < 32))
    {
        sdata[tid] = mySum = mySum + sdata[tid + 32];
    }

    __syncthreads();

    if ((blockSize >=  32) && (tid < 16))
    {
        sdata[tid] = mySum = mySum + sdata[tid + 16];
    }

    __syncthreads();

    if ((blockSize >=  16) && (tid <  8))
    {
        sdata[tid] = mySum = mySum + sdata[tid +  8];
    }

    __syncthreads();

    if ((blockSize >=   8) && (tid <  4))
    {
        sdata[tid] = mySum = mySum + sdata[tid +  4];
    }

    __syncthreads();

    if ((blockSize >=   4) && (tid <  2))
    {
        sdata[tid] = mySum = mySum + sdata[tid +  2];
    }

    __syncthreads();

    if ((blockSize >=   2) && ( tid <  1))
    {
        sdata[tid] = mySum = mySum + sdata[tid +  1];
    }

    __syncthreads();
#endif

    // write result for this block to global mem
    if (tid == 0) g_odata[blockIdx.x] = mySum;
}
\ifndef\u REDUCE\u KERNEL\u H_
#定义(减少)(内核)_
#包括
模板
__全局无效
约化5(T*g_-idata,T*g_-odata,无符号整数n)
{
T*sdata=SharedMemory();
//执行第一级还原,
//从全局内存读取,写入共享内存
unsigned int tid=threadIdx.x;
无符号整数i=blockIdx.x*(blockSize*2)+threadIdx.x;
T mySum=(i=512)和&(tid<256))
{
sdata[tid]=mySum=mySum+sdata[tid+256];
}
__同步线程();
如果((块大小>=256)和&(tid<128))
{
sdata[tid]=mySum=mySum+sdata[tid+128];
}
__同步线程();
如果((块大小>=128)和&(tid<64))
{
sdata[tid]=mySum=mySum+sdata[tid+64];
}
__同步线程();
#如果(\uuuu CUDA\u ARCH\uuuuu>=300)
如果(tid<32)
{
//从第二次扭曲中获取最终中间和
如果(块大小>=64)mySum+=sdata[tid+32];
//使用洗牌减少最终扭曲
对于(int offset=warpSize/2;offset>0;offset/=2)
{
mySum+=\uuu shfl\u向下(mySum,偏移量);
}
}
#否则
//在单个经纱内完全展开缩径
如果((区块大小>=64)和&(tid<32))
{
sdata[tid]=mySum=mySum+sdata[tid+32];
}
__同步线程();
如果((区块大小>=32)和&(tid<16))
{
sdata[tid]=mySum=mySum+sdata[tid+16];
}
__同步线程();
如果((区块大小>=16)和&(tid<8))
{
sdata[tid]=mySum=mySum+sdata[tid+8];
}
__同步线程();
如果((区块大小>=8)和&(tid<4))
{
sdata[tid]=mySum=mySum+sdata[tid+4];
}
__同步线程();
如果((区块大小>=4)和&(tid<2))
{
sdata[tid]=mySum=mySum+sdata[tid+2];
}
__同步线程();
如果((区块大小>=2)和&(tid<1))
{
sdata[tid]=mySum=mySum+sdata[tid+1];
}
__同步线程();
#恩迪夫
//将此块的结果写入全局mem
如果(tid==0)g_odata[blockIdx.x]=mySum;
}

您的文件中有一个基本的头保护,请确保您也使用
#endif
关闭它

#ifndef _REDUCE_KERNEL_H_
#define _REDUCE_KERNEL_H_

#include <stdio.h>

...

#endif // _REDUCE_KERNEL_H_
\ifndef\u REDUCE\u KERNEL\u H_
#定义(减少)(内核)_
#包括
...
#endif/\u REDUCE\u KERNEL\u H_

是否缺少
#endif
#ifndef\u REDUCE\u KERNEL\u H\u
?@ReinierRegencia:就在末尾。它是一个include守卫,如果第二次包含该文件,则用于忽略整个文件。(另外,从
\u REDUCE\u KERNEL\u H\u
中删除第一个
\u
,因为这使它成为一个不应该使用的文件。)@ReinierRegencia:这是因为您没有包括声明
SharedMemory
的头@ReinierRegencia:查看原始代码,文件开头有一个
SharedMemory
的定义。您已经删除了它,这就是为什么
SharedMemory
未定义的原因。@ReinierRegencia:将从文件开头删除的
SharedMemory
的定义放回原处。