f code(1)

电脑再一次蓝屏……

 

已经数不清这是第几次了,跑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倍了

而且,大数据量时又开始蓝屏崩溃……

 

已然熄灯,我只想睡觉

 

待续

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章