游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2538|回复: 7

懂SSE请进,为什么老是运行报错?(思路是正确的)

[复制链接]

187

主题

600

帖子

606

积分

高级会员

Rank: 4

积分
606
QQ
发表于 2006-11-12 10:29:00 | 显示全部楼层 |阅读模式
typedef struct VECTOR3D_TYP
{
        union
        {
                //__m128 v;
                //__declspec(align(16))
                float M[4];
                struct
                {
                        float x,y,z,w;
                };

        };
} VECTOR3D, POINT3D, *VECTOR3D_PTR, *POINT3D_PTR;

typedef struct MATRIX4X4_TYP
{
        union
        {
                float M[4][4];
                struct
                {
                        float M00, M01, M02, M03;
                        float M10, M11, M12, M13;
                        float M20, M21, M22, M23;
                        float M30, M31, M32, M33;
                };
        };
} MATRIX4X4, *MATRIX4X4_PTR;

void Mat_Mul_VECTOR3D_4X4(const VECTOR3D &vec,const MATRIX4X4 &mat, VECTOR3D &dst_vec)
{
        dst_vec.x = vec.x * mat.M00 + vec.y * mat.M10 + vec.z * mat.M20 + vec.w * mat.M30;
        dst_vec.y = vec.x * mat.M01 + vec.y * mat.M11 + vec.z * mat.M21 + vec.w * mat.M31;
        dst_vec.z = vec.x * mat.M02 + vec.y * mat.M12 + vec.z * mat.M22 + vec.w * mat.M32;
        dst_vec.w = vec.x * mat.M03 + vec.y * mat.M13 + vec.z * mat.M23 + vec.w * mat.M33;
}

void Mat_Mul_VECTOR3D_4X4_SSE2(float *vec, float *mat, float *dst_vec)
{
        __asm
        {
                mov eax,dword ptr vec;               
                movaps xmm0, [eax];
                movaps xmm4, xmm0;
                shufps xmm4, xmm0, 0x00;//xmm4 = {x,x,x,x}
                movaps xmm5, xmm0;
                shufps xmm5, xmm0, 0x55;//xmm5 = {y,y,y,y}
                movaps xmm6, xmm0;
                shufps xmm6, xmm0, 0xAA;//xmm6 = {z,z,z,z}
                movaps xmm7, xmm0;
                shufps xmm7, xmm0, 0xFF;//xmm7 = {w,w,w,w}
               
                mov esi,dword ptr mat;
                mulps xmm4, [esi];
                mulps xmm5, [esi + 16];
                mulps xmm6, [esi + 32];
                mulps xmm7, [esi + 48];
               
                xorps xmm0, xmm0;
                addps xmm0, xmm4;
                addps xmm0, xmm5;
                addps xmm0, xmm6;
                addps xmm0, xmm7;

                mov edi, dst_vec;
                movaps [edi], xmm0;
        }
}
//以下是调试代码错误情况〔vs.2003编译器〕
        VECTOR3D vec3d = {1,2,3,4},vec2,vec1;
        MATRIX4X4 mat = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

        float mat_ptr[16];
        memcpy(&mat_ptr[0], &mat.M00, 64);

        ///////////////////////////////////////////////////////////////////
        //该行代码在debug模式下可以执行且结果正确,Release运行报错
    //Mat_Mul_VECTOR3D_4X4_SSE2(&vec3d.M[0], &mat_ptr[0], &vec1.M[0]);
        ///////////////////////////////////////////////////////////////////

        ///////////////////////////////////////////////////////////////////
        //该行代码执行在mulps xmm4, [esi];报错
        //Mat_Mul_VECTOR3D_4X4_SSE2(&vec3d.M[0], &mat.M00, &vec1.M[0]);
        ///////////////////////////////////////////////////////////////////

        Mat_Mul_VECTOR3D_4X4(vec3d, mat, vec2);

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2006-11-12 14:41:00 | 显示全部楼层

Re:懂SSE请进,为什么老是运行报错?(思路是正确的)

SSE指令段调用完还应该有个emms吧

187

主题

600

帖子

606

积分

高级会员

Rank: 4

积分
606
QQ
 楼主| 发表于 2006-11-12 18:16:00 | 显示全部楼层

Re:懂SSE请进,为什么老是运行报错?(思路是正确的)

那是MMX啊 大哥!SSE不用的

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2006-11-13 11:10:00 | 显示全部楼层

Re:懂SSE请进,为什么老是运行报错?(思路是正确的)

传入的是 float*, ESI 指向的是 float**.

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2006-11-13 13:31:00 | 显示全部楼层

Re:懂SSE请进,为什么老是运行报错?(思路是正确的)

不明白为什么不用SSE的c++ intrinsics

187

主题

600

帖子

606

积分

高级会员

Rank: 4

积分
606
QQ
 楼主| 发表于 2006-11-13 17:58:00 | 显示全部楼层

Re: 懂SSE请进,为什么老是运行报错?(思路是正确的)

typedef struct VECTOR3D_TYP
{
union
{
__declspec(align(16)) float M[4];
struct
{
float x,y,z,w;
};

};
} VECTOR3D, POINT3D, *VECTOR3D_PTR, *POINT3D_PTR;

typedef struct MATRIX4X4_TYP
{
union
{
__declspec(align(16)) float M[4][4];
struct
{
float M00, M01, M02, M03;
float M10, M11, M12, M13;
float M20, M21, M22, M23;
float M30, M31, M32, M33;
};
};
} MATRIX4X4, *MATRIX4X4_PTR;

inline void VECTOR3D_INIT(VECTOR3D &vec, float x, float y, float z)
{
vec.x = x;
vec.y = y;
vec.z = z;
vec.w = 1;
}

void Mat_Mul_VECTOR3D_4X4_SSE(const VECTOR3D &vec,const MATRIX4X4 &mat, VECTOR3D &dst_vec)
{
__asm
{
mov eax, vec;
movaps xmm0, [eax];
movaps xmm4, xmm0;
shufps xmm4, xmm0, 0x00;//xmm4 = {x,x,x,x}
movaps xmm5, xmm0;
shufps xmm5, xmm0, 0x55;//xmm5 = {y,y,y,y}
movaps xmm6, xmm0;
shufps xmm6, xmm0, 0xAA;//xmm6 = {z,z,z,z}
movaps xmm7, xmm0;
shufps xmm7, xmm0, 0xFF;//xmm7 = {w,w,w,w}

mov esi, mat;
mulps xmm4, [esi];
mulps xmm5, [esi + 16];
mulps xmm6, [esi + 32];
mulps xmm7, [esi + 48];

xorps xmm0, xmm0;
addps xmm0, xmm4;
addps xmm0, xmm5;
addps xmm0, xmm6;
addps xmm0, xmm7;

mov edi, dst_vec;
movaps [edi], xmm0;
}
}

//////////////////////////////////////////////////////////////////////////
//SSE-Debug Code/////////////////////////////////////////
VECTOR3D vec3d = {1,2,3,4},vec2,vec1,vec[3];
VECTOR3D_PTR vec_ptr = new VECTOR3D[3];
MATRIX4X4 mat = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

VECTOR3D_INIT(vec[0], 1, 2, 3);
VECTOR3D_INIT(vec_ptr[0], 1, 2, 3);

Mat_Mul_VECTOR3D_4X4_SSE(vec3d, mat, vec1);//ok
Mat_Mul_VECTOR3D_4X4_SSE(vec[0], mat, vec1);//ok
Mat_Mul_VECTOR3D_4X4_SSE(vec_ptr[0], mat, vec1);//err 0xC0000005: 读取位置 0xffffffff 时发生访问冲突 。

注意!__declspec(align(16)) 进行16字对齐即可
另外由于C++使用new动态分配的内存不是16字对齐的,所以抱错!需要自己写内存分配和释放的函数,进行16字对齐即可,测试通过了,没有问题
比较郁闷的就是测试发现我这个代码,好象跟C++的代码速度差不多,哪个大哥能够解释一下啊,小弟谢了先

8

主题

553

帖子

560

积分

高级会员

Rank: 4

积分
560
发表于 2006-11-14 15:55:00 | 显示全部楼层

Re:懂SSE请进,为什么老是运行报错?(思路是正确的)

呵呵,绝大多数情况下,局部优化上compiler不会比你手写的asm差,看看asm吧。

187

主题

600

帖子

606

积分

高级会员

Rank: 4

积分
606
QQ
 楼主| 发表于 2006-11-15 14:06:00 | 显示全部楼层

Re:懂SSE请进,为什么老是运行报错?(思路是正确的)

这个函数是3D变换最频繁的调用了,每个顶点变换都要调用啊
呵呵不过的确还不是最关键的,关键的是光栅化,但是那个不好优化,我实在没有办法优化三角形光栅化函数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 20:47

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表