cuda遇到的问题:

1,在编写cuda代码时,不添加HANDLE_ERROR,程序可以正常运行,但是添加后,就不能正常运行,还没有解决:解决:错误提示函数要写在host函数中,在device和global函数中都会不可使用,因为在定义函数的时候,就选定了函数的执行的范围。

2)#pragma unroll:用在for循环的前面:这样编译器就会将循环变量优化为对应的数字。同时也会将申请的数组优化为寄存器:因为在数组中,每次调用数组中的元素,都要将本地内存的 数据读到寄存器中,之后,在进行运算。

2,__global__:在GPU中是并行的,是内核函数,__device__:是一个单线程的函数,只能在gpu上运行。

3,cuda编写的内核函数运行速度慢的原因:

1)在计算的时候,有许多的循环,可能是在访存上花费了很多的时间,j解决的办法是:在内核中添加局部变量,或者使用共享内存。

2)在内核中使用共享内存开辟窗口数组,会提高运行效果

4,共享内存:1)global memeory 是一块很大的on-board memory ,并且有很高的latency,;shared memory正好相反,是一块很小的,低延迟的on-chip memory,比global memory 拥有更多的带宽;使用共享内存时提高性能方式之一。

2)每个SM包含一个当前正在执行的block中所有thread共享的低延迟的内存池,SMEM使得同一个block中的thread能够相互工作,重用on-chip数据,并且能够显著减少kernel需要的global memory带宽,由于APP可以直接显示的操作SMEM的内容,所有又被称为可编程缓存。共享内存的延迟要比全局内存低20到30倍,带宽大约高10倍。

3)共享内存是划分给SM 中驻留的所有的block的,也是GPU的稀缺资源,使用的的共享资源越多,能够并行的active就越少。

4)如果共享内存的大小在编译器未知的话,可以使用extern关键字来修饰,在<<<>>>其中的第三个参数就是分配共享内存的大小。

5)共享内存分为动态的和静态的:__shared__ a[1000]:这种分配了需要内存的大小的,就静态的;没有分配大小的,extern __shared__ a[]  需要的大小需要在调用的时候配置的,叫做动态共享内存。

5,__inline和inline等同,通知编译器将该函数的内容拷贝一份放在调用函数的地方,这称之为内联,内联减少了函数调用的开销,但是增加了代码量。

6,使用cuda编写程序时候,开辟的线程块数和线程,如果很小的话,经过24个块处理后,就会产生错误数据,如果分配的块数足够多的话,就不会产生这种现象。解决:在这里:由于需要进行排序,在最后一个块的后面,没有数据了,这就导致最后一部分数据出现了问题,因此,要想避免这种问题,将下次开始的数据向前移动一部分,去覆盖这种情况(根据自己工作需要做的,其他人不一定需要。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野狼位位

给点辛苦费0.1元

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值