我有一个使用17个寄存器的内核,将它减少到16会给我100%的占用率.我的问题是:是否有可用于减少所用数量或寄存器的方法,不包括以不同方式完全重写我的算法.我总是认为编译器比我更聪明,所以例如我为了清晰起见而经常使用额外的变量.这个想法我错了吗?
请注意:我确实知道--max_registers(或任何语法)标志,但使用本地内存会比占用率降低25%更有害(我应该测试一下)
是否可以在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是否已经拥有可以处理大数字的类型?
嘿,我正在使用Visual Studio 2008,使用CUDA 3.2.我正在尝试使用此签名调试到函数:
MatrixMultiplication_Kernel<<<dimGrid, dimBlock>>>(Md, Nd, Pd, Width);
Run Code Online (Sandbox Code Playgroud)
我可以进入该函数,但是当我进入该函数时,它不会让我跳过任何代码并告诉我没有可用的源.谁知道如何正确调试?
谢谢!
我的内核调用因"内存不足"而失败.它大量使用了堆栈框架,我想知道这是否是它失败的原因.
使用--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),则只能扩大驻留在一个多处理器上的线程数.类似的东西是否适用于堆栈帧大小?
是否可以同时启动两个执行独立任务的内核.例如,如果我有这个Cuda代码
// host and device initialization
.......
.......
// launch kernel1
myMethod1 <<<.... >>> (params);
// launch kernel2
myMethod2 <<<.....>>> (params);
Run Code Online (Sandbox Code Playgroud)
假设这些内核是独立的,是否有设施可以同时为每个内核分配几个网格/块.CUDA/OpenCL是否有此规定.
在我读过的有关Linux内核中HIGHMEM的几乎所有书籍和文章中,他们都说在使用3:1 split的情况下,内核并不是可以使用所有的1GB内存进行映射。通常为896MB左右,其余部分用于内核数据结构,内存映射,页表等。
我的问题是,这些数据结构到底是什么?通常通过页表地址寄存器访问页表,对吗?页表的基地址通常存储为物理地址。现在为什么需要为整个表保留虚拟地址空间?
同样,我了解了内核代码本身所占据的空间。这与虚拟地址空间有什么关系?是不是因为存储代码而消耗了物理内存?
最后,这些数据结构为何必须保留128MB的空间?为什么不能按要求在整个1GB地址空间中使用它们,就像内核中的任何其他常规数据结构一样?
我已经遍历了LDD3,Professional Linux Kernel Architecture和堆栈溢出的一些帖子(例如:为什么Linux Kernel ZONE_NORMAL限制为896 MB?)和较旧的LWN 文章,但没有找到相同的具体信息。
嗨,我正试图在开放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) cuda ×4
opencl ×2
concurrency ×1
debugging ×1
gmp ×1
gpgpu ×1
launch ×1
linux-kernel ×1
optimization ×1
parameters ×1
stack ×1
struct ×1
types ×1