最近小弟真的是非常郁闷,发现在cuda中用malloc,memcpy,这样的函数效率非常低。各路高手走过路过不要错过,给小弟一点帮助吧,哪怕一点建议都行,不胜感激。
我的程序中需要在一张表中提出100个参数(这不是固定的),需要将椭圆分成n个面积为sideLength* sideLength的微小平面,并且把这些平面的中心坐标存放起来供给下一个函数使用。 由于sideLength和ellipseA, ellipseB都是可以任意指定,所以一个椭圆存放多少个微小平面的中心坐标是未知的。所以我写了一个动态数组,类似C++的vector,用来存放微平面中心点坐标。 struct Para { // x^2/g_ellipseA + y^2/g_ellipseB <= 1 float sideLength; //表示边长 float ellipseA; //表示椭圆短轴的平方。 float ellipseB; //表示椭圆张轴的平方。 }; 我做了一组测试 在cuda中:(block数 * thread 数) 1次 ReceiveFxArray()调用1*1: 4.3s 400次 ReceiveFxArray()调用2*200: 10.9s, 4*100: 10.7s 600次 ReceiveFxArray()调用:3*200: 45.7.6s, 6*100: 47.03s 1000次 ReceiveFxArray()调用:5*200: 201.4s, 10 * 100: 197.3s, 1*1000: 203.5s 在CPU中: 1次ReceiveFxArray()调用:0.047s,CPU快91倍。 400次ReceiveFxArray()调用:20s,GPU快1.8倍。GPU终于比CPU块了。 600次ReceiveFxArray()调用:31s,CPU快1.5倍 1000次 ReceiveFxArray()调用:51s,CPU快4倍。 问题: 1.malloc,memcpy等函数在GPU中为什么会这么慢? 2.为什么GPU中的线程分配过多之后,反而更慢了?是不是分配的线程过多后,会产生更多的显存碎片,从而会更慢?
|