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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

如何在CPU上优化GEMM矩阵乘法

發布時間:2023/11/28 生活经验 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在CPU上优化GEMM矩阵乘法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如何在CPU上優化GEMM矩陣乘法
How to optimize GEMM on CPU
(TL;DR) TVM 提供抽象接口,允許用戶分別描述算法和算法的實現組織(所謂的調度)。通常,在高性能調度中編寫算法會破壞算法的可讀性和模塊化。此外,嘗試各種看似有希望的調度也很耗時。在 TVM 的幫助下,可以有效地嘗試這些調度以提高性能。
在本文中,將演示如何使用 TVM 優化方陣乘法,通過簡單地添加 18 行額外代碼實現比基線快 200 倍。
在 CPU 上執行的密集計算應用程序有兩個重要的優化:
? 提高內存訪問的緩存命中率。復雜的數值計算和熱點內存訪問都可以通過高緩存命中率加速。這需要將原始內存訪問模式轉換為適合緩存策略的模式。
? SIMD(單指令多數據),或者稱之為向量處理單元。每次都會處理一小批數據,不是單個網格。這需要以統一模式轉換循環體中的數據訪問模式,以便 LLVM 后端可以將其降低為 SIMD。
實際上,本文中使用的所有方法,都是本repo 中提到的技巧的一個子集 。其中一些已被 TVM 抽象自動應用,但由于 TVM 的限制,其中一些不能簡單地應用。
下面提到的所有實驗結果,都是在配備 Intel i7-4770HQ CPU 的 2015 年的 15’ MacBook 上執行的。對于所有 x86 CPU,緩存行大小應為 64 字節。
準備和基線
在本文中,將演示如何使用 TVM 優化矩陣乘法。在實際演示前,先定義這些變量。然后編寫一個基線實現,這是在 TVM 中編寫矩陣乘法的最簡單方法。
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 = “llvm”
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.009229
Baseline: 3.340634
在 TVM 中,始終可以檢查較低級別的 IR 以調試或優化調度。這是使用基線調度生成的 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)]))
}
}
}
}
阻塞
提高緩存命中率的一個重要技巧是阻塞——數據塊將逐塊計算。塊內部的內存訪問是一個具有高內存局部性的小鄰域。在本文中,選擇了 32 作為分塊因子。所以該塊將填充32 * 32 * sizeof(float),即總大小為32KB的緩存中的4KB(L1數據緩存)
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.295032
這是阻塞后生成的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)]))
}
}
}
}
}
}
}
矢量化
另一個重要的技巧是矢量化。當內存訪問模式一致時,編譯器可以檢測到這種模式,將連續內存傳遞給向量處理器。在 TVM 中,可以使用vectorize接口,提示編譯器這種模式,這樣就可以大大加速。
在本文中,選擇矢量化內循環行數據,因為對緩存友好。
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.331193
這是矢量化后生成的 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)]))
}
}
}
}
}
}
循環排列
如果查看上面的 IR,可以看到 B 和 C 的內循環行數據,都進行了向量化。接下來將查看 A 的訪問模式。在當前調度中,A 是逐列訪問的,這對緩存不友好. 如果改變 ki 和內軸 mi 的嵌套循環順序,A 矩陣的訪問模式對緩存更友好。
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.113024
這是循環排列后生成的 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)]))
}
}
}
}
}
}
數組打包
另一個重要的技巧是數組打包。訣竅是對多維數組的存儲進行重新排序,以便在展平,存儲在一維內存中后按順序訪問。

注意:此圖是陣列打包工作原理的一般說明。
可以使用數組打包來解決 B 的訪問模式。觀察扁平化后 B 的數組訪問模式,當在 K 維度上迭代時,這不是連續的??梢杂镁S度 [K][N] 重新排序 B,具有維度 [N/bn][K][bn],其中 bn 是阻塞因子,也是內循環中 B 的向量大小。這種重新排序將 N 分成兩個維度 — bigN (N/bn) 和 littleN (bn) — 新維度 [N/bn][K][bn] 匹配 B 從外循環到內循環的索引(no, ko, ki, ni) ,在展平后導致 B 的順序訪問模式。

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.232269
這是陣列打包后生成的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)]))
}
}
}
}
}
}
}
塊的寫緩存
阻塞后,程序將結果逐塊寫入C,訪問模式不是順序的。使用一個順序緩存數組保存塊結果,在所有塊結果準備好時寫入 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.225938
這是阻塞后生成的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)]
}
}
}
}
}
}
并行化
此外,還可以利用多核處理器進行線程級并行化。
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.068730
這是并行化后生成的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 = {A: Buffer(A_2: Pointer(float32), float32, [1024, 1024], []),
C: Buffer(C_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)]
}
}
}
}
}
}
概括
在僅用 18 行代碼應用上述簡單優化后,生成的代碼可以使用 MKL實現numpy性能的60%。網頁上的輸出反映了非排他性 Docker 容器上的運行時間,因此不可靠。強烈建議運行本文,觀察 TVM 實現的性能提升。

參考鏈接:
https://tvm.apache.org/docs/how_to/optimize_operators/opt_gemm.html

總結

以上是生活随笔為你收集整理的如何在CPU上优化GEMM矩阵乘法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

中国一级片免费看 | 日韩欧美一区二区三区视频 | 91超在线 | 成人三级网址 | 狠狠狠色丁香综合久久天下网 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | a级国产乱理论片在线观看 伊人宗合网 | 国产视频精品在线 | 97精品在线视频 | 天天射天天射天天射 | 亚洲成人精品影院 | 看v片| 欧美俄罗斯性视频 | 伊香蕉大综综综合久久啪 | 麻豆果冻剧传媒在线播放 | 免费看的av片 | 国产亚州av | 人人射人人澡 | 亚洲精品国产精品国自产在线 | 国产黑丝一区二区 | 中文字幕字幕中文 | 精品美女久久久久 | 西西www4444大胆在线 | 天天操天操 | 五月婷婷黄色 | 日韩精品首页 | 日韩av一卡二卡三卡 | 免费看的av片 | 四虎影院在线观看av | 久久国产日韩 | 欧美日性视频 | 日本中文字幕在线看 | 成人在线免费视频 | 国产精品一区二区精品视频免费看 | 九九热只有精品 | www久草 | 免费视频在线观看网站 | 996久久国产精品线观看 | 国产精品欧美久久久久无广告 | 天天se天天cao天天干 | 91麻豆产精品久久久久久 | 就要干b| 91精品国产91 | 丁香婷婷激情网 | 亚洲成人精品影院 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 成人中文字幕在线 | 精品色综合 | 日本在线观看中文字幕无线观看 | 久久久精品国产免费观看一区二区 | 久草在线免费看视频 | 免费观看的av | 日韩av免费一区二区 | 欧美精品一二三 | 992tv在线 | 天天干天天操天天拍 | 国产精品久久久久婷婷二区次 | 欧美日比视频 | 亚洲丁香日韩 | 91视频国产高清 | 色综合天天狠狠 | 日韩在线观看第一页 | 国产精品久久久久永久免费 | 蜜臀av夜夜澡人人爽人人 | 免费在线一区二区 | 亚洲精品小视频 | 久久国产经典 | 91精品国产网站 | 亚洲第一区精品 | 欧美 激情 国产 91 在线 | 国产精品夜夜夜一区二区三区尤 | 91禁在线看 | 久久在线精品 | 成人片在线播放 | 中文字幕黄色网址 | www.久草视频 | www.少妇| a级黄色片视频 | 伊人电影天堂 | 国产精品久久电影观看 | 麻豆国产露脸在线观看 | 日韩一级精品 | 欧美一级片免费播放 | 色射爱| 国产高清在线永久 | 黄色网址在线播放 | 欧美一级在线观看视频 | 天堂在线成人 | 精品国产一区二区三区在线观看 | 精品爱爱 | 国产专区在线 | 97在线精品 | 亚洲精品欧美专区 | 亚洲激情精品 | 在线观看日韩国产 | 亚洲精品在线播放视频 | 成人性生活大片 | 国产精品成人免费 | 最近中文字幕免费av | www91在线观看 | 91精品在线免费观看 | av官网在线 | 黄色免费在线视频 | 13日本xxxxxⅹxxx20 | 岛国大片免费视频 | 77国产精品 | 欧美精品一区二区在线播放 | 国产精品观看视频 | 最近更新好看的中文字幕 | 国产成人一区二区精品非洲 | 97超碰人| 亚洲精品一区二区精华 | av线上免费观看 | 欧美不卡视频在线 | 操高跟美女 | 亚洲精品在线二区 | 91一区二区三区在线观看 | 国产精品久久久久亚洲影视 | 午夜91在线 | 亚洲第一中文字幕 | 97精品久久人人爽人人爽 | 蜜桃视频精品 | 日韩亚洲在线观看 | 欧美精品久久久久久久久老牛影院 | 97在线视 | 日韩三级在线观看 | 欧美婷婷色 | 免费成人短视频 | 97干com| 五月婷婷六月丁香在线观看 | 1000部国产精品成人观看 | 国产精品99久久久久的智能播放 | 蜜臀久久99静品久久久久久 | 精品视频区 | 国产精品嫩草影院99网站 | 国产一区视频在线 | 国产91国语对白在线 | 国产在线观看 | 免费污片| 五月婷婷丁香网 | 天天插天天爱 | 久久亚洲电影 | 亚洲视频aaa | 国产在线免费观看 | 久久久www免费电影网 | 夜色资源站wwwcom | 91视频午夜 | 亚洲免费视频在线观看 | 日韩中文字幕一区 | 日韩在线三区 | 久草免费在线视频观看 | 国产免费一区二区三区最新6 | 人人舔人人爱 | 国产传媒中文字幕 | 日韩1页 | 夜夜夜夜夜夜操 | 国产一区网址 | 欧美精品免费在线 | 色网址99| 婷婷婷国产在线视频 | 国产精品永久久久久久久久久 | 在线小视频你懂的 | 成人永久免费 | 日韩高清不卡一区二区三区 | 91av美女| 天天干,天天射,天天操,天天摸 | 中文视频一区二区 | 国产精品资源在线观看 | 免费在线观看黄网站 | 欧美成天堂网地址 | 天天综合色天天综合 | 国产伦理久久精品久久久久_ | 综合在线观看 | 手机在线看永久av片免费 | 久久av免费电影 | 91麻豆免费版 | 四虎国产| 久久精品二区 | 日韩成人中文字幕 | 天天干天天摸 | 久久免费视频8 | 欧美日韩视频 | 免费a级毛片在线看 | 欧美成人亚洲成人 | 色综合久久久久网 | 免费观看午夜视频 | 一区二区三区四区五区六区 | 国产69精品久久99不卡的观看体验 | 欧美精品视 | 国产精品成人一区二区 | 久久a免费视频 | 日韩在线视 | 国产在线精品一区二区不卡了 | 国产高h视频 | 免费观看成人网 | 中文字幕在线影视资源 | 五月开心网 | 免费网站观看www在线观看 | 日日夜夜天天人人 | 夜色资源网 | 亚洲年轻女教师毛茸茸 | 成人黄色大片 | 亚洲人成在| 欧美日韩中文字幕视频 | 国产又粗又猛又爽又黄的视频免费 | 亚洲最大av在线播放 | 99久久视频| 狠狠干激情 | 一级黄色片在线免费看 | 天天久久综合 | 激情视频免费在线观看 | 日韩在线视频国产 | 能在线看的av| 日韩精品久久久免费观看夜色 | 四虎5151久久欧美毛片 | 色狠狠一区二区 | 人人澡人人澡人人 | 波多野结衣一区二区三区中文字幕 | 波多野结衣电影久久 | 亚洲丝袜一区 | 亚洲91精品 | 国产视频 久久久 | 欧美最猛性xxxxx亚洲精品 | 欧美天天综合网 | 国内久久久久久 | 国产一级片毛片 | 日韩免费在线观看视频 | 国产精品网红福利 | 在线观看久久久久久 | 91看片看淫黄大片 | 久久精品伊人 | 国产精品视频线看 | 国产精品永久 | 欧美国产不卡 | 国产黄a三级 | 国产午夜精品av一区二区 | 欧美日韩国产一二三区 | 国产在线观看地址 | 在线之家免费在线观看电影 | 亚洲精品理论片 | 精品久久久久久久久久久久久久久久久久 | 欧美日韩在线免费视频 | 成人午夜电影在线观看 | 日本公妇在线观看高清 | 国产一区二区久久久 | 日韩在线视频免费观看 | 韩国av免费观看 | 在线有码中文字幕 | 日韩精品短视频 | 久久综合99 | 免费看片在线观看 | 欧美国产视频在线 | 天天综合久久 | 六月丁香婷 | 久草在线最新视频 | 国产视频一区二区三区在线 | 亚洲综合在线发布 | 超级碰99 | 日韩在线视频网 | 免费看一级黄色大全 | 97免费在线观看视频 | 五月天久久精品 | 日韩欧美在线观看一区二区 | 精品国产一区二区三区在线 | 久久伦理电影网 | 国产不卡视频在线播放 | 国产最新福利 | 国产精品日韩欧美一区二区 | 欧美成人精品欧美一级乱黄 | 五月婷婷在线视频观看 | 日韩精品免费专区 | 国产一区二区播放 | 色网站国产精品 | 久久国产电影院 | 97超碰免费在线 | 久久精品亚洲精品国产欧美 | 五月天激情综合 | 日本精品一区二区三区在线观看 | 亚洲精品66 | sesese图片| 久久另类小说 | 久久成人精品电影 | 日韩高清网站 | 九九热在线播放 | 精品亚洲国产视频 | 夜夜夜夜爽 | 日韩欧美精品在线 | 欧美夫妻生活视频 | 国产91在线 | 美洲 | 97香蕉超级碰碰久久免费软件 | 久久久久久久影视 | 亚洲高清av| 在线观看av网| 四虎成人精品永久免费av九九 | 天天干天天怕 | 黄色a级片在线观看 | 久久九九免费 | 日本中文字幕网 | 久久99久久99精品免视看婷婷 | 激情校园亚洲 | 日本精品一区二区三区在线观看 | 右手影院亚洲欧美 | 911国产精品| 久操中文字幕在线观看 | 日韩毛片在线一区二区毛片 | 天天操天天操天天操天天操 | www.亚洲精品 | 亚洲欧美怡红院 | 午夜美女av| 色婷婷六月天 | 99视频这里只有 | 四虎4hu永久免费 | 成人免费观看a | 久草在线最新 | 99视频一区二区 | 在线天堂中文www视软件 | 国产午夜精品福利视频 | 91人网站| 成人av免费网站 | 国产精品videoxxxx | 天天曰天天干 | 久久99精品波多结衣一区 | 夜夜操天天摸 | 国产精品99在线观看 | 97日日碰人人模人人澡分享吧 | 亚洲波多野结衣 | 免费黄色在线网址 | 亚洲免费精品一区二区 | 在线中文字幕电影 | 久久久久欧美精品999 | 色综合久久88色综合天天 | 久久久午夜精品福利内容 | 一本一本久久a久久精品综合 | 久久久福利视频 | 久久久精品二区 | 亚洲黄色在线播放 | 欧美精品亚洲精品日韩精品 | 欧美精品久久久久久 | 四虎影视www | 国产精品第10页 | 精品国产欧美一区二区 | 在线观看免费观看在线91 | 亚洲高清在线观看视频 | 超碰av在线免费观看 | 日日干天天爽 | 欧美人zozo | 久草视频在线观 | 国产不卡av在线播放 | 中文字幕一区二区三区四区在线视频 | 成人国产网址 | 国产真实精品久久二三区 | 最新99热 | av免费观看网站 | 国产综合视频在线观看 | 国产99久久九九精品 | av在线永久免费观看 | 最新av网址在线观看 | 日韩和的一区二在线 | 国产无套精品久久久久久 | 欧美激情综合五月色丁香小说 | 日本中文字幕在线 | 91xav| 搡bbbb搡bbb视频 | 在线观看aa| 天天爽天天爽 | 99国产视频在线 | 欧美一级片免费播放 | 国产精品久久久一区二区三区网站 | 久久久久欧美精品 | 国产中文字幕久久 | 播五月婷婷 | 激情影院在线 | 日韩 国产 | 欧美成人播放 | 91污在线 | 国产美女视频网站 | 精品视频免费播放 | 国产精品涩涩屋www在线观看 | 国产精品日韩精品 | www国产亚洲精品久久网站 | 国产精品久久精品国产 | 国产一级二级三级在线观看 | 激情av资源| 久草在线免费看视频 | 亚洲精品伦理在线 | 日韩欧美aaa| 亚洲国产大片 | 国产日产精品一区二区三区四区的观看方式 | 亚洲电影网站 | 精品视频网站 | 国产免费叼嘿网站免费 | 一区二区三区日韩在线观看 | 九七视频在线 | 96看片| 九九视频网 | 日韩一区视频在线 | 国产亚洲精品女人久久久久久 | 成人久久精品视频 | 午夜视频色 | 91香蕉国产 | 欧美91精品久久久久国产性生爱 | 日韩久久久 | 亚洲最新av| 国产黄色a| 国产盗摄精品一区二区 | 国内久久看 | 高清国产在线一区 | 国产午夜三级一区二区三 | 久久好看免费视频 | 91在线观看高清 | 国产一级片网站 | 亚洲精品小视频 | 色网站在线 | 密桃av在线 | 99精品一级欧美片免费播放 | 欧美激情视频在线观看免费 | 国产精品一区二区白浆 | 久久久久久久久久久久亚洲 | 欧美一级电影在线观看 | 视频在线观看一区 | 91色在线观看视频 | 人人讲| 91精品在线视频观看 | 国产成人精品久久二区二区 | 91人人澡人人爽人人精品 | 黄色国产高清 | 91免费高清 | 午夜精品久久久久99热app | 欧美成年人在线视频 | 亚洲综合精品视频 | 亚洲日本韩国一区二区 | 精品国产一区二区三区噜噜噜 | 一区二区在线电影 | 欧美日韩二区在线 | 久久在线观看视频 | 四虎最新入口 | 色多多视频在线观看 | 成人小视频在线观看免费 | 六月丁香综合网 | 黄色资源在线观看 | 国产精品毛片久久久久久久 | 欧美性猛片, | 亚洲一区二区视频在线 | 亚洲视频国产 | 探花视频在线观看免费 | 中文字幕久久精品一区 | 亚洲一区二区三区四区精品 | 国产成人性色生活片 | 国产精久久久 | 中文字幕一二 | 国内外成人在线视频 | 欧美日韩一区二区三区在线观看视频 | 久久精品网| 国产精品福利在线 | 四虎www| 最新成人av | 99精品视频在线播放观看 | 精品一区二区在线看 | 玖玖在线资源 | 国产黄色片在线免费观看 | 成人黄色短片 | 最新日韩视频在线观看 | 婷婷丁香激情网 | 日韩欧美91| 欧美analxxxx| 日本久久中文 | 天天曰天天曰 | 色停停五月天 | 欧美性网站 | 精品电影一区 | 亚洲一区二区三区四区在线视频 | 国产精品毛片一区二区在线看 | 欧美日韩国产精品一区二区亚洲 | 精品在线视频一区 | 手机成人av | 麻豆国产在线视频 | 黄色a一级片 | 亚洲午夜久久久影院 | 啪啪资源 | 国产精品久久久久久久久久不蜜月 | 99精品免费久久久久久日本 | 91黄色小视频 | 国产精品美女www爽爽爽视频 | 天天操天天摸天天射 | 婷婷丁香综合 | 亚洲一区二区精品3399 | 国产在线超碰 | 亚洲女在线 | 久久黄视频| 精品国产综合区久久久久久 | 日韩电影中文字幕 | 中文字幕在线免费看 | 欧美日韩一区二区三区视频 | 91超碰免费在线 | 亚洲 精品在线视频 | 在线免费性生活片 | 亚洲五月| 97人人人人 | 色欧美视频 | 婷婷在线综合 | 91看片一区二区三区 | 国产亚洲精品久久久久久无几年桃 | 麻豆一区在线观看 | 国产午夜精品一区 | 日韩免费观看视频 | 奇米影视777四色米奇影院 | 欧美最新大片在线看 | 蜜臀久久99精品久久久酒店新书 | 亚洲国产高清在线 | 国产91精品在线播放 | 免费亚洲片 | 国产精品久久久久亚洲影视 | 婷婷色中文 | 综合久久婷婷 | 特级片免费看 | 国产精品久久久久久麻豆一区 | 日本最新高清不卡中文字幕 | 天天摸日日摸人人看 | 成人免费一区二区三区在线观看 | 国产美女免费观看 | 天天操天天干天天插 | 激情网在线视频 | 看片网站黄色 | 国产精品私人影院 | 在线免费高清一区二区三区 | 久视频在线播放 | 黄色一二级片 | 麻豆国产精品视频 | 国产精品毛片一区二区 | 天天干天天干天天射 | av网址在线播放 | 国产精品video | 激情小说久久 | 99精彩视频 | 久久热首页 | 黄色成人91 | 久久在线观看 | 成人理论电影 | 狠狠色狠狠综合久久 | 亚洲电影一级黄 | 精品国产成人在线影院 | 日韩经典一区二区三区 | 在线国产精品一区 | 亚洲国产精久久久久久久 | 亚洲网站在线 | 香蕉视频国产在线观看 | 综合色中文 | 日韩毛片在线一区二区毛片 | 青草视频在线 | 日韩av电影网站在线观看 | 国产精品v欧美精品 | 亚洲精品国偷拍自产在线观看 | 青青草国产成人99久久 | 久久久亚洲国产精品麻豆综合天堂 | 五月开心色 | 国产欧美精品一区二区三区四区 | 在线观看深夜视频 | 天天操天天干天天爱 | 亚洲成人精品在线 | 午夜久久久久久久 | 成人小视频在线观看免费 | 国内精品久久久久影院男同志 | 1024在线看片 | 三级av免费看 | 中文亚洲欧美日韩 | 国产中文在线字幕 | 99热在| 国产福利av | 永久免费的啪啪网站免费观看浪潮 | 国产成人精品在线播放 | av黄免费看 | 一级黄视频 | 久亚洲精品 | 日韩视频免费观看高清 | 久久精品91视频 | 在线观看av的网站 | 久久久久久高潮国产精品视 | 人人草网站 | 中文字幕乱码电影 | 色综合国产 | 欧美一区二区免费在线观看 | 在线免费观看一区二区三区 | 日韩成人在线免费观看 | 成人动漫一区二区 | 国内久久 | 久久国产午夜精品理论片最新版本 | 免费黄a| 玖玖爱免费视频 | 五月婷婷欧美视频 | 天天添夜夜操 | 在线国产专区 | 久久精品之 | 亚洲aⅴ在线 | 黄色三级免费观看 | 亚洲资源在线观看 | 麻豆传媒视频观看 | 人人澡超碰碰97碰碰碰软件 | 色婷婷福利 | 久久久国产影视 | 久久99九九99精品 | 午夜少妇av| 五月激情亚洲 | 久久亚洲人 | 欧美日韩色婷婷 | 久久99久久99精品免观看粉嫩 | 96久久久 | 欧美乱熟臀69xxxxxx | 成人黄色电影免费观看 | 成人激情开心网 | 免费影视大全推荐 | 免费观看91 | 亚洲欧美精品一区 | 999久久久久久久久 69av视频在线观看 | 日韩h在线观看 | 天天操天天色天天射 | 91精品久久久久久久91蜜桃 | 色之综合网 | 欧美国产日韩在线观看 | 在线中文视频 | 91原创在线观看 | 成全免费观看视频 | 久久免费黄色 | 在线免费观看国产视频 | 免费裸体视频网 | 亚洲第一区精品 | 久久久久久久免费 | 日韩久久精品一区 | 国产精品久久久免费 | 天天天天天天天天操 | 中文字幕a∨在线乱码免费看 | 日韩精品久久久免费观看夜色 | 91网在线看 | 国产在线精 | 久久国产精品久久精品国产演员表 | 久久久久久国产精品999 | 亚洲精品88欧美一区二区 | 精品在线观看一区二区 | 国产精品久久久久久久久毛片 | 欧美另类一二三四区 | 亚洲国产精品999 | 亚洲精品综合在线观看 | 色偷偷88888欧美精品久久久 | 精品久久久久久亚洲综合网站 | 伊人五月 | 91福利试看| 欧美综合色在线图区 | 色噜噜在线观看 | 精品一区二区6 | 在线观看激情av | 欧美性色xo影院 | 丁香六月激情婷婷 | 亚洲精品乱码久久久久久蜜桃不爽 | 成人免费一级 | 91久久国产精品 | 黄色片免费电影 | 亚洲自拍偷拍色图 | 97人人澡人人爽人人模亚洲 | 欧美精品做受xxx性少妇 | 久草线| 91高清视频在线 | 成人观看 | 中文字幕观看视频 | 人人插人人舔 | 久久免费精品一区二区三区 | 婷婷色影院 | 91大神精品视频 | 久久综合电影 | 国产亚洲一级高清 | 久久国产一区二区 | av888.com | 久久精品毛片 | 亚洲三级黄 | 久久好看免费视频 | 国产小视频在线 | 色偷偷中文字幕 | 日本h在线播放 | 亚洲最大av网 | 夜色资源网 | 成人av免费在线播放 | 亚洲精品视频免费观看 | 欧美精品一区二区免费 | 亚洲精品国产精品乱码在线观看 | 一级α片 | a级成人毛片 | 亚洲午夜久久久影院 | 91av在线精品 | 久久免费国产精品 | 日韩午夜小视频 | 久草在线在线视频 | 欧美精品一区二区三区一线天视频 | 国产一级片观看 | 狠狠撸电影 | 国产精品手机看片 | 亚洲成av| 91超碰免费在线 | 国产精品麻豆三级一区视频 | 国产精品乱码高清在线看 | 久久99精品国产99久久6尤 | 国产精品视频最多的网站 | 久久天天躁夜夜躁狠狠85麻豆 | 91成人亚洲 | 国产成人免费观看 | 伊人五月婷 | а天堂中文最新一区二区三区 | 综合色播| 欧美日韩国产色综合一二三四 | 狠狠躁夜夜av| 欧美一级高清片 | 曰韩精品| 69精品在线观看 | 欧美精品免费在线 | 97视频入口免费观看 | 国产精品九九久久久久久久 | 一级特黄av | 国产中文在线观看 | 在线看黄网站 | 亚洲伊人网在线观看 | 夜夜狠狠 | 91精品视频播放 | 成人a级免费视频 | 国产精品久久久久久久久久 | www.91av在线 | 亚洲va天堂va欧美ⅴa在线 | 色97在线 | 久久久精品在线观看 | 网站在线观看你们懂的 | 日韩欧美在线观看一区二区三区 | 99r精品视频在线观看 | 中文字幕国产一区 | 国产精品欧美久久久久天天影视 | 色婷婷五 | 日日婷婷夜日日天干 | 国产精品久久久久久久久久久久久久 | 一 级 黄 色 片免费看的 | 视频一区二区精品 | 精品亚洲二区 | 日韩黄色中文字幕 | 狠狠操欧美 | 香蕉视频在线免费 | 欧美另类亚洲 | www.午夜视频 | 一区二区 精品 | 亚洲理论电影网 | 国产福利91精品 | 欧日韩在线视频 | 玖玖色在线观看 | 国产午夜一级毛片 | 久久激情视频 久久 | 久久99久久99久久 | 视频在线91 | 国产91全国探花系列在线播放 | 欧美日韩一级视频 | 日韩精品极品视频 | 日韩欧美在线免费 | 五月天亚洲激情 | 在线精品视频免费播放 | 一区在线观看视频 | 国产高清视频免费观看 | 亚洲做受高潮欧美裸体 | 久爱综合| 成人免费看电影 | 免费高清在线观看成人 | 91精品免费在线 | 国产中文字幕大全 | 人人藻人人澡人人爽 | 国产v在线播放 | 久久国产成人午夜av影院潦草 | 久久a国产| 久久黄色a级片 | 久久久精品一区二区 | 国产精品欧美一区二区三区不卡 | 五月激情av | 国产亚洲视频在线 | 国产精品美女视频网站 | av资源免费看 | 亚洲一级性| 日本久久中文字幕 | 久久视频在线免费观看 | 亚洲欧美日韩国产一区二区三区 | 欧美亚洲精品一区 | 免费网站色 | 国产福利不卡视频 | 91九色视频网站 | 99久久精品费精品 | 国产一区91| 欧美在线一 | 99国产精品视频免费观看一公开 | 亚洲天堂网在线观看视频 | 中文字幕成人在线 | 日韩精品视频久久 | 日韩av免费大片 | 成人网页在线免费观看 | 免费三级影片 | 亚洲精品国产第一综合99久久 | 国产成人一区二区三区在线观看 | 亚洲精品国产品国语在线 | 1000部18岁以下禁看视频 | 黄色av电影一级片 | 国产精品九九九九九九 | 欧美日韩91 | 色噜噜在线观看视频 | 亚洲三级精品 | 国产在线久久久 | 97国产精品免费 | 久草免费在线视频 | 成年人免费观看国产 | 99精品国产在热久久 | 99性视频 | 最新日韩视频 | 国产精品99久久久久 | 婷婷av综合 | 草莓视频在线观看免费观看 | 精品在线小视频 | 久久精品人 | 亚洲精品永久免费视频 | 成人夜晚看av | 国内精品久久天天躁人人爽 | 亚州视频在线 | 黄p网站在线观看 | 国产精品mv | 国产精品毛片一区视频播 | 国产精品一区二区三区四区在线观看 | 91成人免费在线 | 一区二区中文字幕在线播放 | 国产无套精品久久久久久 | 国产成人精品av在线 | 欧美精品久久人人躁人人爽 | 久草在线资源网 | 日韩在线视频网址 | 亚洲国产合集 | 亚洲视频99 | 亚洲桃花综合 | 中文字幕乱码视频 | 激情五月婷婷综合网 | 99视频免费观看 | 久久国产精品视频 | 五月天六月丁香 | 在线播放国产一区二区三区 | 成人在线视| 日本韩国中文字幕 | 国产免费av一区二区三区 | 黄色精品国产 | 精品99免费| 人人看人人做人人澡 | 青青河边草免费观看 | 久久精品国产亚洲精品2020 | 亚洲国产高清在线观看视频 | 免费观看高清 | 国产精品资源网 | 日本视频久久久 | 亚洲综合在线发布 | 91综合色 | 天天鲁天天干天天射 | 久久伊99综合婷婷久久伊 | 在线看国产视频 | 欧美精品在线观看一区 | 成年人三级网站 | 欧美一级性 | 在线观看av网 | 亚洲激情电影在线 | 超碰97网站 | 91久久精品日日躁夜夜躁国产 | 国产精品av久久久久久无 | 日韩性xxxx| 亚洲国产婷婷 | 久久婷婷一区 | 亚洲一级电影在线观看 | 亚洲aⅴ在线 | 日本一区二区三区视频在线播放 | 深爱婷婷| 亚洲精品在线资源 | 狠狠网亚洲精品 | 国产青草视频在线观看 | 97福利在线 | 91精品国产一区 | 日韩精品免费一区 | 日韩在线观看第一页 | 国产成人精品午夜在线播放 | 久久99九九99精品 | 最新精品视频在线 | 三级动图| 精品一区二区亚洲 | 麻豆视频www| 888av| 久久精品首页 | x99av成人免费 | 色综合 久久精品 | 深夜视频久久 | 久久久久久国产精品 | 中文字幕999 | 高清av免费一区中文字幕 | 亚洲日韩中文字幕 | 国产精品欧美在线 | 国产综合在线观看视频 | 免费黄色在线网址 | 人人爽久久久噜噜噜电影 | 国产免费成人av | 国产免费视频在线 | 欧美一级大片在线观看 | av品善网 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 99久久999久久久精玫瑰 | 日韩免费看的电影 | 国产中文字幕视频在线观看 | 国产香蕉久久 | 成人va视频 | 日本h在线播放 | 欧美一区中文字幕 | 日日夜夜婷婷 | 亚洲精品视频网站在线观看 | 日韩首页 | 欧美一级片在线观看视频 | 久久综合综合久久综合 | 国产一区二区手机在线观看 | 国产亚洲精品久久久久久无几年桃 | 久久国产精品99久久久久久丝袜 | 久久久久中文 | 去干成人网 | 美女网站一区 | 91传媒在线看 | 肉色欧美久久久久久久免费看 | 久久久www成人免费毛片 | 日韩欧美视频在线观看免费 | 99色在线视频| 日韩理论影院 | 草久草久 | 香蕉免费 | av在线直接看 | 天天干.com| 在线观看福利网站 | 特级黄色一级 | 天天精品视频 | 亚洲综合色视频在线观看 | 草久久精品| 黄污网站在线观看 | 国产不卡视频在线 | 玖玖玖国产精品 | 日本久久久久久久久 | 97久久久免费福利网址 | 欧美 亚洲 另类 激情 另类 | 精品免费观看 | 国产一级黄色电影 | 超碰com | 伊人婷婷综合 | 中文在线免费观看 | 久久人人爽人人爽人人片 | 在线天堂中文www视软件 | 开心色停停| 久久99国产精品视频 | 欧美在线不卡一区 | 激情小说网站亚洲综合网 | 欧美精品一区二区蜜臀亚洲 | 成人蜜桃视频 | 日本电影黄色 | 激情婷婷综合网 | 日韩欧美综合精品 | 波多野结衣一区 | 国产玖玖在线 | 国产精品永久免费观看 | 日韩精品字幕 | 国产青草视频在线观看 | 久久久免费精品 | 国产一级淫片免费看 | 黄色av免费看| 欧美综合干| 国产精品第一页在线观看 | 黄色a级片在线观看 | 免费观看一级特黄欧美大片 | 不卡av免费在线观看 | 日韩精品免费在线播放 | 久久精品视频在线 | 国产精品v欧美精品v日韩 | 四虎成人精品在永久免费 | 69欧美视频 | 97超碰总站 | 97在线公开视频 | 91成人在线视频 | 中文字幕精品一区 | 国产精品自产拍在线观看蜜 | 精品一区二区三区在线播放 | 天天综合狠狠精品 | 亚洲网站在线 | 九九久久国产精品 | 免费看黄色小说的网站 | 亚洲影院天堂 | 国产免费嫩草影院 | 亚洲精品在线一区二区 | 亚欧日韩成人h片 | 亚洲精品高清一区二区三区四区 | 免费福利视频网 | 中文字幕在线专区 | 亚洲精品乱码久久久久久蜜桃动漫 | 欧美 另类 交| 亚洲电影免费 | 国产成人91 | 亚洲综合色激情五月 | 精品国产一区二区三区日日嗨 | 视频一区二区在线 |