cudaMalloc(void** p, int size):分配size字节的存储器,并将其首地址赋给*p,至于参数为什么是二级指针,可在C语言中到答案
cudaMallocHost():这个方法是在主机上分配空间,可以加快传输速度,因此在写cuda时,应该使用此函数取代Malloc,参数同上一函数
cudaMemcpy(void* dest,void* source,int size,enum direction):copy size data form. source to dest,direction must be right,you must be careful。关于这个函数要注意的是:如果最后一个参数的类型不匹配也不会出错。
cudaMemcpyToSymbol:将数据复制到__constant__,__device__变量中
cudaMemcpyFormSymbol: 同上相反
CudaThreadSynchronize():强制等待所有在此句之前启动的runtime 任务完成。其实现方式采用的轮询。
__syncthreads():此函数用于保证block内所有线程都运行到调用处,常用它来保证一致性。
cudaMallocPitch(void**,int*,widthInBytes,height):这个函数是在线性内存中分配二维数组,因此在使用
时,还是用一维的方式使用。注意,width的单位是字节,而height单位是数据类型,而第二个参数的含义下面一段话说明了。
c语言申请2维内存时,一般是连续存放的。a[y][x]存放在第y*widthofx*sizeof(元素)+x*sizeof(元素)个字节。 但在cuda的global memory访问中,从256字节对齐的地址(addr=0, 256, 512, ...)开始的连续访问是最有效率的。这样,为了提高内存访问的效率,有了cudaMallocPitch函数。cudaMallocPitch函数分配的内存中,数组的每一行的第一个元素的开始地址都保证是对齐的。因为每行有多少个数据是不确定的,widthofx*sizeof(元素)不一定是256的倍数。故此,为保证数组的每一行的第一个元素的开始地址对齐,cudaMallocPitch在分配内存时,每行会多分配一些字节,以保证widthofx*sizeof(元素)+多分配的字节是256的倍数(对齐)。这样,上面的y*widthofx*sizeof(元素)+x*sizeof(元素)来计算a[y][x]的地址就不正确了。 而应该是y*[widthofx*sizeof(元素)+多分配的字节]+x*sizeof(元素)。而函数中返回的pitch的值就是widthofx*sizeof(元素)+多分配的字节。 说明:widthInBytes作为输入参数,应该是widthofx*sizeof(元素);这样的话,复制内容时也要作相应的修改。
cuda中的数学函数,普通的和标准c中一样,如果是对int操作,直接使用本名,如果操作long类型对数,在本名前加l,如果操作双精度浮点数,在本名前加f,如果操作单精度,在本名前后都加上f,如 max(int,int),lmax(long,long),fmax(double,double),fmaxf(float,float),同时要记住的是:有些函数并没有某些类型参数存在,也就没有相应的函数。molloc函数
向量操作
cuda对于向量在cutil_math.h中重载了很多操作符,如负号,+, -, *(包括矢量乘和数乘),/(向量的对应坐标相除和
数除),+=,-=,*=,lerp(三个参数,含义为求一个值,使得该值和第一个参数的距离与每一个参数和第二个参数的距离的比值是第三个参数,类型于高中的线段的分割点), dot(点乘),length(返回二范数),normalize(对向量进行单位化),rsqrtf(求开方的倒数)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论