d****n 发帖数: 1637 | 1 void zeroarray1(double * A)
{
int i, j;
for (i = 0; i < 1024; i++)
for (j = 0; j < 1024; j++)
A[i * 1024 + j] = 0.0;
}
void zeroarray2(double * A)
{
int i, j;
for (j = 0; j < 1024; j++)
for (i = 0; i < 1024; i++)
A[i * 1024 + j] = 0.0;
} | c*******y 发帖数: 1630 | | d****n 发帖数: 1637 | 3 那你就当路过
【在 c*******y 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 一个月前刚讨论过吧。
| t****t 发帖数: 6806 | 4 有合适的编译开关, 这两一模一样. gcc 4.4开始, 有-floop-interchange.
【在 d****n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : void zeroarray1(double * A) : { : int i, j; : for (i = 0; i < 1024; i++) : for (j = 0; j < 1024; j++) : A[i * 1024 + j] = 0.0; : } : void zeroarray2(double * A) : { : int i, j;
| d****n 发帖数: 1637 | 5 包子still available if answered. | J7 发帖数: 38 | 6 first one?
CPU cache line?
【在 d****n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : void zeroarray1(double * A) : { : int i, j; : for (i = 0; i < 1024; i++) : for (j = 0; j < 1024; j++) : A[i * 1024 + j] = 0.0; : } : void zeroarray2(double * A) : { : int i, j;
| d****n 发帖数: 1637 | 7 dryden,您好:
您转给 J7,现金(伪币):10,收取手续费:0.1
同时附加了如下留言给 J7.
first one is faster
站务 | J7 发帖数: 38 | 8 thanks
我很奇怪Fortran据说列存储的,这个和C/C++等不同啊
【在 d****n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : dryden,您好: : 您转给 J7,现金(伪币):10,收取手续费:0.1 : 同时附加了如下留言给 J7. : first one is faster : 站务
| d****n 发帖数: 1637 | 9 不懂fortran,愿意学习
【在 J7 的大作中提到】![](/moin_static193/solenoid/img/up.png) : thanks : 我很奇怪Fortran据说列存储的,这个和C/C++等不同啊
| w***g 发帖数: 5958 | 10 行优先和列优先是针对二维数组而言的。楼主那个是一维数组操作(手工算矩阵元素的
地址),对fortran和C/C++结论相同。A[i*1024+j]这个元素如果用二维数组表示的话,
C/C++里是A[i][j],fortran里是A(j,i)。
【在 J7 的大作中提到】![](/moin_static193/solenoid/img/up.png) : thanks : 我很奇怪Fortran据说列存储的,这个和C/C++等不同啊
| c***r 发帖数: 4631 | 11 LLVM吧第一个整成一个memset就完事了。
pushq %rax
.Ltmp2:
xorl %esi, %esi
movl $8388608, %edx # imm = 0x800000
callq memset
popq %rax
ret
第二个叽叽咕咕折腾半天。
为什么呢?
【在 t****t 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 有合适的编译开关, 这两一模一样. gcc 4.4开始, 有-floop-interchange.
| t****t 发帖数: 6806 | 12 没用过llvm, 两年前好象是没有graphite的, 现在不知道有没有. gcc肯定有.
这是gcc -S -O2 -floop-interchange的结果, 你可以看到两个一模一样. 我用的gcc 4
.7.2, 但是4.4就有了.
.globl _Z10zeroarray1Pd
.type _Z10zeroarray1Pd, @function
_Z10zeroarray1Pd:
.LFB0:
.cfi_startproc
leaq 8388608(%rdi), %rdx
.p2align 4,,10
.p2align 3
.L2:
leaq 8192(%rdi), %rax
.p2align 4,,10
.p2align 3
.L3:
movq $0, (%rdi)
addq $8, %rdi
cmpq %rax, %rdi
jne .L3
cmpq %rdi, %rdx
jne .L2
rep
ret
.cfi_endproc
.LFE0:
.size _Z10zeroarray1Pd, .-_Z10zeroarray1Pd
.p2align 4,,15
.globl _Z10zeroarray2Pd
.type _Z10zeroarray2Pd, @function
_Z10zeroarray2Pd:
.LFB1:
.cfi_startproc
leaq 8388608(%rdi), %rdx
.L9:
leaq 8192(%rdi), %rax
.p2align 4,,10
.p2align 3
.L8:
movq $0, (%rdi)
addq $8, %rdi
cmpq %rax, %rdi
jne .L8
cmpq %rdx, %rdi
jne .L9
rep
ret
.cfi_endproc
.LFE1:
.size _Z10zeroarray2Pd, .-_Z10zeroarray2Pd
【在 c***r 的大作中提到】![](/moin_static193/solenoid/img/up.png) : LLVM吧第一个整成一个memset就完事了。 : pushq %rax : .Ltmp2: : xorl %esi, %esi : movl $8388608, %edx # imm = 0x800000 : callq memset : popq %rax : ret : 第二个叽叽咕咕折腾半天。 : 为什么呢?
| c***r 发帖数: 4631 | 13 我主要是纳闷为什么第二个不整成memset呢?
4
【在 t****t 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 没用过llvm, 两年前好象是没有graphite的, 现在不知道有没有. gcc肯定有. : 这是gcc -S -O2 -floop-interchange的结果, 你可以看到两个一模一样. 我用的gcc 4 : .7.2, 但是4.4就有了. : .globl _Z10zeroarray1Pd : .type _Z10zeroarray1Pd, @function : _Z10zeroarray1Pd: : .LFB0: : .cfi_startproc : leaq 8388608(%rdi), %rdx : .p2align 4,,10
| n******t 发帖数: 4406 | 14
【在 d****n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : void zeroarray1(double * A) : { : int i, j; : for (i = 0; i < 1024; i++) : for (j = 0; j < 1024; j++) : A[i * 1024 + j] = 0.0; : } : void zeroarray2(double * A) : { : int i, j;
|
|