小编Use*_*ser的帖子

什么样的变量消耗CUDA中的寄存器?

__global__ void add( int *c, const int* a, const int* b )
{
    int x = blockIdx.x;
    int y = blockIdx.y;
    int offset = x + y * gridDim.x;
    c[offset] = a[offset] + b[offset];
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子,我想x,y,offset被保存在寄存器中而

  • nvcc -Xptxas -v给出4 registers, 24+16 bytes smem

  • profiler显示4个寄存器

  • ptx文件的头部:

    .reg .u16 %rh<4>;
    .reg .u32 %r<9>;    
    .reg .u64 %rd<10>;  
    .loc    15  21  0   
    
    $LDWbegin__Z3addPiPKiS1_:   
    .loc    15  26  0  
    
    Run Code Online (Sandbox Code Playgroud)

任何人都可以澄清寄存器的用法吗?在Fermi中,每个线程的最大寄存器数为63.在我的程序中,我想测试内核消耗太多寄存器的情况(因此变量可能必须自动存储在本地存储器中,从而导致性能下降).然后在这一点上,我可以将一个内核分成两个,这样每个线程都有足够的寄存器.假设SM资源足以用于并发内核.

我不确定我是不对的.

cuda

11
推荐指数
1
解决办法
1377
查看次数

CUDA共享内存

我需要了解一些关于CUDA共享内存的知识.假设我在G80卡中为每个块分配50个块,每个块有10个线程.G80的每个SM处理器可以同时处理8个块.假设在进行一些计算之后,共享内存被完全占用.

当接下来的8个新块到达时,共享内存中的值是多少?以前的值会存在吗?或者先前的值是否会被复制到全局内存中并且共享内存会在接下来的8个块中刷新?

cuda

3
推荐指数
1
解决办法
8673
查看次数

CUDA:如何在多个文件中重用内核(用于单元测试)

如何重用同一个内核,而不会因多次定义符号而出现致命的链接器错误?

在 Visual Studio 中我得到:

"fatal error LNK1169: one or more multiply defined symbols found"
Run Code Online (Sandbox Code Playgroud)

我有三个文件:Interface.hKernel.cuWrapper.cu. 我当前的结构如下(ala “C++集成”SDK示例):

//Interface.h 
extern "C" void myCfunction( ... );

//Kernel.cu
__global__ void my_kernel( ... );

//Wrapper.cu
#include "Interface.h"
#include "Kernel.cu"

extern "C" void myCfunction( ... );

void myCfunction( ... ) {
    // Call CUDA kernel in Kernel.cu
    my_kernel<<< ... >>>( ... );
}
Run Code Online (Sandbox Code Playgroud)

这一切都很好。

但是,如果我在另一个包含Kernel.cu并使用这些内核的文件中添加另一个 C 函数,则会出现上述错误。例如

//NewWrapper.cu
#include "Kernel.cu"

extern "C" void myNewCfunction( ... …
Run Code Online (Sandbox Code Playgroud)

linker cuda

2
推荐指数
1
解决办法
2600
查看次数

标签 统计

cuda ×3

linker ×1