电脑再一次蓝屏……
已经数不清这是第几次了,跑100*100规模以下的数据尚能承受,300*300以上就开始运行时蓝屏
我暗想:这该不会是CUDA架构的不稳定吧,我该给NV写一封信反应一下,或者,找大虾开勇哥请教一下?
算了,还是明天拿给赖导看看再说吧
第二天,我来到办公室
赖导说:那天你走之后,我想起你的程序有一个缺陷,就是并行计算时各个线程对显存读写的冲突,也许就是蓝屏的原因。
我顿悟,想想昨天将责任推到CUDA架构身上也太弱智了,惭愧……,但同时心里埋怨赖导,我上周拿你看,你说没问题,之后你想起来有问题了也不给我说声,害我蓝屏了八百遍。
接着,他提出了另外一种思路
我回到寝室,感觉他的那种思路不易控制,还是想沿着以前的思路改进,解决显存读写冲突的问题
一下午之后,程序基本上完成了
但是,运行时中断,这次换成了内存的读写访问冲突
突然,我眼前一亮,暗骂自己非常SB,new出来的数组居然用delete而不是delete[],看了那么多C++的书哪一本都会强调这个问题自己居然忘了……
算了,发现就好了,改掉
结果依然中断
打断点,发现中断位置在Host端,还居然在delete数组的时候中断,很费解,已经熄灯了,睡觉
第二天,下午
再次发现,原来对三维数组的寻址不对,再次暗骂自己SB,考软设的时候那几个N维数组选址的题目都OK了,现在又不行了
改掉 依然在delete数组时运行时中断
再次发现数组边界错误,突然怀念C++的vector或者string,他们,在我每次数组边界超限的时候都会抛出一个异常,进而"biang“的一声弹出一个对话框提示越界错误,而,数组,做为每个菜鸟的噩梦,是不会抛出任何异常,只会让你头痛
但至少我发现了
改掉,这次程序可以完完全全的跑下来了
结果不对?不管他,先看运行时间
有点不敢相信,在500*500的时候居然比CPU快400倍以上
我狂喜,CUDA真是伟大的架构!但是……
我开开心心地洗澡
我坐回电脑前,想想为什么结果不对呢?
发现,每次迭代没有交换边界值!!!!!
我差点晕菜,怪不得CUDA程序比CPU快了这么多,没有交换边界值相当于根本没有循环迭代
就好比大家跑10000米,你小子跑一圈,别人跑了25圈,你当然很快
怪不得……我真的晕菜
我改,不就是交换边界值么……
这次改好了,但是,这次也换做CPU比CUDA程序快10倍了
而且,大数据量时又开始蓝屏崩溃……
已然熄灯,我只想睡觉
待续