[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: UVM (Re: MNN)



>> bzero をちゃんと書き直すのが筋ですね。

ということでちょっと試してみました。すぐに思いつくようなコードですが
今の for (...) *p++ = 0; よりはずっと速いはずです(最後につけときます)。

これでカーネルをコンパイルする時間を測定してみたら、やっぱり5%ぐらい
速くなってました。ってことで bzero に関しては pmap_zero_page が主要な
寄与となっているみたいです。

# つまりこんなことしなくても pmap_zero_page だけおきかえりゃいいと。
# なんだかなー。

userland はどうなるでしょうねえ…。(めんどうなのでやってません:-)


void
bzero(from, len)
	void *from;
	size_t len;
{
	int count;
	union {
		int i;
		int *ip;
		char *cp;
	} addr;

	addr.ip = from;

	count = (-addr.i) & 0x03;		/* 4n までの残り */
	if (len > count) {
		len -= count;
		while (count-- > 0)
			*addr.cp++ = 0;

		/*** ここで 4n ***/

		count = (-addr.i) & 0x1f;	/* 32n までの残り */
		if (len > count) {
			len -= count;
			count /= 4;
			while (count-- > 0)
				*addr.ip++ = 0;

		/*** ここで 32n ***/

			count = len / 32;
			len -= 32 * count;
			while (count-- > 0) {
				__asm __volatile ("dcbz 0,%0" :: "r"(addr.ip));
				addr.i += 32;
			}
		}
		count = len / 4;
		len -= 4 * count;
		while (count-- > 0)
			*addr.ip++ = 0;
	}
	while (len-- > 0)
		*addr.cp++ = 0;
}

ここには書いていませんが、dcbz は cold == 1 では使わないようにしないと
うごかないかもしれません。