C++ 如何修复CUDA编程中的此错误,致命C1070:文件中的#if/#endif对不匹配?
我从这个例子中得到了warp shuffle操作的代码。我编译了它,得到了如下错误:致命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
#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
的定义放回原处。