免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4598 | 回复: 6
打印 上一主题 下一主题

[C] g++ 编译sse出错 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-27 20:05 |只看该作者 |倒序浏览
代码如下:
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <xmmintrin.h>

using namespace std;

typedef union{
__m128 m;
float f[4];
} sseTemp;

float dotWithSSE(float *a, float *b, const int len){
int step = len/4;
__m128* one = (__m128*)a;
__m128* two = (__m128*)b;
if(NULL == one || NULL == two){
printf("%d\n", __LINE__);
exit(1);
}

__m128 result = _mm_setzero_ps();
__m128 temp = _mm_set_ps(0.1f, 0.1f, 0.1f, 0.1f);

for(int i = 0; i < step -1; i++){
temp = _mm_add_ps(*one, *two);
temp = _mm_mul_ps(temp, temp);
result = _mm_add_ps(result, temp);
}

sseTemp s;
s.m = result;

float r = 0.0f;

r += s.f[0] + s.f[1] + s.f[2] + s.f[3];

if(0 != (len & 3)){
for(int i = 4*step; i < len; i++){
r += (a[i] - b[i])*(a[i] - b[i]);
}
}

return r;
}

float dotWithoutSSE(float* __restrict__ a, float* __restrict__ b, const int len){
float result = 0.0f, temp;

for(int i = 0; i < len; i++){
temp = (a[i] - b[i]);
result += temp*temp;
}

return result;
}

int runTest(const int len){
float *a, *b;
a = (float*) malloc(sizeof(float)*len);
b = (float*) malloc(sizeof(float)*len);
if(NULL == a || NULL == b){
printf("malloc fail\n");
exit(1);
}

for(int i = 0; i < len; i++){
a[i] = 1.0f*rand()/RAND_MAX;
b[i] = 1.0f*rand()/RAND_MAX;
}

clock_t start = clock();
float sse = dotWithSSE(a, b, len);
clock_t end = clock();
clock_t timeSSE = end - start;

start = clock();
float withoutSSE = dotWithoutSSE(a, b, len);
end = clock();
clock_t timeWithoutSSE = end - start;

if(fabs(sse - withoutSSE) < 0.00001){
printf("test pass\n");
}
printf("withSSE = %f, wihtoutSSE = %f", sse, withoutSSE);

free(a);
free(b);
}

int main(){

runTest(1000);
return 0;
}

使用gcc测试时,代码 temp = _mm_add_ps(*one, *two);越界,这另我百思不得其解,先谢谢了!

论坛徽章:
0
2 [报告]
发表于 2010-06-27 22:40 |只看该作者
好像是地址没对齐,SSE 要求 16-Byte 对齐的。

论坛徽章:
0
3 [报告]
发表于 2010-06-27 22:57 |只看该作者
回复 2# 变异老鼠
谢谢你!

那在gcc中怎么将malloc分配的空间对齐到16字节啊?我试过__attribute__(aligned(16))不行啊!

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2010-06-28 09:12 |只看该作者
好像是地址没对齐,SSE 要求 16-Byte 对齐的。
变异老鼠 发表于 2010-06-27 22:40



    这个运行期才能判断出来的。LZ的问题是编译错误

论坛徽章:
0
5 [报告]
发表于 2010-06-28 10:22 |只看该作者
回复 3# yyfn风辰


    试试这个?
  1. NAME
  2.        posix_memalign, memalign, valloc - Allocate aligned memory

  3. SYNOPSIS
  4.        #include <stdlib.h>

  5.        int posix_memalign(void **memptr, size_t alignment, size_t size);

  6.        #include <malloc.h>

  7.        void *valloc(size_t size);
  8.        void *memalign(size_t boundary, size_t size);

  9.    Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

  10.        posix_memalign(): _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600
复制代码

论坛徽章:
0
6 [报告]
发表于 2010-06-28 19:51 |只看该作者
谢谢!

论坛徽章:
0
7 [报告]
发表于 2010-07-05 22:23 |只看该作者
回复 5# 变异老鼠
非常感谢你的回复,我测试了,完全可用。另外,我查到valloc分配的空间是按页对齐的,这个应当会多占空间,这个函数有什么好处呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP