gpt4 book ai didi

c - 优化技巧

转载 作者:太空狗 更新时间:2023-10-29 15:13:38 24 4
gpt4 key购买 nike

int *s;
allocate memory for s[100];
void func (int *a, int *b)
{
int i;

for (i = 0; i < 100; i++)
{
s[i] = a[i] ^ b[i];
}
}

假设这个特定的代码片段被调用了 1000 次,这是我的代码中最耗时的操作。还假设每次都更改 a 和 b 的地址。 's' 是一个全局变量,它使用 a 和 b 的不同值集进行更新。

据我推测,主要的性能瓶颈是内存访问,因为唯一的其他操作是 XOR,这是非常微不足道的。

您能否建议我如何以最佳方式优化我的代码?

我真正想问的问题,但我认为它没有得到正确表达,例如,这个 for 循环包含 10 个这样的 XOR 操作,循环计数为 100,函数被调用 1000 次,重点是高内存访问。如果代码要在单核机器上执行,有哪些改进空间?

最佳答案

我已经测试了提议的解决方案和其他两个。我无法测试 onemasse 的提议,因为保存到 s[] 的结果不正确。我也无法修复它。我不得不对 moonshadow 代码进行一些更改。度量单位是时钟周期,越低越好。

原代码:

#define MAX 100
void inline STACKO ( struct timespec *ts, struct timespec *te ){

int i, *s, *a, *b;

for (i = 0; i < MAX; ++i){
s = (int *) malloc (sizeof (int)); ++s;
a = (int *) malloc (sizeof (int)); ++a;
b = (int *) malloc (sizeof (int)); ++b;
}

srand ( 1024 );
for (i = 0; i < MAX; ++i){
a[i] = ( rand() % 2 );
b[i] = ( rand() % 2 );
}

rdtscb_getticks ( ts ); /* start measurement */

for (i = 0; i < MAX; i++)
s[i] = a[i] ^ b[i];

rdtscb_getticks ( te ); /* end measurement */

/*
printf("\n");
for (i = 0; i < MAX; ++i)
printf("%d", s[i]);
printf("\n");
*/
}

新提案1:注册int

来自:

int i, *s, *a, *b;

收件人:

register int i, *s, *a, *b;

新提案2:无数组表示法

s_end = &s[MAX];
for (s_ptr = &s[0], a_ptr = &a[0], b_ptr = &b[0]; \
s_ptr < s_end; \
++s_ptr, ++a_ptr, ++b_ptr){
*s_ptr = *a_ptr ^ *b_ptr;
}

moonshadow 建议优化:

s_ptr = &s[0];
a_ptr = &a[0];
b_ptr = &b[0];

for (i = 0; i < (MAX/4); i++){

s_ptr[0] = a_ptr[0] ^ b_ptr[0];
s_ptr[1] = a_ptr[1] ^ b_ptr[1];
s_ptr[2] = a_ptr[2] ^ b_ptr[2];
s_ptr[3] = a_ptr[3] ^ b_ptr[3];
s_ptr+=4; a_ptr+=4; b_ptr+=4;
}

moonshadow建议优化+注册int:

来自:

int i, *s, ...

收件人:

register int i, *s, ...

Christoffer 建议的优化:

#pragma omp for
for (i = 0; i < MAX; i++)
{
s[i] = a[i] ^ b[i];
}

结果:

Performance graph

Original Code   1036.727264
New Proposal 1 611.147928
New proposal 2 450.788845
moonshadow 713.3845
moonshadow2 452.481192
Christoffer 1054.321943

还有其他简单的方法可以优化生成的二进制文件。将 -O2 传递给 gcc 表示您需要优化。要确切了解 -O2 的作用,请参阅 gcc 手册页。

启用-O2后: Performance graph

Original Code   464.233031
New Proposal 1 452.620255
New proposal 2 454.519383
moonshadow 428.651083
moonshadow2 419.317444
Christoffer 452.079057

源代码位于:http://goo.gl/ud52m

关于c - 优化技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4305553/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com