日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

如何在 CPU 上优化 GEMM

發(fā)布時(shí)間:2023/11/28 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在 CPU 上优化 GEMM 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

如何在 CPU 上優(yōu)化 GEMM
(TL;DR) TVM 提供抽象接口,允許用戶(hù)分別描述算法和算法的實(shí)施組織(所謂的調(diào)度)。通常,在高性能調(diào)度中編寫(xiě)算法,會(huì)破壞算法的可讀性和模塊化。嘗試各種看似有前途的調(diào)度也很耗時(shí)。在 TVM 的幫助下,可以有效地嘗試這些調(diào)度,提高性能。
將演示如何使用 TVM 優(yōu)化矩陣乘法,通過(guò)簡(jiǎn)單地添加 18 行額外代碼,實(shí)現(xiàn)比基線(xiàn)快 200 倍。
在 CPU 上執(zhí)行的密集計(jì)算應(yīng)用程序,有兩個(gè)重要的優(yōu)化:

  1. 提高內(nèi)存訪(fǎng)問(wèn)的緩存命中率。復(fù)雜的數(shù)值計(jì)算和熱點(diǎn)內(nèi)存訪(fǎng)問(wèn),都可以通過(guò)高緩存命中率加速。需要將原始內(nèi)存訪(fǎng)問(wèn)模式,轉(zhuǎn)換為適合緩存策略的模式。
  2. SIMD(單指令多數(shù)據(jù)),或者稱(chēng)向量處理單元。每次都會(huì)處理一小批數(shù)據(jù),不是單個(gè)網(wǎng)格。需要統(tǒng)一模式,轉(zhuǎn)換循環(huán)體中的數(shù)據(jù)訪(fǎng)問(wèn)模式, LLVM 后端可以降低為 SIMD。
    實(shí)際上,所有方法都是repo 中提到的一個(gè)子技巧 。一些已被 TVM 抽象自動(dòng)應(yīng)用,由于 TVM 的限制,一些不能簡(jiǎn)單地應(yīng)用。
    下面所有實(shí)驗(yàn)結(jié)果,都是在配備 Intel i7-4770HQ CPU 的,15’ MacBook 上實(shí)現(xiàn)的。對(duì)于所有 x86 CPU,緩存行大小應(yīng)為 64 字節(jié)。
    準(zhǔn)備和基線(xiàn)
    將演示如何使用 TVM 優(yōu)化矩陣乘法。在實(shí)際演示前,先定義這些變量。然后編寫(xiě)一個(gè)基線(xiàn)實(shí)現(xiàn),這是在 TVM 中編寫(xiě)矩陣乘法的最簡(jiǎn)單方法。
    import tvm
    import tvm.testing
    from tvm import te
    import numpy
    import timeit

The size of the matrix

(M, K) x (K, N)

You are free to try out different shapes, sometimes TVM optimization outperforms numpy with MKL.

M = 1024
K = 1024
N = 1024

The default tensor type in tvm

dtype = “float32”

using Intel AVX2(Advanced Vector Extensions) ISA for SIMD

To get the best performance, please change the following line

to llvm -mcpu=core-avx2, or specific type of CPU you use

target = “l(fā)lvm”
dev = tvm.device(target, 0)

Random generated tensor for testing

a = tvm.nd.array(numpy.random.rand(M, K).astype(dtype), dev)
b = tvm.nd.array(numpy.random.rand(K, N).astype(dtype), dev)

np_repeat = 100
np_runing_time = timeit.timeit(
setup=“import numpy\n”
"M = " + str(M) + “\n”
"K = " + str(K) + “\n”
"N = " + str(N) + “\n”
‘dtype = “float32”\n’
“a = numpy.random.rand(M, K).astype(dtype)\n”
“b = numpy.random.rand(K, N).astype(dtype)\n”,
stmt=“answer = numpy.dot(a, b)”,
number=np_repeat,
)
print(“Numpy running time: %f” % (np_runing_time / np_repeat))

answer = numpy.dot(a.numpy(), b.numpy())

Algorithm

k = te.reduce_axis((0, K), “k”)
A = te.placeholder((M, K), name=“A”)
B = te.placeholder((K, N), name=“B”)
C = te.compute((M, N), lambda m, n: te.sum(A[m, k] * B[k, n], axis=k), name=“C”)

Default schedule

s = te.create_schedule(C.op)
func = tvm.build(s, [A, B, C], target=target, name=“mmult”)
assert func

c = tvm.nd.array(numpy.zeros((M, N), dtype=dtype), dev)
func(a, b, c)
tvm.testing.assert_allclose(c.numpy(), answer, rtol=1e-5)

evaluator = func.time_evaluator(func.entry_name, dev, number=1)
print(“Baseline: %f” % evaluator(a, b, c).mean)
輸出:
Numpy running time: 0.009345
Baseline: 3.291115
在 TVM 中,檢查較低級(jí)別的 IR,調(diào)試或優(yōu)化調(diào)度。這是使用基線(xiàn)調(diào)度生成的 IR。
print(tvm.lower(s, [A, B, C], simple_mode=True))
輸出:
primfn(A_1: handle, B_1: handle, C_1: handle) -> ()
attr = {“from_legacy_te_schedule”: True, “global_symbol”: “main”, “tir.noalias”: True}
buffers = {C: Buffer(C_2: Pointer(float32), float32, [1024, 1024], []),
A: Buffer(A_2: Pointer(float32), float32, [1024, 1024], []),
B: Buffer(B_2: Pointer(float32), float32, [1024, 1024], [])}
buffer_map = {A_1: A, B_1: B, C_1: C} {
for (m: int32, 0, 1024) {
for (n: int32, 0, 1024) {
C_2[((m1024) + n)] = 0f32
for (k: int32, 0, 1024) {
C_2[((m
1024) + n)] = ((float32*)C_2[((m1024) + n)] + ((float32)A_2[((m1024) + k)](float32*)B_2[((k*1024) + n)]))
}
}
}
}
阻塞
提高緩存命中率的一個(gè)重要技巧是阻塞——數(shù)據(jù)塊將逐塊計(jì)算。塊內(nèi)部的內(nèi)存訪(fǎng)問(wèn)是一個(gè)具有高內(nèi)存局部性的小鄰域。選擇了 32 作為分塊因子。該塊將填充 32 * 32 * sizeof(float) 即 4KB 的緩存,總大小為 32KB(L1 數(shù)據(jù)緩存)。
bn = 32
kfactor = 4
s = te.create_schedule(C.op)

Blocking by loop tiling

mo, no, mi, ni = s[C].tile(C.op.axis[0], C.op.axis[1], bn, bn)
(kaxis,) = s[C].op.reduce_axis
ko, ki = s[C].split(kaxis, factor=kfactor)

Hoist reduction domain outside the blocking loop

s[C].reorder(mo, no, ko, ki, mi, ni)

func = tvm.build(s, [A, B, C], target=target, name=“mmult”)
assert func

c = tvm.nd.array(numpy.zeros((M, N), dtype=dtype), dev)
func(a, b, c)
tvm.testing.assert_allclose(c.numpy(), answer, rtol=1e-5)

By simply tiling the loop 32x32, and hoisting ko, ki outside the blocking loops,

we can see big speedup compared with the baseline.

evaluator = func.time_evaluator(func.entry_name, dev, number=10)
print(“Opt1: %f” % evaluator(a, b, c).mean)
輸出:
Opt1: 0.310688
這是阻塞后,生成的IR。
print(tvm.lower(s, [A, B, C], simple_mode=True))
輸出:
primfn(A_1: handle, B_1: handle, C_1: handle) -> ()
attr = {“from_legacy_te_schedule”: True, “global_symbol”: “main”, “tir.noalias”: True}
buffers = {C: Buffer(C_2: Pointer(float32), float32, [1024, 1024], []),
A: Buffer(A_2: Pointer(float32), float32, [1024, 1024], []),
B: Buffer(B_2: Pointer(float32), float32, [1024, 1024], [])}
buffer_map = {A_1: A, B_1: B, C_1: C} {
for (m.outer: int32, 0, 32) {
for (n.outer: int32, 0, 32) {
for (m.inner.init: int32, 0, 32) {
for (n.inner.init: int32, 0, 32) {
C_2[((((m.outer32768) + (m.inner.init1024)) + (n.outer32)) + n.inner.init)] = 0f32
}
}
for (k.outer: int32, 0, 256) {
for (k.inner: int32, 0, 4) {
for (m.inner: int32, 0, 32) {
for (n.inner: int32, 0, 32) {
C_2[((((m.outer
32768) + (m.inner1024)) + (n.outer32)) + n.inner)] = ((float32*)C_2[((((m.outer32768) + (m.inner1024)) + (n.outer32)) + n.inner)] + ((float32)A_2[((((m.outer32768) + (m.inner1024)) + (k.outer4)) + k.inner)](float32*)B_2[((((k.outer4096) + (k.inner1024)) + (n.outer*32)) + n.inner)]))
}
}
}
}
}
}
}
向量化
另一個(gè)重要的技巧是向量化。當(dāng)內(nèi)存訪(fǎng)問(wèn)模式一致時(shí),編譯器可以檢測(cè)到這種模式,將連續(xù)內(nèi)存?zhèn)鬟f給向量處理器。在 TVM 中,可以使用vectorize接口,提示編譯器這種模式,這樣就可以大大加速。
選擇向量化內(nèi)循環(huán)行數(shù)據(jù),這是緩存友好的。
s = te.create_schedule(C.op)
mo, no, mi, ni = s[C].tile(C.op.axis[0], C.op.axis[1], bn, bn)
(kaxis,) = s[C].op.reduce_axis
ko, ki = s[C].split(kaxis, factor=kfactor)

s[C].reorder(mo, no, ko, ki, mi, ni)

Vectorization

s[C].vectorize(ni)

func = tvm.build(s, [A, B, C], target=target, name=“mmult”)
assert func

c = tvm.nd.array(numpy.zeros((M, N), dtype=dtype), dev)
func(a, b, c)
tvm.testing.assert_allclose(c.numpy(), answer, rtol=1e-5)

evaluator = func.time_evaluator(func.entry_name, dev, number=10)
print(“Opt2: %f” % evaluator(a, b, c).mean)
輸出:
Opt2: 0.341067
向量化后,生成的 IR。
print(tvm.lower(s, [A, B, C], simple_mode=True))
輸出:
primfn(A_1: handle, B_1: handle, C_1: handle) -> ()
attr = {“from_legacy_te_schedule”: True, “global_symbol”: “main”, “tir.noalias”: True}
buffers = {C: Buffer(C_2: Pointer(float32), float32, [1024, 1024], []),
A: Buffer(A_2: Pointer(float32), float32, [1024, 1024], []),
B: Buffer(B_2: Pointer(float32), float32, [1024, 1024], [])}
buffer_map = {A_1: A, B_1: B, C_1: C} {
for (m.outer: int32, 0, 32) {
for (n.outer: int32, 0, 32) {
for (m.inner.init: int32, 0, 32) {
C_2[ramp((((m.outer32768) + (m.inner.init1024)) + (n.outer32)), 1, 32)] = broadcast(0f32, 32)
}
for (k.outer: int32, 0, 256) {
for (k.inner: int32, 0, 4) {
for (m.inner: int32, 0, 32) {
C_2[ramp((((m.outer
32768) + (m.inner1024)) + (n.outer32)), 1, 32)] = ((float32x32*)C_2[ramp((((m.outer32768) + (m.inner1024)) + (n.outer32)), 1, 32)] + (broadcast((float32)A_2[((((m.outer32768) + (m.inner1024)) + (k.outer4)) + k.inner)], 32)(float32x32*)B_2[ramp((((k.outer4096) + (k.inner1024)) + (n.outer*32)), 1, 32)]))
}
}
}
}
}
}
循環(huán)排列
查看上面的 IR,可以看到 B 和 C 的內(nèi)循環(huán)行數(shù)據(jù),都進(jìn)行了向量化。接下來(lái),查看 A 的訪(fǎng)問(wèn)模式。在當(dāng)前調(diào)度中,A 是逐列訪(fǎng)問(wèn)的,這對(duì)緩存不友好. 如果改變 ki 和內(nèi)軸 mi 的嵌套循環(huán)順序,A 矩陣的訪(fǎng)問(wèn)模式,對(duì)緩存更友好。
s = te.create_schedule(C.op)
mo, no, mi, ni = s[C].tile(C.op.axis[0], C.op.axis[1], bn, bn)
(kaxis,) = s[C].op.reduce_axis
ko, ki = s[C].split(kaxis, factor=kfactor)

re-ordering

s[C].reorder(mo, no, ko, mi, ki, ni)
s[C].vectorize(ni)

func = tvm.build(s, [A, B, C], target=target, name=“mmult”)
assert func

c = tvm.nd.array(numpy.zeros((M, N), dtype=dtype), dev)
func(a, b, c)
tvm.testing.assert_allclose(c.numpy(), answer, rtol=1e-5)

evaluator = func.time_evaluator(func.entry_name, dev, number=10)
print(“Opt3: %f” % evaluator(a, b, c).mean)
輸出:
Opt3: 0.111449
循環(huán)排列后,生成的 IR。
print(tvm.lower(s, [A, B, C], simple_mode=True))
輸出:
primfn(A_1: handle, B_1: handle, C_1: handle) -> ()
attr = {“from_legacy_te_schedule”: True, “global_symbol”: “main”, “tir.noalias”: True}
buffers = {C: Buffer(C_2: Pointer(float32), float32, [1024, 1024], []),
A: Buffer(A_2: Pointer(float32), float32, [1024, 1024], []),
B: Buffer(B_2: Pointer(float32), float32, [1024, 1024], [])}
buffer_map = {A_1: A, B_1: B, C_1: C} {
for (m.outer: int32, 0, 32) {
for (n.outer: int32, 0, 32) {
for (m.inner.init: int32, 0, 32) {
C_2[ramp((((m.outer32768) + (m.inner.init1024)) + (n.outer32)), 1, 32)] = broadcast(0f32, 32)
}
for (k.outer: int32, 0, 256) {
for (m.inner: int32, 0, 32) {
for (k.inner: int32, 0, 4) {
C_2[ramp((((m.outer
32768) + (m.inner1024)) + (n.outer32)), 1, 32)] = ((float32x32*)C_2[ramp((((m.outer32768) + (m.inner1024)) + (n.outer32)), 1, 32)] + (broadcast((float32)A_2[((((m.outer32768) + (m.inner1024)) + (k.outer4)) + k.inner)], 32)(float32x32*)B_2[ramp((((k.outer4096) + (k.inner1024)) + (n.outer*32)), 1, 32)]))
}
}
}
}
}
}
陣列封裝
另一個(gè)重要的技巧是數(shù)組打包。訣竅是對(duì)多維數(shù)組的存儲(chǔ),進(jìn)行重新排序,展平存儲(chǔ)在一維內(nèi)存中后,按順序訪(fǎng)問(wèn)。
可以使用數(shù)組打包,解決 B 的訪(fǎng)問(wèn)模式。觀(guān)察扁平化后 B 的數(shù)組訪(fǎng)問(wèn)模式,在 K 維度上迭代時(shí),這不是連續(xù)的。可以用維度 [K][N] 重新排序 B,使其具有維度 [N/bn][K][bn],bn 是阻塞因子,也是內(nèi)循環(huán)中 B 的向量大小。這種重新排序,將 N 分成兩個(gè)維度 — bigN (N/bn) 和 littleN (bn) —新維度 [N/bn][K][bn] 匹配 B,從外循環(huán)到內(nèi)循環(huán)的索引(no, ko, ki, ni) ,在展平后,導(dǎo)致 B 的順序訪(fǎng)問(wèn)模式。

We have to re-write the algorithm slightly.

packedB = te.compute(
(N / bn, K, bn), lambda bigN, k, littleN: B[k, bigN * bn + littleN], name=“packedB”
)
C = te.compute(
(M, N),
lambda m, n: te.sum(A[m, k] * packedB[n // bn, k, tvm.tir.indexmod(n, bn)], axis=k),
name=“C”,
)

s = te.create_schedule(C.op)

mo, no, mi, ni = s[C].tile(C.op.axis[0], C.op.axis[1], bn, bn)
(kaxis,) = s[C].op.reduce_axis
ko, ki = s[C].split(kaxis, factor=kfactor)

s[C].reorder(mo, no, ko, mi, ki, ni)
s[C].vectorize(ni)

bigN, _, littleN = s[packedB].op.axis
s[packedB].vectorize(littleN)
s[packedB].parallel(bigN)

func = tvm.build(s, [A, B, C], target=target, name=“mmult”)
assert func

c = tvm.nd.array(numpy.zeros((M, N), dtype=dtype), dev)
func(a, b, c)
tvm.testing.assert_allclose(c.numpy(), answer, rtol=1e-5)

evaluator = func.time_evaluator(func.entry_name, dev, number=10)
print(“Opt4: %f” % evaluator(a, b, c).mean)
輸出:
Opt4: 0.217310
陣列打包后,生成的IR。
print(tvm.lower(s, [A, B, C], simple_mode=True))
輸出:
primfn(A_1: handle, B_1: handle, C_1: handle) -> ()
attr = {“from_legacy_te_schedule”: True, “global_symbol”: “main”, “tir.noalias”: True}
buffers = {C: Buffer(C_2: Pointer(float32), float32, [1024, 1024], []),
A: Buffer(A_2: Pointer(float32), float32, [1024, 1024], []),
B: Buffer(B_2: Pointer(float32), float32, [1024, 1024], [])}
buffer_map = {A_1: A, B_1: B, C_1: C} {
allocate(packedB: Pointer(global float32x32), float32x32, [32768]), storage_scope = global {
for (bigN: int32, 0, 32) “parallel” {
for (k: int32, 0, 1024) {
packedB[ramp(((bigN32768) + (k32)), 1, 32)] = (float32x32*)B_2[ramp(((k1024) + (bigN32)), 1, 32)]
}
}
for (m.outer: int32, 0, 32) {
for (n.outer: int32, 0, 32) {
for (m.inner.init: int32, 0, 32) {
C_2[ramp((((m.outer32768) + (m.inner.init1024)) + (n.outer32)), 1, 32)] = broadcast(0f32, 32)
}
for (k.outer: int32, 0, 256) {
for (m.inner: int32, 0, 32) {
for (k.inner: int32, 0, 4) {
C_2[ramp((((m.outer
32768) + (m.inner1024)) + (n.outer32)), 1, 32)] = ((float32x32*)C_2[ramp((((m.outer32768) + (m.inner1024)) + (n.outer32)), 1, 32)] + (broadcast((float32)A_2[((((m.outer32768) + (m.inner1024)) + (k.outer4)) + k.inner)], 32)(float32x32*)packedB[ramp((((n.outer32768) + (k.outer128)) + (k.inner*32)), 1, 32)]))
}
}
}
}
}
}
}
塊的寫(xiě)緩存
阻塞后,程序?qū)⒔Y(jié)果逐塊寫(xiě)入C,訪(fǎng)問(wèn)模式不是順序的。可以使用一個(gè)順序緩存數(shù)組,保存塊結(jié)果,在所有塊結(jié)果準(zhǔn)備好時(shí),寫(xiě)入 C。
s = te.create_schedule(C.op)

Allocate write cache

CC = s.cache_write(C, “global”)

mo, no, mi, ni = s[C].tile(C.op.axis[0], C.op.axis[1], bn, bn)

Write cache is computed at no

s[CC].compute_at(s[C], no)

New inner axes

mc, nc = s[CC].op.axis

(kaxis,) = s[CC].op.reduce_axis
ko, ki = s[CC].split(kaxis, factor=kfactor)
s[CC].reorder(ko, mc, ki, nc)
s[CC].vectorize(nc)

TODO: Add separate optimization step to discuss loop unrolloing

unrolling is a loop optimization strategy which can reduce branch

prediction failures and increases the chance of concurrent execution

unroll kfactor loops

s[CC].unroll(ki)

bigN, _, littleN = s[packedB].op.axis
s[packedB].vectorize(littleN)
s[packedB].parallel(bigN)

func = tvm.build(s, [A, B, C], target=target, name=“mmult”)
assert func

c = tvm.nd.array(numpy.zeros((M, N), dtype=dtype), dev)
func(a, b, c)
tvm.testing.assert_allclose(c.numpy(), answer, rtol=1e-5)

evaluator = func.time_evaluator(func.entry_name, dev, number=10)
print(“Opt5: %f” % evaluator(a, b, c).mean)
輸出:
Opt5: 0.215912
阻塞后,生成的IR。
print(tvm.lower(s, [A, B, C], simple_mode=True))
輸出:
primfn(A_1: handle, B_1: handle, C_1: handle) -> ()
attr = {“from_legacy_te_schedule”: True, “global_symbol”: “main”, “tir.noalias”: True}
buffers = {C: Buffer(C_2: Pointer(float32), float32, [1024, 1024], []),
A: Buffer(A_2: Pointer(float32), float32, [1024, 1024], []),
B: Buffer(B_2: Pointer(float32), float32, [1024, 1024], [])}
buffer_map = {A_1: A, B_1: B, C_1: C} {
allocate(packedB: Pointer(global float32x32), float32x32, [32768]), storage_scope = global;
allocate(C.global: Pointer(global float32), float32, [1024]), storage_scope = global {
for (bigN: int32, 0, 32) “parallel” {
for (k: int32, 0, 1024) {
packedB[ramp(((bigN32768) + (k32)), 1, 32)] = (float32x32*)B_2[ramp(((k1024) + (bigN32)), 1, 32)]
}
}
for (m.outer: int32, 0, 32) {
for (n.outer: int32, 0, 32) {
for (m.c.init: int32, 0, 32) {
C.global[ramp((m.c.init32), 1, 32)] = broadcast(0f32, 32)
}
for (k.outer: int32, 0, 256) {
for (m.c: int32, 0, 32) {
C.global[ramp((m.c
32), 1, 32)] = ((float32x32*)C.global[ramp((m.c32), 1, 32)] + (broadcast((float32)A_2[(((m.outer32768) + (m.c1024)) + (k.outer4))], 32)(float32x32*)packedB[ramp(((n.outer32768) + (k.outer128)), 1, 32)]))
C.global[ramp((m.c32), 1, 32)] = ((float32x32)C.global[ramp((m.c32), 1, 32)] + (broadcast((float32)A_2[((((m.outer32768) + (m.c1024)) + (k.outer4)) + 1)], 32)(float32x32*)packedB[ramp((((n.outer32768) + (k.outer128)) + 32), 1, 32)]))
C.global[ramp((m.c32), 1, 32)] = ((float32x32)C.global[ramp((m.c32), 1, 32)] + (broadcast((float32)A_2[((((m.outer32768) + (m.c1024)) + (k.outer4)) + 2)], 32)(float32x32*)packedB[ramp((((n.outer32768) + (k.outer128)) + 64), 1, 32)]))
C.global[ramp((m.c32), 1, 32)] = ((float32x32)C.global[ramp((m.c32), 1, 32)] + (broadcast((float32)A_2[((((m.outer32768) + (m.c1024)) + (k.outer4)) + 3)], 32)(float32x32*)packedB[ramp((((n.outer32768) + (k.outer128)) + 96), 1, 32)]))
}
}
for (m.inner: int32, 0, 32) {
for (n.inner: int32, 0, 32) {
C_2[((((m.outer32768) + (m.inner1024)) + (n.outer32)) + n.inner)] = (float32)C.global[((m.inner*32) + n.inner)]
}
}
}
}
}
}
并行化
可以利用多核處理器,進(jìn)行線(xiàn)程級(jí)并行化。
s = te.create_schedule(C.op)

CC = s.cache_write(C, “global”)

mo, no, mi, ni = s[C].tile(C.op.axis[0], C.op.axis[1], bn, bn)

s[CC].compute_at(s[C], no)

mc, nc = s[CC].op.axis

(kaxis,) = s[CC].op.reduce_axis
ko, ki = s[CC].split(kaxis, factor=kfactor)
s[CC].reorder(ko, mc, ki, nc)
s[CC].vectorize(nc)
s[CC].unroll(ki)

parallel

s[C].parallel(mo)

bigN, _, littleN = s[packedB].op.axis
s[packedB].vectorize(littleN)
s[packedB].parallel(bigN)

func = tvm.build(s, [A, B, C], target=target, name=“mmult”)
assert func

c = tvm.nd.array(numpy.zeros((M, N), dtype=dtype), dev)
func(a, b, c)
tvm.testing.assert_allclose(c.numpy(), answer, rtol=1e-5)

evaluator = func.time_evaluator(func.entry_name, dev, number=50)
opt6_time = evaluator(a, b, c).mean
print(“Opt6: %f” % opt6_time)
輸出:
Opt6: 0.066558
并行化后,生成的IR。
print(tvm.lower(s, [A, B, C], simple_mode=True))
輸出:
primfn(A_1: handle, B_1: handle, C_1: handle) -> ()
attr = {“from_legacy_te_schedule”: True, “global_symbol”: “main”, “tir.noalias”: True}
buffers = {C: Buffer(C_2: Pointer(float32), float32, [1024, 1024], []),
A: Buffer(A_2: Pointer(float32), float32, [1024, 1024], []),
B: Buffer(B_2: Pointer(float32), float32, [1024, 1024], [])}
buffer_map = {A_1: A, B_1: B, C_1: C} {
allocate(packedB: Pointer(global float32x32), float32x32, [32768]), storage_scope = global {
for (bigN: int32, 0, 32) “parallel” {
for (k: int32, 0, 1024) {
packedB[ramp(((bigN32768) + (k32)), 1, 32)] = (float32x32*)B_2[ramp(((k1024) + (bigN32)), 1, 32)]
}
}
for (m.outer: int32, 0, 32) “parallel” {
allocate(C.global: Pointer(global float32), float32, [1024]), storage_scope = global;
for (n.outer: int32, 0, 32) {
for (m.c.init: int32, 0, 32) {
C.global[ramp((m.c.init32), 1, 32)] = broadcast(0f32, 32)
}
for (k.outer: int32, 0, 256) {
for (m.c: int32, 0, 32) {
C.global[ramp((m.c
32), 1, 32)] = ((float32x32*)C.global[ramp((m.c32), 1, 32)] + (broadcast((float32)A_2[(((m.outer32768) + (m.c1024)) + (k.outer4))], 32)(float32x32*)packedB[ramp(((n.outer32768) + (k.outer128)), 1, 32)]))
C.global[ramp((m.c32), 1, 32)] = ((float32x32)C.global[ramp((m.c32), 1, 32)] + (broadcast((float32)A_2[((((m.outer32768) + (m.c1024)) + (k.outer4)) + 1)], 32)(float32x32*)packedB[ramp((((n.outer32768) + (k.outer128)) + 32), 1, 32)]))
C.global[ramp((m.c32), 1, 32)] = ((float32x32)C.global[ramp((m.c32), 1, 32)] + (broadcast((float32)A_2[((((m.outer32768) + (m.c1024)) + (k.outer4)) + 2)], 32)(float32x32*)packedB[ramp((((n.outer32768) + (k.outer128)) + 64), 1, 32)]))
C.global[ramp((m.c32), 1, 32)] = ((float32x32)C.global[ramp((m.c32), 1, 32)] + (broadcast((float32)A_2[((((m.outer32768) + (m.c1024)) + (k.outer4)) + 3)], 32)(float32x32*)packedB[ramp((((n.outer32768) + (k.outer128)) + 96), 1, 32)]))
}
}
for (m.inner: int32, 0, 32) {
for (n.inner: int32, 0, 32) {
C_2[((((m.outer32768) + (m.inner1024)) + (n.outer32)) + n.inner)] = (float32)C.global[((m.inner*32) + n.inner)]
}
}
}
}
}
}
總結(jié)
僅用 18 行代碼,應(yīng)用上述簡(jiǎn)單優(yōu)化后,生成的代碼,可以使用 MKL實(shí)現(xiàn)numpy性能的60% 。輸出反映了非排他性 Docker 容器上的運(yùn)行時(shí)間,是不可靠的。強(qiáng)烈建議自己運(yùn)行,觀(guān)察 TVM 實(shí)現(xiàn)的性能提升。

參考鏈接:
https://tvm.apache.org/docs/tutorials/optimize/opt_gemm.html

總結(jié)

以上是生活随笔為你收集整理的如何在 CPU 上优化 GEMM的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

久久精品79国产精品 | 婷婷午夜| 人人澡人摸人人添学生av | 成人在线观看av | 亚洲精品国产日韩 | 天天爽天天射 | 日韩精品一区电影 | 在线观看a视频 | 日韩视频免费 | 国产精品永久免费 | 国产成人久久精品一区二区三区 | 91爱爱网址| 色综合 久久精品 | 欧美日韩在线视频免费 | 午夜久久久影院 | 五月天丁香综合 | 免费人成在线观看网站 | 99久e精品热线免费 99国产精品久久久久久久久久 | 日av免费| 日韩高清免费在线 | 亚洲成成品网站 | 国产裸体视频bbbbb | www国产一区 | 久久精品一区八戒影视 | 在线成人短视频 | 欧美黄在线 | 国产视频黄 | 国产成人精品一区在线 | 国产视频在线观看免费 | 中文在线天堂资源 | 亚洲欧洲av在线 | 亚洲一级黄色片 | 色视频国产直接看 | h视频日本 | 激情视频免费观看 | 最近中文字幕在线中文高清版 | 中文字幕二区三区 | 欧洲精品亚洲精品 | 国产午夜在线观看视频 | 国产色视频123区 | av电影免费看 | 久久综合99 | 黄色网在线免费观看 | 久久综合色天天久久综合图片 | 久久婷婷五月综合色丁香 | 欧美一区二视频在线免费观看 | 夜夜骑天天操 | 美女av在线免费 | 在线 成人 | 99精品系列 | 免费在线日韩 | 美女久久| 精品99视频 | 四虎国产永久在线精品 | 欧美特一级 | 99999精品视频 | 91粉色视频 | 91综合色| 久久国产亚洲精品 | 国产精品岛国久久久久久久久红粉 | 亚洲精品视频免费观看 | 国产亚洲字幕 | 成人一级在线 | 成人中文字幕+乱码+中文字幕 | 超碰激情在线 | 国产91对白在线播 | 亚洲 欧美 综合 在线 精品 | 久久人人精品 | 亚洲黄色av一区 | 国产成人精品一区二区 | 97人人澡人人添人人爽超碰 | 久久久久久毛片精品免费不卡 | 色网站国产精品 | 久久精品一二三区 | 中文字幕乱码亚洲精品一区 | 国产成人黄色网址 | avcom在线| 国产91精品看黄网站 | 久久精品国产一区 | 欧美日韩国产在线精品 | 狠狠的干狠狠的操 | 91av亚洲| 一本之道乱码区 | 国产福利精品在线观看 | 欧美一二区在线 | 91免费日韩 | 欧美韩国在线 | 久草视频99 | 亚洲区精品视频 | www狠狠操| 婷婷丁香花五月天 | 日本电影黄色 | a色视频| 美女搞黄国产视频网站 | 中文字幕在线观看2018 | a爱爱视频 | 911久久| 五月婷婷色综合 | 国产一级久久久 | 国产高清专区 | 日韩在线电影观看 | 成人av观看 | 久久久国产精品亚洲一区 | 亚洲成人精品在线观看 | 激情电影在线观看 | 久久影视一区二区 | 国产成人福利在线 | 天天搞天天干天天色 | 在线观看视频你懂的 | 99热国产在线 | 91精品国产乱码久久桃 | 1000部国产精品成人观看 | 欧美 日韩 国产 中文字幕 | 日韩在线视频观看免费 | 久久精品91久久久久久再现 | 免费看的黄色录像 | 激情av资源 | 欧美在线一 | 精品1区2区3区 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 久草在线久 | 91精品国产成人 | 色之综合网 | 国产特级毛片aaaaaa高清 | 又黄又爽又刺激视频 | 国产黄色免费电影 | 日韩动漫免费观看高清完整版在线观看 | 最新国产中文字幕 | 免费看片网址 | 国产成人精品一区二区三区免费 | 国产成人精品在线播放 | 波多野结衣一区二区三区中文字幕 | 国产视频在线观看一区 | av亚洲产国偷v产偷v自拍小说 | 日日摸日日添夜夜爽97 | 国内精品久久久久久 | 1024久久| 精品一区在线 | 久久国产露脸精品国产 | 色婷婷综合视频在线观看 | 在线视频久| 欧美在线一二区 | 国产精品国产三级国产aⅴ无密码 | 久久精品中文字幕免费mv | 天天干天天插伊人网 | 91在线免费观看网站 | av电影在线观看完整版一区二区 | 亚洲在线看 | 久久理论电影 | 91av在线视频播放 | 国产精品久久久久久久久久东京 | 日本女人的性生活视频 | 黄色免费网战 | 国产亚洲精品久久久久秋 | 精品女同一区二区三区在线观看 | 一区二区三区中文字幕在线观看 | 色综合色综合色综合 | 亚洲全部视频 | 精品国产伦一区二区三区 | 最近中文字幕国语免费高清6 | 久久a国产 | 五月婷婷播播 | 日韩专区一区二区 | 欧美精品乱码久久久久久按摩 | 一区二区三区在线视频观看58 | 日韩专区中文字幕 | 日本二区三区在线 | 精品乱码一区二区三四区 | 国产一区二区不卡视频 | 国产福利一区二区在线 | 成人动漫一区二区 | 成人黄色大片 | 成年人视频在线观看免费 | 在线观看成人av | 99久久久国产精品免费观看 | 97在线影视 | 国产专区一 | 嫩小bbbb摸bbb摸bbb | 欧美日韩视频观看 | 国产视频精品久久 | 天天操天天色综合 | 人人爽人人澡人人添人人人人 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 免费国产黄线在线观看视频 | 精品免费一区 | 午夜国产一区二区 | 97超碰在线资源 | 亚洲黄色区 | 欧美a在线免费观看 | 99精品视频免费观看 | 久久精品一区二区三 | 伊人天天综合 | 久久精品视频免费观看 | 天天色宗合 | 色网站中文字幕 | 久久精品欧美日韩精品 | 黄色www在线观看 | 99电影456麻豆 | 久草青青在线观看 | 久久精品看 | 久久99最新地址 | 麻豆视频一区二区 | 久久99国产精品视频 | 五月天色丁香 | av在线免费网 | 日韩aa视频| 美女久久网站 | se婷婷 | 国产三级视频在线 | 免费网站在线观看成人 | 91中文在线 | 色综合久久中文综合久久牛 | 国产成人av电影在线观看 | 高清免费在线视频 | 九九在线免费视频 | 麻豆视频免费观看 | 国产福利精品在线观看 | 中文字幕成人网 | 91精品老司机久久一区啪 | 一二区电影 | a黄色片| 欧美精品在线观看 | 国产精品免费久久久久久 | 亚洲精品视频中文字幕 | 天天草天天摸 | 久久久免费少妇 | 精品国产免费人成在线观看 | 亚洲片在线 | 色综合天天色 | 又紧又大又爽精品一区二区 | 久久久久婷 | 九九九九色 | 国产一区二区在线看 | 能在线观看的日韩av | 中文字幕在线观看网址 | 久久人人添人人爽添人人88v | 一级黄色在线免费观看 | 久久99视频 | 97超碰在线久草超碰在线观看 | 99久国产 | 国产99久久九九精品 | 欧美日韩国产精品一区二区三区 | 亚洲欧美国产精品久久久久 | 久久久久久久久毛片精品 | 999ZYZ玖玖资源站永久 | 中文字幕色站 | 亚洲午夜精品一区二区三区电影院 | 国产成人久久久77777 | 韩日成人av | 丁香视频 | 日韩毛片精品 | 天天射网站| 99视频在线精品国自产拍免费观看 | www.国产在线观看 | 91精品电影 | 国内精品久久久久久久久久久 | 久久久亚洲麻豆日韩精品一区三区 | 国产高清不卡在线 | 看国产黄色片 | 国产精品乱码一区二区视频 | 9999免费视频 | 亚洲va欧洲va国产va不卡 | 少妇视频一区 | 久久九九久久精品 | 日韩夜夜爽 | 91亚洲视频在线观看 | 91黄色小网站 | 欧美色操| 五月天激情婷婷 | 国产一区在线视频 | 狠狠干综合网 | 国产黄色美女 | 久久综合久久八八 | 国产成人a v电影 | 最新中文字幕在线资源 | 久久精品久久久久电影 | 国产精品普通话 | 中文字幕制服丝袜av久久 | 亚洲欧洲精品一区 | 精选久久 | av成人免费 | 国产精品免费高清 | 久久久成人精品 | 欧美 另类 交 | 91av色| 欧美成人精品三级在线观看播放 | 天天激情 | av短片在线 | 蜜臀aⅴ国产精品久久久国产 | 国产精品久久久免费看 | 999久久国精品免费观看网站 | 欧美国产大片 | 免费精品在线 | 亚洲精品欧美成人 | 国产一区精品在线 | 久久精品牌麻豆国产大山 | 国产中文字幕在线 | 久久精品网站视频 | 性色av免费看| 国产一二区免费视频 | 激情丁香婷婷 | 免费看色网站 | 在线午夜 | 又黄又刺激的网站 | 国产 成人 久久 | 色偷偷88888欧美精品久久久 | 久久久久久久久久久福利 | 人人爽爽人人 | 久久久福利视频 | 9999在线| 91xav| 精品一区二区三区四区在线 | 国产成人久 | 黄色av播放| 日韩资源在线 | 4p变态网欧美系列 | 国产特级毛片aaaaaa高清 | 欧美日韩在线播放 | 日日干激情五月 | 91中文字幕永久在线 | 天天干天天玩天天操 | 国产精品一区二区久久国产 | 亚洲成人精品在线观看 | 亚洲国产丝袜在线观看 | 97视频在线观看网址 | 99综合久久 | 国产一区在线看 | www.91av在线| 天天草天天干 | 麻豆高清免费国产一区 | 91成人欧美 | 97超碰在线久草超碰在线观看 | 九月婷婷综合网 | 在线看国产一区 | 久久99久久99精品中文字幕 | 欧美一区二区三区不卡 | 久久久国产精品人人片99精片欧美一 | 日韩在线不卡视频 | 在线观看一区视频 | 九九久久在线看 | 国产成人高清在线 | 久久不见久久见免费影院 | 69av网| 国产亚洲成人网 | 亚洲第一区在线播放 | 国产精品福利午夜在线观看 | 午夜在线日韩 | 亚洲精品乱码久久久久 | 最近日本字幕mv免费观看在线 | 808电影免费观看三年 | 国产亚洲精品久久久久久电影 | 四虎国产免费 | 久久中文精品视频 | 麻豆久久 | 国产在线毛片 | 五月激情丁香婷婷 | 亚洲天堂香蕉 | 久久午夜鲁丝片 | 91九色蝌蚪视频网站 | 免费观看性生活大片 | 亚洲精品看片 | 亚洲日本成人 | 久久久国产一区二区 | av免费电影在线观看 | 夜夜狠狠| 在线视频 国产 日韩 | 狠狠色丁香九九婷婷综合五月 | 日韩无在线 | 日批在线看 | 色资源在线观看 | 亚洲波多野结衣 | 日韩av播放在线 | 天堂网中文在线 | 午夜免费福利视频 | 国产亚洲精品久久久久久久久久久久 | 欧美性色黄 | 久久9999久久免费精品国产 | 激情网五月婷婷 | www.亚洲精品视频 | 中文av不卡 | 涩涩网站在线观看 | 久久久午夜电影 | 九九免费观看全部免费视频 | 婷色在线 | 亚洲综合狠狠干 | 精品免费视频 | 日本在线观看中文字幕 | 免费看黄色毛片 | 国内精品久久影院 | 色激情在线 | 九九视频在线观看视频6 | 又黄又刺激视频 | 成人一级在线观看 | 天天在线免费视频 | 亚洲日本中文字幕在线观看 | 国产又黄又爽又猛视频日本 | 在线视频中文字幕一区 | 波多野结衣在线观看视频 | 91网站在线视频 | av免费电影在线 | 91视频免费看 | 色瓜| 涩涩色亚洲一区 | 少妇高潮流白浆在线观看 | 亚洲精品美女久久17c | 欧美午夜视频在线 | 国产黄a三级三级三级三级三级 | 久久久亚洲网站 | 国产精品av免费在线观看 | 97在线视频免费 | 免费色婷婷 | 国产高清不卡 | 亚洲精品国产精品国自产观看浪潮 | 日韩激情视频在线观看 | 午夜精品一区二区三区在线观看 | 欧美精品免费一区二区 | 夜夜操网站 | 91av视频在线免费观看 | 亚洲成av | 国产精品久久久久久高潮 | 亚洲精品在线观看视频 | 狠狠色伊人亚洲综合网站色 | 日韩av中文字幕在线免费观看 | 久久伊人色综合 | 欧美精品v国产精品 | 午夜色婷婷 | 久久综合久久伊人 | 在线国产视频一区 | 人人爽人人乐 | 狠狠伊人| 国产精品自产拍在线观看蜜 | 天天爽天天爽天天爽 | 日韩免费在线视频 | 婷婷丁香激情综合 | 91精品蜜桃| 日韩精品三区四区 | 日韩精品极品视频 | 亚洲精品国产综合99久久夜夜嗨 | 久久这里只有精品23 | 色国产在线| 天天综合天天做 | 国产美女精彩久久 | 欧美激情综合五月色丁香小说 | 日本免费一二三区 | 亚洲无吗视频在线 | 色综合天天狠天天透天天伊人 | 91网页版在线观看 | 免费网站在线 | 青草视频免费观看 | 黄色av一级片 | 亚洲国产精品一区二区久久,亚洲午夜 | 三级av中文字幕 | 色综合激情网 | 在线看成人 | 国产精品精品久久久久久 | 精品麻豆 | 在线观看av麻豆 | 中文伊人 | 97精品一区二区三区 | 99视频精品免费视频 | 久久久久久久免费看 | 亚洲欧美国产日韩在线观看 | 日韩网站中文字幕 | 欧美精品在线视频 | 手机看片 | 午夜12点 | 天天操天天透 | 国产v在线播放 | 五月导航| a资源在线 | 久久情爱 | 四虎国产永久在线精品 | 日韩影视在线观看 | 免费电影一区二区三区 | 免费久久99精品国产 | 天天操天天射天天爽 | 国产又粗又猛又黄又爽视频 | 一区二区av | 俺要去色综合狠狠 | 日b黄色片 | 天天干天天操天天拍 | 国产淫片免费看 | 国产在线a免费观看 | 日韩av进入| 91精品国自产在线偷拍蜜桃 | 激情五月***国产精品 | 五月综合 | 在线国产激情视频 | 国产精品久久久久久影院 | 成人av在线电影 | 91精品一| 99久久精品免费看国产 | 正在播放 久久 | 国产精品理论在线观看 | 98精品国产自产在线观看 | 亚洲精品99久久久久久 | 91精品久久久久久久91蜜桃 | 一级欧美日韩 | 超碰在线人人 | 99在线观看免费视频精品观看 | 免费观看成人av | 91麻豆精品国产91 | 西西人体4444www高清视频 | a黄在线观看 | 99精品视频在线观看免费 | 免费精品 | 日批视频在线观看免费 | 婷婷5月激情5月 | av片一区| 91久久久久久久一区二区 | 国产高清久久久 | 天堂在线一区二区 | 91成人短视频在线观看 | 国产精品一区二区av日韩在线 | 狠狠狠狠狠狠天天爱 | 欧美性春潮 | 国产一级二级三级在线观看 | 国产青青青 | 国产午夜精品av一区二区 | 欧美性护士 | 国产成人高清在线 | 国产精品美女久久久免费 | 国产精品久久一区二区三区, | 天天草天天草 | 国产麻豆视频在线观看 | 丝袜美腿av | 国产一级视频在线 | 国产专区精品视频 | 久久无码精品一区二区三区 | 国产精品久久久久久爽爽爽 | 深爱激情五月综合 | 婷婷久久一区二区三区 | 国产剧情久久 | 国产美女在线精品免费观看 | 日韩亚洲国产精品 | 国产不卡在线播放 | 色视频在线免费 | 成人a毛片 | 亚洲精品麻豆视频 | 国产精品男女 | www.五月婷| 久久久久久久久久久久电影 | 亚洲精品国产片 | 狠狠伊人 | 中文在线www| av高清在线 | 日韩69视频| 国产精品久久久久久久久费观看 | 色综合a| 麻豆91在线 | 国产五月色婷婷六月丁香视频 | 正在播放久久 | 黄色精品一区二区 | 久久久午夜影院 | 欧美日韩一区二区三区在线观看视频 | 狠狠狠综合 | 午夜123| 麻豆94tv免费版 | 色姑娘综合网 | 国产丝袜制服在线 | 精品国模一区二区 | 99色99| 天天操夜夜操国产精品 | 久久99视频免费 | 日韩高清在线一区 | 成人久久久久久久久久 | 九色琪琪久久综合网天天 | 亚洲欧美视频一区二区三区 | 亚洲精品一区中文字幕乱码 | 久久综合偷偷噜噜噜色 | 国产黄色片一级三级 | 99视频久久| 国产二区视频在线观看 | 99九九99九九九视频精品 | 99精品国自产在线 | 午夜久久影视 | 久久久国产精华液 | 激情综合网天天干 | 91久久久久久久一区二区 | 国产h片在线观看 | av在线免费播放网站 | 欧美成人精品三级在线观看播放 | 日韩在线视频观看免费 | 人人干干人人 | 一本一本久久aa综合精品 | 97香蕉视频 | 麻豆传媒电影在线观看 | 一区二区三区四区精品视频 | 天天操天天玩 | 亚洲精品美女在线观看 | 亚洲3级| 一区国产精品 | 91精品国产综合久久婷婷香蕉 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 99色婷婷| 精品久久久久一区二区国产 | 91免费看片黄 | 欧洲性视频| 日韩高清一二三区 | 色婷婷九月 | 国产精品国产三级国产aⅴ入口 | 日韩av手机在线观看 | 欧美日韩伦理一区 | a视频免费在线观看 | 久久国产精品一区二区三区四区 | 日韩欧美在线影院 | 三级视频日韩 | 国产999在线 | 国产福利91精品 | 亚洲另类视频在线 | 狠狠色丁香婷婷综合久小说久 | 天天干婷婷 | 在线观看日韩视频 | 91传媒在线播放 | 黄色av电影在线观看 | 99在线热播精品免费99热 | 狠狠狠狠狠狠操 | 久久99中文字幕 | 伊人婷婷色 | 精品一区二区视频 | 国产一区在线视频观看 | 天天曰| 又爽又黄又刺激的视频 | 久草视频免费在线播放 | 2019中文字幕第一页 | 成人a v视频 | www日韩在线观看 | av综合网址 | 久草在线99 | 国产精品久久久久av免费 | 亚洲色影爱久久精品 | 日本中文字幕网 | 最新日韩在线观看视频 | 日韩精品久久一区二区三区 | 久久国产经典视频 | 成人国产亚洲 | 亚洲精品久久久久中文字幕二区 | 日韩欧美一区二区三区在线观看 | 日韩a欧美 | 天天天天天天天操 | 丁香高清视频在线看看 | 精品国产一区二区三区男人吃奶 | 日韩特黄av | 天天干夜夜爱 | 国产精品福利在线观看 | 国产啊v在线观看 | 成人黄色一级视频 | 久久天堂网站 | 国产精品自产拍在线观看桃花 | 综合色影院 | 97超碰人人澡 | 在线有码中文 | 伊人狠狠操 | a天堂中文在线 | 久久久久免费观看 | 国产一级片免费视频 | 国产美女视频免费观看的网站 | 亚洲精品午夜久久久久久久久久久 | 日本69hd | 成年人电影毛片 | 久久久久这里只有精品 | 国产日本亚洲 | 免费看一级特黄a大片 | 97免费在线观看视频 | 国产精品久久久久久影院 | 五月婷婷免费 | 色妞色视频一区二区三区四区 | 337p西西人体大胆瓣开下部 | 亚洲国产丝袜在线观看 | av天天在线观看 | 国产免费又粗又猛又爽 | 欧美日韩视频一区二区三区 | 国产偷v国产偷∨精品视频 在线草 | 亚洲视频久久久久 | 成人在线免费看视频 | 激情五月激情综合网 | 色婷婷伊人 | 国产亚洲激情视频在线 | 四虎影视8848dvd | 国产免费观看视频 | 亚洲乱码精品久久久久 | 99久久久国产精品 | 亚洲aⅴ免费在线观看 | 福利二区视频 | 正在播放久久 | 色91在线| 亚洲视频 一区 | 欧美性受极品xxxx喷水 | 国产喷水在线 | 久久久久久久久久久久久国产精品 | 毛片基地黄久久久久久天堂 | 狠狠色噜噜狠狠 | 一级淫片在线观看 | 日日夜夜骑 | 午夜在线国产 | 免费看日韩 | 国产免费黄视频在线观看 | 久久国产精品久久国产精品 | 91av在线看 | 日韩电影中文字幕 | 精品一区精品二区高清 | 在线观看亚洲视频 | 狠狠色丁香婷婷综合 | 日日摸日日| 182午夜在线观看 | 天天草天天 | 国产福利91精品一区二区三区 | 免费看国产a | 国产精品免费不卡 | 成人黄色小说视频 | 91精品国产91p65 | 久久综合九色99 | 久久噜噜少妇网站 | 国产成人精品久久久 | 天天操天天摸天天爽 | 欧美精品免费在线观看 | 最新中文字幕在线播放 | 玖操 | 亚洲va韩国va欧美va精四季 | 天天色天天射天天操 | 中文字幕在线观看完整 | 黄色成人影院 | 日韩理论在线 | 日韩精品免费在线 | 久久天天躁 | 人人超碰97 | 日本久久久久久科技有限公司 | 国产永久免费观看 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 中文字幕黄色av | 色综合久久久久综合 | 日韩毛片一区 | 91资源在线| 成年人天堂com | 亚洲免费av在线播放 | 在线精品亚洲一区二区 | 午夜精品久久久久久久爽 | 一区二区日韩av | 在线91色 | 久草在线最新 | 韩国av免费 | 久久综合久久综合久久综合 | 成人午夜免费福利 | 亚洲美女在线国产 | 亚洲精品日韩一区二区电影 | 欧美日韩性视频在线 | 懂色av一区二区在线播放 | 波多野结衣视频一区二区 | 天天射天天添 | 六月丁香在线观看 | www.久久99| 最近免费观看的电影完整版 | 欧美日韩视频精品 | 免费三级av | 久久黄色免费视频 | 九九热视频在线播放 | 日本一区二区三区免费看 | 久久激情视频 久久 | 免费观看丰满少妇做爰 | www久久精品 | 亚洲精品乱码久久久久v最新版 | 一区二区三区日韩视频在线观看 | 免费国产视频 | 亚洲精品www. | 欧美另类xxxx | 色视频在线观看 | 91久久人澡人人添人人爽欧美 | 一区二区三区中文字幕在线 | 国产一区二区三区免费观看视频 | 中文字幕在线播放第一页 | 日韩久久一区二区 | 国产又黄又爽无遮挡 | 久久高清片 | 精品亚洲va在线va天堂资源站 | 91正在播放 | 一区二区视频在线免费观看 | 欧美日本中文字幕 | 99精品视频在线观看免费 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 久射网| 亚洲免费精品视频 | 99精品国产免费久久久久久下载 | 国产午夜精品一区二区三区 | 日韩小视频网站 | 成年人在线电影 | 好看的国产精品视频 | www激情网 | 日日干av | 久久精品综合视频 | 97品白浆高清久久久久久 | 国内精品久久久久久 | 日韩美一区二区三区 | 日韩欧美v | 免费黄色特级片 | 国产精品一区二区在线免费观看 | 国产一级黄色免费看 | 日韩91av| 欧美极度另类性三渗透 | 日韩成人在线免费观看 | 黄色aa久久 | 中文字幕精品www乱入免费视频 | 久久久久免费观看 | 日本中文字幕在线观看 | 91精品办公室少妇高潮对白 | 99久久久久久久久久 | 免费又黄又爽视频 | 在线看的av网站 | 亚洲精品乱码久久久久v最新版 | 天天干 夜夜操 | 国产成人a v电影 | 国产色区| 丁香花中文在线免费观看 | 四虎影视www | 亚洲一级片免费观看 | 国精产品永久999 | av在线播放免费 | 一级一片免费看 | 国内综合精品午夜久久资源 | 精品久久久久久久久久久久久久久久 | 天天操人人干 | 国产成本人视频在线观看 | 国产91成人在在线播放 | 亚洲天堂网视频 | 狠狠狠色丁香婷婷综合激情 | 免费网站看av片 | 欧美91精品久久久久国产性生爱 | 天天综合网久久 | 9ⅰ精品久久久久久久久中文字幕 | 99久视频| 久草在线久草在线2 | 日韩三级免费观看 | 欧美日韩高清一区二区三区 | 久久影院一区 | 中字幕视频在线永久在线观看免费 | 97色免费视频 | 中文字幕在线视频精品 | 一区二区三区在线视频111 | 亚洲激情综合 | 日韩一区二区免费播放 | 国产午夜在线 | 婷婷色狠狠 | 免费观看日韩av | www日韩精品 | 久草在| 国产99在线免费 | japanesexxxhd奶水 91在线精品一区二区 | 亚洲在线精品 | 日本中文在线播放 | 久草爱视频 | 亚洲国产无 | 99久久精品免费看国产一区二区三区 | 精品国产免费av | 黄色软件视频大全免费下载 | 狠狠成人 | 国产99久久久欧美黑人 | 成人 国产 在线 | 最近中文字幕在线播放 | 91免费的视频在线播放 | 国产一区视频导航 | 中文字幕亚洲国产 | 最近日本韩国中文字幕 | 国产日女人 | 狠狠操狠狠干天天操 | av手机在线播放 | 一区二区三区精品在线视频 | 99re中文字幕 | 精品女同一区二区三区在线观看 | 超碰av在线免费观看 | 欧美在线观看禁18 | 中文字幕av免费 | 精品亚洲欧美无人区乱码 | 99riav1国产精品视频 | 91九色porny蝌蚪视频 | 中文字幕一区二区三区四区在线视频 | 亚洲精品久久久蜜桃 | 亚洲精品美女久久久久网站 | 99色在线播放| 欧美日韩在线观看一区二区 | 欧美粗又大 | 四虎成人精品 | 中文字幕 成人 | 亚洲视频综合 | 999抗病毒口服液 | 欧美亚洲成人xxx | av免费观看高清 | 国产精品毛片一区二区 | 国产福利免费在线观看 | 国产精品情侣视频 | 久久影视网 | 中文字幕精品三级久久久 | 99热这里精品 | 欧美一区二区三区在线视频观看 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 麻豆国产露脸在线观看 | 久久精品久久精品久久精品 | 日韩国产精品一区 | 一区二区三区在线观看 | www.色午夜.com | 日本久久久久久 | 日韩网站在线看片你懂的 | 婷婷在线免费观看 | 久久精品伊人 | av九九 | 国产欧美在线一区二区三区 | 亚州成人av在线 | www日日| 日日日日干 | 日韩一级电影在线观看 | 国产最顶级的黄色片在线免费观看 | 亚洲国产高清视频 | 中文字幕一区二区在线播放 | 午夜精品一区二区国产 | www中文在线 | 国产一区二区在线免费视频 | 99热手机在线观看 | 精品国产乱子伦一区二区 | 久久一视频 | 国产青青青 | 中文字幕视频播放 | 久草香蕉在线 | 开心色激情网 | 在线视频 国产 日韩 | 一区二区三区免费在线观看视频 | 亚洲欧洲一区二区在线观看 | 99久久久国产精品 | 亚洲资源一区 | 婷婷丁香五 | 国产日产高清dvd碟片 | 亚洲一区黄色 | 欧美精品一级视频 | 国产中文字幕视频 | 国产91全国探花系列在线播放 | 免费观看国产精品 | 亚洲人成人在线 | 视频一区二区三区视频 | 五月天亚洲精品 | 久久视频二区 | 久保带人 | 日韩婷婷 | 婷婷丁香六月天 | 国产精品永久久久久久久www | 99久久久成人国产精品 | 综合色中文 | 97视频在线播放 | 九九热av| 天堂av高清 | 欧美性色综合网 | 国产午夜视频在线观看 | 国产一区二区三区四区在线 | 国产九九九视频 | 久色网 | 欧美一区二区免费在线观看 | 久草在线视频网站 | 久久激情五月丁香伊人 | 国产精品精品国产婷婷这里av | 日韩国产精品久久 | 久久久久久网 | 天天色天天操天天爽 | 最近乱久中文字幕 | 狠狠色丁香 | 国产视频精品免费 | 久久私人影院 | 丁香一区二区 | 日韩国产高清在线 | 国产精品毛片一区二区 | 少妇性色午夜淫片aaaze | av蜜桃在线 | 免费看黄20分钟 | 91日韩在线 | 国产一区视频在线 | 免费在线a | 亚洲欧美日韩中文在线 | 日韩在线高清免费视频 | 亚洲春色综合另类校园电影 | 亚洲免费观看视频 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 久久亚洲国产精品 | 蜜桃视频在线视频 | 91av国产视频 | 国产精品免费在线播放 | 91最新视频在线观看 | 亚洲成av片人久久久 | 天堂av免费看 | 激情文学综合丁香 | 国产免费亚洲高清 | 亚洲在线视频播放 | 国产精品福利一区 | 亚洲精品综合一二三区在线观看 | 久久综合偷偷噜噜噜色 | 久久国语 | 亚洲高清色综合 | 久草视频免费观 | 欧美日韩国产免费视频 | 国产精品二区在线观看 | 久久视频在线视频 | 午夜国产一区 | 五月婷婷六月丁香 | 欧美二区视频 |