몇 일 전에 썼던 글에서 테스트를 해본 내용을 바탕으로 4x4 matrix multiply 연산을 mmx 를 이용해서 구현해봤습니다.
-
#include <stdio .h>
-
-
// A matrix
-
short s1[16] = {
-
1, 2, 3, 4,
-
5, 6, 7, 8,
-
9, 10, 11, 12,
-
13, 14, 15, 16,
-
};
-
-
// Transpose(B matrix)
-
short s2[16] = {
-
17, 21, 25, 29,
-
18, 22, 26, 30,
-
19, 23, 27, 31,
-
20, 24, 28, 32
-
};
-
-
-
// Destination matrix
-
short d[16];
-
short t[4];
-
-
int i, j;
-
-
long start, end;
-
-
int main( int argc, char** argv ){
-
-
int k;
-
-
for( j = 0 ; j <4 ; j++ ){
-
for( i = 0 ; i <4 ; i++ ){
-
d[j*4+i] = 0;
-
for( k = 0 ; k <4 ; k++ ){
-
d[j*4+i] += s1[j*4+k] * s2[i*4+k];
-
}
-
}
-
}
-
-
fprintf( stderr, "c version\n\n" );
-
for( j = 0 ; j <4 ; j++ ){
-
for( i = 0 ; i <4 ; i++ ){
-
fprintf( stderr, "\t%3d", d[j*4+i] );
-
}
-
fprintf( stderr, "\n" );
-
}
-
return 0;
-
-
}
위와 같은 c version 의 코드를 작성한 후 아래와 같은 asm version 으로 컨버팅을 해봤는데, 100000 번 반복해서 연산을 하도록 해본 결과 mmx 버젼이 c 버젼보다 3배 정도 빠르게 연산을 하는 것을 확인할 수 있었습니다. (-O0 옵션과 함께 컴파일 했을 경우)
하지만 -O3 옵션과 함께 컴파일하게 되면 asm 버젼은 무한룹에 빠진 듯한 모습을 보여줬고, c 버젼의 수행속도가 -O0 로 컴파일한 asm 버젼보다 빠른 현상이 발생했습니다. 이유는 알 수 없음 -_-;
-
#include <stdio.h>
-
#include <asm /mmx.h>
-
-
// A matrix
-
short s1[16] = {
-
1, 2, 3, 4,
-
5, 6, 7, 8,
-
9, 10, 11, 12,
-
13, 14, 15, 16,
-
};
-
-
// Transpose(B matrix)
-
short s2[16] = {
-
17, 21, 25, 29,
-
18, 22, 26, 30,
-
19, 23, 27, 31,
-
20, 24, 28, 32
-
};
-
-
-
// Destination matrix
-
short d[16];
-
short t[4];
-
-
int i, j;
-
-
int main( int argc, char** argv ){
-
int loop;
-
-
for( loop = 0 ; loop <10000; loop++ ){
-
for( j = 0 ; j <4 ; j++ ){
-
-
for( i = 0 ; i <4 ; i++ ){
-
-
__asm__("mov j, %eax");
-
__asm__("movq s1(,%eax,8), %mm0" );
-
-
__asm__("mov i, %eax");
-
__asm__("movq s2(,%eax,8), %mm1" );
-
-
__asm__("pmullw %mm1, %mm0");
-
__asm__("movq %mm0, (t)" );
-
-
d[j*4+i] = t[0] + t[1] + t[2] + t[3];
-
}
-
}
-
}
-
for( j = 0 ; j <4 ; j++ ){
-
for( i = 0 ; i <4 ; i++ ){
-
fprintf( stderr, "\t%3d", d[j*4+i] );
-
}
-
fprintf( stderr, "\n" );
-
}
-
-
return 0;
-
-
}
8x8 matrix 는 뭔가 좀 더 생각해야할 것 같으니 나중에 정말 필요한 일 있을 때 구현을 해봐야겠습니다. -_-;
inline asm 작업을 하면서 eax 레지스터 값을 백업하지 않고 저렇게 사용해도 되는지는 잘 모르겠지만 --;; 하여튼 저 코드에 한해서는 별 문제 없으니 패스~ 꺄홋!!