用户
 找回密码
 立即注册
发表于 2013-10-31 14:47:00
玫瑰幻想 发表于 2013-10-31 14:32
以及,您这是Store效率的问题所在,而不是load的。

这里的double2 和我自己定义的compx 其实是一样的。我把修改后的代码附上
        if(i<row&&j<col)
        {
                float pupil = pupil_d[idx];
                float wavefront1 = 0;

                double wf65[15];
                double zercoef[15];
                compx P1;
                compx P2;

                //#pragma unroll
                for(int k=2;k<Zs;k++)
                {
                        wf65[k]=wf65_d[k*col*row+idx];
                        zercoef[k]=zercoef_d[k];
                        wavefront1 += wf65[k] * zercoef[k];
                }

                float wavefront2 = wavefront1 + theta_d[idx];

                P1.real = pupil * __cosf(wavefront1);
                P1.imag = pupil * __sinf(wavefront1);
                P2.real = pupil * __cosf(wavefront2);
                P2.imag = pupil * __sinf(wavefront2);

                ((compx *)P1_d)[idx] = P1;
                ((compx *)P2_d)[idx] = P2;
        }
可是Global Load Efficiency 还是50%
使用道具 举报 回复 支持 反对
发表于 2013-10-31 14:55:19
quanzhang100 发表于 2013-10-31 14:47
这里的double2 和我自己定义的compx 其实是一样的。我把修改后的代码附上
        if(i ...

首先楼主您不应该怀疑我,

让您使用double2,而不是使用您看起来一模一样的您的compx自然有道理的。

(以及,您确定是global load efficiency而不是global store efficiency? 不要打错!)
使用道具 举报 回复 支持 反对
发表于 2013-10-31 14:57:51
玫瑰幻想 发表于 2013-10-31 14:55
首先楼主您不应该怀疑我,

让您使用double2,而不是使用您看起来一模一样的您的compx自然有道理的。

以及,需要为您指出的是:

你的wf65_d读取到wf65的行为(以及zercoef的读取)纯粹是多此一举,
建议去掉。

(只是建议,您保留着也可以的)
使用道具 举报 回复 支持 反对
发表于 2013-10-31 15:13:08
玫瑰幻想 发表于 2013-10-31 14:57
以及,需要为您指出的是:

你的wf65_d读取到wf65的行为(以及zercoef的读取)纯粹是多此一举,

我查了一下double2是 做了对齐处理的,这算不算你推荐我用double2的原因呢?
上面是我打错了,不好意思 是global store efficiency。
使用道具 举报 回复 支持 反对
发表于 2013-10-31 15:16:04
quanzhang100 发表于 2013-10-31 15:13
我查了一下double2是 做了对齐处理的,这算不算你推荐我用double2的原因呢?
上面是我打错了,不好意思  ...

double2的确有对齐要求,可能是这个要求导致了它比你的compx好,让我推荐了它。

不过,您先尝试一下?
使用道具 举报 回复 支持 反对
发表于 2013-10-31 15:24:17
玫瑰幻想 发表于 2013-10-31 15:16
double2的确有对齐要求,可能是这个要求导致了它比你的compx好,让我推荐了它。

不过,您先尝试一下? ...

那我需要把我程序所有的compx 改成 double2 结构了
使用道具 举报 回复 支持 反对
发表于 2013-10-31 16:00:52
本帖最后由 ice 于 2013-10-31 16:09 编辑
quanzhang100 发表于 2013-10-31 15:24
那我需要把我程序所有的compx 改成 double2 结构了

您可以把您前面compx定义加以修改,改成double typedef得到,这样就不用修改后面的代码了,您可以快速搞定修改。

祝您好运~
——————————————————————————————————————
修正一下,刚才没能注意到您的compx里面的元素是real和imag,而不是x和y,这样就不行了,您不能直接typedef了,请修改您的代码。

刚才一时没有看仔细,深表歉意。
使用道具 举报 回复 支持 反对
发表于 2013-10-31 16:26:36
ice 发表于 2013-10-31 16:00
您可以把您前面compx定义加以修改,改成double typedef得到,这样就不用修改后面的代码了,您可以快速搞定 ...

既然楼主不接受前文我们给给出的使用double2的建议,

那么楼主能否重新定义下贵Struct?
至少改成例如:
struct __align__(16) compx
{
     double real;
     double imag;
};
这样您只需要改动一下定义即可,可能会消除您的50%问题。

不知道您是否愿意尝试下?

没有更多的建议了。。。
使用道具 举报 回复 支持 反对
发表于 2013-10-31 18:17:25
横扫千军 发表于 2013-10-31 16:26
既然楼主不接受前文我们给给出的使用double2的建议,

那么楼主能否重新定义下贵Struct?

出现了如下问题
error C2719: “xxx”: 具有 __declspec(align('16')) 的形参将不被对齐
正在尝试解决....
使用道具 举报 回复 支持 反对
发表于 2013-10-31 19:29:36
quanzhang100 发表于 2013-10-31 18:17
出现了如下问题
error C2719: “xxx”: 具有 __declspec(align('16')) 的形参将不被对齐
正在尝试解决... ...

这是最后一次警告了,您已经多次无视了我们的意见。

请您仔细看看18#的发文,里面是让你将__align__(16)写到参数列表吗!!!
是吗!!!!看仔细了!!别上来责备论坛!!

请按提示操作!
请你保持起码的一点尊重!!!
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册