GCC内联汇编实现向量规约的例子
2012-12-06 15:00
281 查看
有了前面一个基础,这个就比较容易折腾出来了,只是换了个表达方式,所以也很快就出炉,负责计算的函数的性能仍然跟GCC(3.4.5)优化后的时间一致,但是因为不知道怎么进一步该这个程序,所以就只能到这个地步了,以后有改进的会继续发布。
#include
<stdio.h>
#include
<time.h>
#define N
1024*1024*1024
#define M
10
int
vector_reduction(int *a, int count)
{
int result = 0;
__asm__ __volatile__(
"xor % % rax, % % rax;"
"xor % % ebx, % % ebx;"
"cmp % % ebx, % % edx;"
"je 2f;"
"1:"
"add (% % rsi), % % rax;"
"add $4, % % rsi;"
"add $1, % % ebx;"
//"inc % % rsi;"
//"inc % % ebx;"
"cmp % % ebx, % % edx;"
"ja 1b;"
"2:"
:"=a"(result), "=S"(a), "=d"(count)
:"a"(result), "S"(a), "d"(count)
:"ebx", "memory"
);
return result;
}
int
main()
{
int *a = (int *)malloc(sizeof(int) * N);
int i, result;
clock_t start, ctime;
start = clock();
for(i = 0; i < N; ++i)
a[i] = 1;
ctime = clock() - start;
printf("initial time: % d s\n", ctime / CLOCKS_PER_SEC);
start = clock();
for(i = 0; i < M; ++i)
result = vector_reduction(a, N);
ctime = clock() - start;
printf("sum = % d\n", result);
printf("compute time: % d s\n", ctime / CLOCKS_PER_SEC);
free(a);
return 0;
}
#include
<stdio.h>
#include
<time.h>
#define N
1024*1024*1024
#define M
10
int
vector_reduction(int *a, int count)
{
int result = 0;
__asm__ __volatile__(
"xor % % rax, % % rax;"
"xor % % ebx, % % ebx;"
"cmp % % ebx, % % edx;"
"je 2f;"
"1:"
"add (% % rsi), % % rax;"
"add $4, % % rsi;"
"add $1, % % ebx;"
//"inc % % rsi;"
//"inc % % ebx;"
"cmp % % ebx, % % edx;"
"ja 1b;"
"2:"
:"=a"(result), "=S"(a), "=d"(count)
:"a"(result), "S"(a), "d"(count)
:"ebx", "memory"
);
return result;
}
int
main()
{
int *a = (int *)malloc(sizeof(int) * N);
int i, result;
clock_t start, ctime;
start = clock();
for(i = 0; i < N; ++i)
a[i] = 1;
ctime = clock() - start;
printf("initial time: % d s\n", ctime / CLOCKS_PER_SEC);
start = clock();
for(i = 0; i < M; ++i)
result = vector_reduction(a, N);
ctime = clock() - start;
printf("sum = % d\n", result);
printf("compute time: % d s\n", ctime / CLOCKS_PER_SEC);
free(a);
return 0;
}
相关文章推荐
- GCC内联汇编实现向量加法的例子
- 使用深度卷积网络和支撑向量机实现的商标检测与分类的例子
- GCC内联汇编(inline assembly )的几个例子
- OpenCL实现向量加的简单例子
- Servlet过滤器----------例子:实现用户自动登陆的过滤器
- 最牛X的GCC 内联汇编
- @media screen实现响应式布局例子
- 从零开始学习Node.js例子四 多页面实现数学运算
- JDK与Cglib实现的动态代理区别以及例子说明
- OCI文档、C++实现例子
- java实现Email发送的例子
- 从零开始学习Node.js例子四 多页面实现数学运算 续二(client端和server端)
- Mahout实现的分类算法,两个例子,预测期望的目标变量
- GCC内联汇编使用说明
- Mahout实现的分类算法,两个例子,预测期望的目标变量
- TensorFlow实战3:实现Logistic回归小例子
- iBATIS实现的一个例子
- 原型模式的java实现例子
- 向量旋转算法(Java实现)
- 字符串操作实践[内联汇编实现]