小编cod*_*ler的帖子

减少CUDA内核中使用的寄存器数量

我有一个使用17个寄存器的内核,将它减少到16会给我100%的占用率.我的问题是:是否有可用于减少所用数量或寄存器的方法,不包括以不同方式完全重写我的算法.我总是认为编译器比我更聪明,所以例如我为了清晰起见而经常使用额外的变量.这个想法我错了吗?

请注意:我确实知道--max_registers(或任何语法)标志,但使用本地内存会比占用率降低25%更有害(我应该测试一下)

optimization cuda gpgpu

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

OpenCL内核中的自定义类型

是否可以在OpenCL内核中使用自定义类型,如gmp类型(mpz_t,mpq_t,...)?

有这样的东西(这个内核不仅仅因为而构建#include <gmp.h>):

#include <gmp.h>
__kernel square(
   __global mpz_t* input,
   __global mpz_t number,
   __global int* output,
   const unsigned int count)
{
   int i = get_global_id(0);
   if(i < count)
       output[i] = mpz_divisible_p(number,input[i]);
}

也许通过向第四个参数(选项)添加不同的参数clBuildProgram

或者OpenCL是否已经拥有可以处理数字的类型?

types gmp opencl

11
推荐指数
3
解决办法
2万
查看次数

如何使用visual studio 2008调试CUDA内核代码?

嘿,我正在使用Visual Studio 2008,使用CUDA 3.2.我正在尝试使用此签名调试到函数:

 MatrixMultiplication_Kernel<<<dimGrid, dimBlock>>>(Md, Nd, Pd, Width);
Run Code Online (Sandbox Code Playgroud)

我可以进入该函数,但是当我进入该函数时,它不会让我跳过任何代码并告诉我没有可用的源.谁知道如何正确调试?

谢谢!

debugging cuda visual-studio

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

CUDA在哪里为内核分配堆栈帧?

我的内核调用因"内存不足"而失败.它大量使用了堆栈框架,我想知道这是否是它失败的原因.

使用--ptxas-options = -v调用nvcc时,它会打印以下配置文件信息:

    150352 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info    : Used 59 registers, 40 bytes cmem[0]
Run Code Online (Sandbox Code Playgroud)

硬件:GTX480,sm20,1.5GB设备内存,48KB共享内存/多处理器.

我的问题是分配的堆栈帧在哪里:在共享,全局内存,常量内存,......?

我尝试了每个块1个线程,以及每个块32个线程.同样"内存不足".

另一个问题:如果寄存器的总数不超过多处理器上的可用寄存器数(我的卡为32k),则只能扩大驻留在一个多处理器上的线程数.类似的东西是否适用于堆栈帧大小?

stack cuda

6
推荐指数
1
解决办法
3883
查看次数

使用CUDA为GPU同时启动多个内核

是否可以同时启动两个执行独立任务的内核.例如,如果我有这个Cuda代码

// host and device initialization
.......
.......

// launch kernel1
myMethod1 <<<.... >>> (params);

// launch kernel2
myMethod2 <<<.....>>> (params);
Run Code Online (Sandbox Code Playgroud)

假设这些内核是独立的,是否有设施可以同时为每个内核分配几个网格/块.CUDA/OpenCL是否有此规定.

concurrency cuda launch

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

哪些数据结构使用128MB的1GB Linux内核空间?

在我读过的有关Linux内核中HIGHMEM的几乎所有书籍和文章中,他们都说在使用3:1 split的情况下,内核并不是可以使用所有的1GB内存进行映射。通常为896MB左右,其余部分用于内核数据结构,内存映射,页表等。

我的问题是,这些数据结构到底是什么?通常通过页表地址寄存器访问页表,对吗?页表的基地址通常存储为物理地址。现在为什么需要为整个表保留虚拟地址空间?

同样,我了解了内核代码本身所占据的空间。这与虚拟地址空间有什么关系?是不是因为存储代码而消耗了物理内存?

最后,这些数据结构为何必须保留128MB的空间?为什么不能按要求在整个1GB地址空间中使用它们,就像内核中的任何其他常规数据结构一样?

我已经遍历了LDD3,Professional Linux Kernel Architecture和堆栈溢出的一些帖子(例如:为什么Linux Kernel ZONE_NORMAL限制为896 MB?)和较旧的LWN 文章,但没有找到相同的具体信息。

memory-management virtual-memory linux-kernel

5
推荐指数
1
解决办法
1450
查看次数

在打开的CL中将结构数组传递给内核

嗨,我正试图在开放CL中实现距离矢量程序..

基本上我遇到了将结构数组作为参数传递给内核的问题.

我的结构定义是这样的

    typedef struct 
    {
    int a[nodes][4];
    }node;
    node * srcA;
Run Code Online (Sandbox Code Playgroud)

在为此分配内存之后..我已使用此代码将其捆绑到缓冲区对象中

         // allocate the buffer memory objects
    memobjs1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,           
         sizeof(node) * n, srcA, NULL);

if (memobjs1 == (cl_mem)0)
{
    printf("ERROR: Failed to create Buffer...mem[0]\n");
    clReleaseCommandQueue(cmd_queue);
    clReleaseContext(context);
    return -1;
}
Run Code Online (Sandbox Code Playgroud)

我的内核参数设置如下

    err = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &memobjs1);
Run Code Online (Sandbox Code Playgroud)

现在我想将这个结构数组(即由srcA指向)传递到内核中,我已经完成了这个...

    const char *ocl_test_programs[] = {\
              "__kernel void disvec (__global node *x,__global int *p)"\
          "{"\
         "int i=1,r=1,n;"\
          "r=p[1]; "\
          "n=p[0];"\

          //"for(i=1;i<=n;i++) "\

         "{"\

          "if(x[r].a[i][2]!=999 && x[r].a[i][2]!=0)"\ …
Run Code Online (Sandbox Code Playgroud)

parameters struct opencl

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