안녕하세요
cell processor에서 작업을 하고 있습니다.
자꾸 bus error가 나서 별짓을 다 하다 결국엔 잡았습니다.
그런데 문제점이 while문과 for문입니다 do while는 테스트를 못해봤습니다.
sample code입니다.
<code>
/* while( test_loop-- ) */
for(; test_loop; test_loop--)
{
/* while( test1_loop-- ) */
for(; test1_loop; test1_loop-- )
{
mfc_get( ls, ea, ONE_RECV_SIZE, rank, 0, 0 );
mfc_write_tag_mask( 1 << rank );
mfc_read_tag_status_all();
ls += ONE_RECV_SIZE;
ea += NEXT_PTR;
for( i=0; i<8; i++ )
{
mfc_getb( ls, ea, ONE_RECV_SIZE, 0, 0, 0 );
mfc_read_tag_status_all();
ls += ONE_RECV_SIZE;
ea += NEXT_PTR;
}
ls = save_ls;
ea = args_list->src_addr[rank];
</code>
이 부분입니다 저기 위에 주석된 while문 여지 없이 bus error입니다.
하지만 for문으로 만들었을 경우 bus없이 아주 잘 돌아 갑니다.
대부분의 코드가 while문으로 되어 있습니다. 그래서 바꾸고는 있습니다만,
하지만 무엇인가 무지하게 찝찝 합니다 ㅡㅡ;;
이런 증상을 겪어 보신분 계시면 도움 좀 부탁 드립니다.
kldp에도 올렸습니다.
아무리 생각해도 초보적인 문제 같은데 한번도 겪어보지 않았던 문제에서
에러가 나니 정말 미치겠군요 ...
아 정말 ㅡㅡ;;
오늘 아무래도 술푸러 가야겠습니다 ...
cell processor에서 작업을 하고 있습니다.
자꾸 bus error가 나서 별짓을 다 하다 결국엔 잡았습니다.
그런데 문제점이 while문과 for문입니다 do while는 테스트를 못해봤습니다.
sample code입니다.
<code>
/* while( test_loop-- ) */
for(; test_loop; test_loop--)
{
/* while( test1_loop-- ) */
for(; test1_loop; test1_loop-- )
{
mfc_get( ls, ea, ONE_RECV_SIZE, rank, 0, 0 );
mfc_write_tag_mask( 1 << rank );
mfc_read_tag_status_all();
ls += ONE_RECV_SIZE;
ea += NEXT_PTR;
for( i=0; i<8; i++ )
{
mfc_getb( ls, ea, ONE_RECV_SIZE, 0, 0, 0 );
mfc_read_tag_status_all();
ls += ONE_RECV_SIZE;
ea += NEXT_PTR;
}
ls = save_ls;
ea = args_list->src_addr[rank];
</code>
이 부분입니다 저기 위에 주석된 while문 여지 없이 bus error입니다.
하지만 for문으로 만들었을 경우 bus없이 아주 잘 돌아 갑니다.
대부분의 코드가 while문으로 되어 있습니다. 그래서 바꾸고는 있습니다만,
하지만 무엇인가 무지하게 찝찝 합니다 ㅡㅡ;;
이런 증상을 겪어 보신분 계시면 도움 좀 부탁 드립니다.
kldp에도 올렸습니다.
아무리 생각해도 초보적인 문제 같은데 한번도 겪어보지 않았던 문제에서
에러가 나니 정말 미치겠군요 ...
아 정말 ㅡㅡ;;
오늘 아무래도 술푸러 가야겠습니다 ...
댓글 4
-
백창우
2007.03.13 01:59
-
정진웅
2007.03.13 02:41
오늘이나 내일 정도면 우선 코드가 완성되니까
코드를 좀 더 깔끔하게 해서 올리겠습니다.
(회사 데모용인데 올려도 될런지 모르겠네요.)
그나저나 이론상으론 속도가 나와야 하는데 잘 나올지 걱정이네요.
더 웃긴 경우도 있었습니다.
ppu에서
src_addr = malloc_align(3008*2000*3, 7)
if( src_addr == NULL)
exit(0);
spu에서
mfc_get( ls, src_addr, 16384, rank, 0, 0 );
count로 세어보니까 완벽한 랜덤으로 bus error
ppu에서 다시
malloc_align(16384*10, 7 );
은 아무이상없이 잘 되었구요..
저런 부분은 메뉴얼에도 언급이 없었던거 같던데.
굉장히 난감 했습니다.
그리고 창우님 말씀대로 해보겠습니다. -
백창우
2007.03.13 04:28
그렇군요. compiler가 아직까지는 많이 불안정한가 봅니다. 걱정스럽군요. 다 올리실 필요없이 gcc를 사용한다면 for와 while이 들어 있는 아주 짧은 code를 만들어서 gcc -da a.c, gcc a.c --save-temps로 나온 결과를 올리면 될것 같습니다.
-
백창우
2007.03.13 18:35
혹시 ea의 주소를 16byte align 맞추어 주셨나요? for를 while로 바꿈으로써 instruction이 바뀌어 align이 어긋나거나 혹은 맞을수도 있을것 같네요.
.
혹시 모르니깐 mfc_get( ls, ea, ONE_RECV_SIZE, rank, 0, 0 ); 이전에 memory barrier나 혹은 간단한 function을 호출해보는건 어떨까요?