C++ 当I';m在某些情况下使用模板参数?

C++ 当I';m在某些情况下使用模板参数?,c++,function,templates,cuda,instance,C++,Function,Templates,Cuda,Instance,我需要知道在以下代码中编译后,当blockSize为128时,函数实例会是什么样子 template <unsigned int blockSize> __global__ void reduce6(int *g_idata, int *g_odata, unsigned int n) { extern __shared__ int sdata[]; unsigned int tid = threadIdx.x; unsigned int i = blockIdx.x*(blockS

我需要知道在以下代码中编译后,当blockSize为128时,函数实例会是什么样子

template <unsigned int blockSize>
__global__ void reduce6(int *g_idata, int *g_odata, unsigned int n) {
extern __shared__ int sdata[];
unsigned int tid = threadIdx.x;
unsigned int i = blockIdx.x*(blockSize*2) + tid;
unsigned int gridSize = blockSize*2*gridDim.x;
sdata[tid] = 0;
while (i < n) { sdata[tid] += g_idata[i] + g_idata[i+blockSize]; i += gridSize; }
__syncthreads();
if (blockSize >= 512) { if (tid < 256) { sdata[tid] += sdata[tid + 256]; } __syncthreads(); }
if (blockSize >= 256) { if (tid < 128) { sdata[tid] += sdata[tid + 128]; } __syncthreads(); }
if (blockSize >= 128) { if (tid < 64) { sdata[tid] += sdata[tid + 64]; } __syncthreads(); }
if (tid < 32) warpReduce(sdata, tid);
if (tid == 0) g_odata[blockIdx.x] = sdata[0];
}
模板
__全局无效归约6(int*g\u-idata,int*g\u-odata,无符号int-n){
外部共享数据数据[];
unsigned int tid=threadIdx.x;
无符号整数i=blockIdx.x*(blockSize*2)+tid;
unsigned int gridSize=blockSize*2*gridDim.x;
sdata[tid]=0;
而(i=512){if(tid<256){sdata[tid]+=sdata[tid+256];}
if(blockSize>=256){if(tid<128){sdata[tid]+=sdata[tid+128];}
if(blockSize>=128){if(tid<64){sdata[tid]+=sdata[tid+64];}
如果(tid<32)减少(sdata,tid);
如果(tid==0)g_odata[blockIdx.x]=sdata[0];
}
会是这样吗

  __global__ void reduce6(int *g_idata, int *g_odata, unsigned int n) {
    extern __shared__ int sdata[];
    unsigned int tid = threadIdx.x;
    unsigned int i = blockIdx.x*(blockSize*2) + tid;
    unsigned int gridSize = blockSize*2*gridDim.x;
    sdata[tid] = 0;
    while (i < n) { sdata[tid] += g_idata[i] + g_idata[i+blockSize]; i += gridSize; }
    __syncthreads();

    if (tid < 64) { sdata[tid] += sdata[tid + 64]; } __syncthreads();

    if (tid < 32) warpReduce(sdata, tid);
    if (tid == 0) g_odata[blockIdx.x] = sdata[0];
    }
\uuuu全局\uuuuu无效缩减6(int*g\u-idata,int*g\u-odata,无符号int-n){
外部共享数据数据[];
unsigned int tid=threadIdx.x;
无符号整数i=blockIdx.x*(blockSize*2)+tid;
unsigned int gridSize=blockSize*2*gridDim.x;
sdata[tid]=0;
而(i
严格地说,它依赖于实现,但我希望有一个好的编译器来优化常量条件,所以我猜你很可能是对的

虽然我不知道NVCC是否会这么做,唯一的检查方法是查看汇编代码。

当你说“编译后”时,我想你的意思是“在基于模板参数的简单优化之后,我能考虑什么样的代码?”如果不是这样,我会删除这个答案

如果是这种情况,那么您给定的概念代码几乎是正确的。您在索引计算中遗漏了替换项。当然,编译器可以自由地做它喜欢做的事情,它依赖于选项,但这是它可以做的,在这个特定的例子中,它可能会做什么

\uuuu全局\uuuuu无效缩减6(int*g\u-idata,int*g\u-odata,无符号int-n){
外部共享数据数据[];
unsigned int tid=threadIdx.x;
无符号整数i=blockIdx.x*(256)+tid;
无符号整数gridSize=256*gridDim.x;
sdata[tid]=0;
而(i
通过使用模板向编译器提供有关blockSize值的信息,您可以减少内核需要执行的操作数量,尽管这些操作是否真正完成取决于编译器。

免责声明:我将您的问题解释为“由于模板非类型参数已知,代码将是什么样子?它有什么用?”

在源代码级别可视化您所要求的内容是没有意义的,但是可以假设编译器(取决于内部实现的方式,使用立即得到优化的LLVM前端,应该立即实现),因为blockSize==128,不会为以下部分生成代码:

template <unsigned int blockSize>
__global__ void reduce6(int *g_idata, int *g_odata, unsigned int n) {
extern __shared__ int sdata[];
unsigned int tid = threadIdx.x;
unsigned int i = blockIdx.x*(blockSize*2) + tid;
unsigned int gridSize = blockSize*2*gridDim.x;
sdata[tid] = 0;
while (i < n) { sdata[tid] += g_idata[i] + g_idata[i+blockSize]; i += gridSize; }
__syncthreads();
--- no code for this section ---
--- no code for this section ---

--- skipped if check ---
if (tid < 64) { sdata[tid] += sdata[tid + 64]; } __syncthreads();

if (tid < 32) warpReduce(sdata, tid);
if (tid == 0) g_odata[blockIdx.x] = sdata[0];
}
模板
__全局无效归约6(int*g\u-idata,int*g\u-odata,无符号int-n){
外部共享数据数据[];
unsigned int tid=threadIdx.x;
无符号整数i=blockIdx.x*(blockSize*2)+tid;
unsigned int gridSize=blockSize*2*gridDim.x;
sdata[tid]=0;
而(i

再次强调:这应该在代码生成级别可视化,因为模板参数评估可能会触发其他优化。

如回答中所述,这取决于对问题的解释。我选择将其解释为“我希望将什么代码编译为与模板化代码相同的代码?”(在我看来,给出的示例支持我的解释)。对于原始问题“编译后函数实例会是什么样子?”唯一严格正确的答案是“二进制”",这当然取决于OS/versions/options/other。是的,我认为这是绝对正确的答案。这些代码取自这个并行简化优化,查看第26页,我想知道它有什么好处。因此所有这些if语句都是在编译时计算的,所以不需要任何时间来运行所有的if st运行时的atements,对吗?回答最后一个问题,我会让你的答案正确。准确地说。编译器可以根据现在的编译时常量进行优化。谢谢,我已经下载了cuda示例,在那里我可以尝试使用和不使用模板进行此缩减,这可以提高运行时,但是如果我实现了在我的算法中,它没有任何改进。即使我尝试了较小的块大小。
template <unsigned int blockSize>
__global__ void reduce6(int *g_idata, int *g_odata, unsigned int n) {
extern __shared__ int sdata[];
unsigned int tid = threadIdx.x;
unsigned int i = blockIdx.x*(blockSize*2) + tid;
unsigned int gridSize = blockSize*2*gridDim.x;
sdata[tid] = 0;
while (i < n) { sdata[tid] += g_idata[i] + g_idata[i+blockSize]; i += gridSize; }
__syncthreads();
--- no code for this section ---
--- no code for this section ---

--- skipped if check ---
if (tid < 64) { sdata[tid] += sdata[tid + 64]; } __syncthreads();

if (tid < 32) warpReduce(sdata, tid);
if (tid == 0) g_odata[blockIdx.x] = sdata[0];
}