[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: gcc-3.1.1
Tsubai Masanari <tsubai@iri.co.jp> writes:
> じゃあ、最後の lwz だけ lwzu にする形ではどうでしょうか。
> テストしていませんが、こんな感じ。
>
> asm volatile (
> "addic 0,0,0;" /* clear carry */
> "mtctr %1;" /* load loop count */
> "1:"
> "lwz 7,4(%2);" /* load current data
> word */
> "lwzu 8,8(%2);"
> "adde %0,%0,7;" /* add to sum */
> "adde %0,%0,8;"
> "bdnz 1b;" /* loop */
> "addze %0,%0;" /* add carry bit */
> : "+r"(sum)
> : "r"(n), "b"(w - 4)
> : "7", "8"); /* clobber r7, r8 */
>
> 64バイトの方もこっちのほうがいいのかも。
64 byte のほうは効いたけど 8 byte のほうは返って遅くなりました.
ちなみに, この packet は 0x2088 byte あって, それが 12 個の mbuf に別
れていて, 8/64 byte の loop はそれぞれ
8 byte: 3 * 5, 5 * 6, 6 * 1
64 byte: 22 * 5, 13 * 1
(意味は, iteration の数 * loop の数) だけ通ります.
lwz だけの場合:
% jot 5 | while read i; do csh -c 'time ./a.out-lwz,x10'; done
125.9u 0.0s 2:05.94 100.0% 0+0k 0+0io 0pf+0w
126.0u 0.0s 2:06.11 99.9% 0+0k 0+0io 0pf+0w
126.0u 0.0s 2:06.07 99.9% 0+0k 0+0io 0pf+0w
126.0u 0.0s 2:06.10 99.9% 0+0k 0+0io 0pf+0w
126.0u 0.0s 2:06.07 99.9% 0+0k 0+0io 0pf+0w
8 byte の loop だけ lwz + lwzu:
% jot 5 | while read i; do csh -c 'time ./a.out-lwzlwzu'; done
126.2u 0.0s 2:06.35 99.9% 0+0k 0+0io 0pf+0w
126.2u 0.0s 2:06.34 99.9% 0+0k 0+0io 0pf+0w
126.2u 0.0s 2:06.35 99.9% 0+0k 0+0io 0pf+0w
126.3u 0.0s 2:06.33 99.9% 0+0k 0+0io 0pf+0w
126.2u 0.0s 2:06.33 99.9% 0+0k 0+0io 0pf+0w
64 byte の loop も lwz + lwzu:
% jot 5 | while read i; do csh -c 'time ./a.out-lwzlwzu64'; done
121.7u 0.0s 2:01.83 99.9% 0+0k 0+0io 0pf+0w
121.7u 0.0s 2:01.76 99.9% 0+0k 0+0io 0pf+0w
121.6u 0.0s 2:01.71 99.9% 0+0k 0+0io 0pf+0w
121.7u 0.0s 2:01.78 99.9% 0+0k 0+0io 0pf+0w
121.6u 0.0s 2:01.77 99.9% 0+0k 0+0io 0pf+0w
enami.