久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

Android移動(dòng)端GPU通用計(jì)算:Compute Shader從入門到性能調(diào)優(yōu)實(shí)戰(zhàn)

Android移動(dòng)端GPU通用計(jì)算:Compute Shader從入門到性能調(diào)優(yōu)實(shí)戰(zhàn) 簡介這份資源面向Android圖形與通用計(jì)算方向的開發(fā)者聚焦OpenGL ES 3.0引入的Compute Shader技術(shù)幫助讀者在移動(dòng)端利用GPU并行能力加速計(jì)算密集型任務(wù)適用于圖形處理、物理模擬等場景需要一定的OpenGL ES與GPU架構(gòu)基礎(chǔ)。壓縮包共1091個(gè)文件約5.58MB以flat、xml、json、dex、class、jar、java等為主涵蓋工程配置、資源描述、編譯產(chǎn)物與Java源碼另含comp計(jì)算著色器文件、apk安裝包及gradlew構(gòu)建腳本便于直接運(yùn)行與二次開發(fā)。資源圍繞Compute Shader的創(chuàng)建、編譯鏈接、Work Group與Work Item劃分、glDispatchCompute調(diào)度、Buffer與Texture數(shù)據(jù)交換、glMemoryBarrier同步及性能優(yōu)化等知識(shí)點(diǎn)展開并配有示例代碼可幫助讀者理解GPU并行計(jì)算的完整流程與排錯(cuò)思路。目前已有1356人學(xué)習(xí)下載適合希望將計(jì)算任務(wù)從CPU遷移到GPU、提升Android應(yīng)用性能的開發(fā)者參考。1. 移動(dòng)端 GPU 通用計(jì)算為什么 Android 上的 compute shader 值得你花時(shí)間很多做 Android 圖像處理或端側(cè)推理的同行第一反應(yīng)是「CPU 多線程 NEON 就夠了」。直到某天遇到一張 4000×3000 的圖要做雙邊濾波CPU 八核跑滿還要 800ms用戶滑動(dòng)預(yù)覽直接卡成 PPT。這時(shí)候把同樣的算法搬到 GPU 上用 compute shader 重寫往往能壓到 30ms 以內(nèi)——這不是玄學(xué)是移動(dòng)端 GPU 幾千個(gè)著色器核心的并行吞吐在起作用。compute shader 在 Android 上并不是新東西OpenGL ES 3.1 就引入了它Vulkan 更是把它當(dāng)作一等公民。它解決的核心問題是把那些「每個(gè)像素/每個(gè)元素獨(dú)立計(jì)算、數(shù)據(jù)并行度極高」的任務(wù)從 CPU 搬到 GPU。適合誰做相機(jī)濾鏡、圖像分割、點(diǎn)云處理、矩陣運(yùn)算、粒子模擬的 Android 開發(fā)者。如果你還在用 RenderScript那更該看看這條路——RenderScript 在 Android 12 之后已被標(biāo)記廢棄compute shader 是官方推薦的替代方向。這一章先把「是什么、為什么、值不值」講清楚后面幾章直接上代碼和參數(shù)。2. 從零搭一個(gè) compute shader 最小可跑框架GLES 3.1 路線選 GLES 3.1 而不是 Vulkan 作為入門路線理由很實(shí)際兼容性好Android 5.0 以上大面積支持、代碼量少、調(diào)試工具鏈成熟。Vulkan 的 compute 性能上限更高但初始化就要寫幾百行不適合第一次跑通。等你把 GLES 這條路走順了再遷移到 Vulkan 只是換 API 的事。2.1 環(huán)境檢查與上下文創(chuàng)建第一步不是寫 shader而是確認(rèn)設(shè)備真的支持。GLES 3.1 的 compute shader 需要GL_MAX_COMPUTE_WORK_GROUP_COUNT等參數(shù)不同 GPU 差異很大。// 在 GLSurfaceView.Renderer 的 onSurfaceCreated 中檢查 public void onSurfaceCreated(GL10 unused, EGLConfig config) { // 檢查 GLES 版本3.1 才支持 compute shader int[] version new int[2]; GLES31.glGetIntegerv(GLES31.GL_MAJOR_VERSION, version, 0); GLES31.glGetIntegerv(GLES31.GL_MINOR_VERSION, version, 1); if (version[0] 3 || (version[0] 3 version[1] 1)) { throw new RuntimeException(設(shè)備不支持 GLES 3.1無法使用 compute shader); } // 查詢工作組數(shù)量上限后面 dispatch 時(shí)不能超過 int[] maxWorkGroupCount new int[3]; GLES31.glGetIntegeri_v(GLES31.GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, maxWorkGroupCount, 0); GLES31.glGetIntegeri_v(GLES31.GL_MAX_COMPUTE_WORK_GROUP_COUNT, 1, maxWorkGroupCount, 1); GLES31.glGetIntegeri_v(GLES31.GL_MAX_COMPUTE_WORK_GROUP_COUNT, 2, maxWorkGroupCount, 2); Log.d(Compute, Max work group count: Arrays.toString(maxWorkGroupCount)); // 查詢單個(gè)工作組內(nèi)最大線程數(shù)通常是 128 或 256 int[] maxWorkGroupSize new int[3]; GLES31.glGetIntegeri_v(GLES31.GL_MAX_COMPUTE_WORK_GROUP_SIZE, 0, maxWorkGroupSize, 0); GLES31.glGetIntegeri_v(GLES31.GL_MAX_COMPUTE_WORK_GROUP_SIZE, 1, maxWorkGroupSize, 1); GLES31.glGetIntegeri_v(GLES31.GL_MAX_COMPUTE_WORK_GROUP_SIZE, 2, maxWorkGroupSize, 2); Log.d(Compute, Max work group size: Arrays.toString(maxWorkGroupSize)); }這段代碼做了兩件事確認(rèn)版本夠不夠以及把設(shè)備的硬件上限讀出來。GL_MAX_COMPUTE_WORK_GROUP_COUNT是每個(gè)維度能 dispatch 多少個(gè)工作組GL_MAX_COMPUTE_WORK_GROUP_SIZE是單個(gè)工作組內(nèi)三個(gè)維度各能放多少線程。很多新手直接寫死layout(local_size_x 16, local_size_y 16)結(jié)果在某些低端 GPU 上因?yàn)?6×16256超過了GL_MAX_COMPUTE_WORK_GROUP_SIZE而編譯失敗。我一般會(huì)先讀這兩個(gè)值再?zèng)Q定 local size。2.2 寫第一個(gè) compute shader數(shù)組平方用一個(gè)最簡單的例子把流程跑通輸入一個(gè) float 數(shù)組輸出每個(gè)元素的平方。這個(gè)例子沒有圖像、沒有紋理純粹驗(yàn)證 compute shader 的讀寫通路。// square.comp.glsl #version 310 es // 指定工作組大小16x16 是移動(dòng)端比較穩(wěn)妥的選擇 layout(local_size_x 16, local_size_y 16) in; // 輸入緩沖區(qū)std430 是 GLES 3.1 支持的緊湊布局 layout(std430, binding 0) readonly buffer InputBuffer { float data[]; } inputBuf; // 輸出緩沖區(qū) layout(std430, binding 1) writeonly buffer OutputBuffer { float data[]; } outputBuf; void main() { // 全局索引 工作組 ID * 工作組大小 組內(nèi)線程 ID uint idx gl_GlobalInvocationID.x; // 邊界檢查防止越界訪問 if (idx inputBuf.data.length()) return; float v inputBuf.data[idx]; outputBuf.data[idx] v * v; }邏輯說明gl_GlobalInvocationID是當(dāng)前線程在整個(gè) dispatch 網(wǎng)格中的全局坐標(biāo)。inputBuf.data.length()返回緩沖區(qū)元素個(gè)數(shù)用來做邊界保護(hù)——因?yàn)?dispatch 的線程總數(shù)往往不是元素?cái)?shù)的整數(shù)倍多出來的線程必須直接返回否則會(huì)讀到垃圾數(shù)據(jù)甚至崩潰。參數(shù)說明local_size_x 16, local_size_y 16表示一個(gè)工作組有 256 個(gè)線程這是移動(dòng)端 GPU 的常見甜點(diǎn)值std430布局比std140更緊湊適合 float 數(shù)組。2.3 編譯、綁定與 dispatch 的完整調(diào)用鏈shader 寫好了接下來是 Java 側(cè)的膠水代碼。這段代碼是整個(gè)框架的核心值得逐行看。// 編譯 compute shader int shader GLES31.glCreateShader(GLES31.GL_COMPUTE_SHADER); GLES31.glShaderSource(shader, shaderSource); GLES31.glCompileShader(shader); // 檢查編譯結(jié)果失敗時(shí)打印日志 int[] compiled new int[1]; GLES31.glGetShaderiv(shader, GLES31.GL_COMPILE_STATUS, compiled, 0); if (compiled[0] 0) { Log.e(Compute, Shader compile failed: GLES31.glGetShaderInfoLog(shader)); GLES31.glDeleteShader(shader); return; } // 鏈接成 program int program GLES31.glCreateProgram(); GLES31.glAttachShader(program, shader); GLES31.glLinkProgram(program); // 檢查鏈接結(jié)果 int[] linked new int[1]; GLES31.glGetProgramiv(program, GLES31.GL_LINK_STATUS, linked, 0); if (linked[0] 0) { Log.e(Compute, Program link failed: GLES31.glGetProgramInfoLog(program)); return; } // 準(zhǔn)備輸入數(shù)據(jù) int N 1024 * 1024; float[] input new float[N]; for (int i 0; i N; i) input[i] i * 0.001f; // 創(chuàng)建 SSBOShader Storage Buffer Object int[] buffers new int[2]; GLES31.glGenBuffers(2, buffers, 0); // 輸入 buffer GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, buffers[0]); FloatBuffer inputBuf ByteBuffer.allocateDirect(N * 4) .order(ByteOrder.nativeOrder()).asFloatBuffer(); inputBuf.put(input).position(0); GLES31.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, N * 4, inputBuf, GLES31.GL_STATIC_DRAW); // 輸出 buffer先分配空間 GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, buffers[1]); GLES31.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, N * 4, null, GLES31.GL_DYNAMIC_DRAW); // 綁定到 shader 的 binding point GLES31.glBindBufferBase(GLES31.GL_SHADER_STORAGE_BUFFER, 0, buffers[0]); GLES31.glBindBufferBase(GLES31.GL_SHADER_STORAGE_BUFFER, 1, buffers[1]); // 使用 program 并 dispatch GLES31.glUseProgram(program); // 計(jì)算需要多少個(gè)工作組向上取整 int groupCount (N 255) / 256; GLES31.glDispatchCompute(groupCount, 1, 1); // 插入內(nèi)存屏障確保 compute 寫入對后續(xù)讀取可見 GLES31.glMemoryBarrier(GLES31.GL_SHADER_STORAGE_BARRIER_BIT); // 讀回結(jié)果 GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, buffers[1]); FloatBuffer result ByteBuffer.allocateDirect(N * 4) .order(ByteOrder.nativeOrder()).asFloatBuffer(); GLES31.glGetBufferSubData(GLES31.GL_SHADER_STORAGE_BUFFER, 0, N * 4, result);邏輯說明整個(gè)鏈路是「編譯 shader → 鏈接 program → 創(chuàng)建 SSBO → 綁定 binding point → dispatch → 內(nèi)存屏障 → 讀回」。glBindBufferBase把 buffer 綁到 shader 里binding 0/1對應(yīng)的位置這個(gè)對應(yīng)關(guān)系不能錯(cuò)。glDispatchCompute(groupCount, 1, 1)里的 groupCount 是工作組數(shù)量不是線程數(shù)量——總線程數(shù) groupCount × local_size_x × local_size_y × local_size_z。參數(shù)說明GL_SHADER_STORAGE_BARRIER_BIT告訴驅(qū)動(dòng)「compute 階段對 SSBO 的寫入需要在后續(xù)操作前完成」漏掉這個(gè)屏障是新手最常見的翻車點(diǎn)表現(xiàn)為讀回的數(shù)據(jù)全是 0 或者舊值。3. 把 compute shader 用到圖像處理紋理讀寫與性能調(diào)優(yōu)數(shù)組平方只是熱身真正有價(jià)值的是圖像處理。這一章講怎么把紋理texture作為輸入輸出以及怎么調(diào)參數(shù)讓 GPU 跑滿。3.1 用 image 對象讀寫紋理GLES 3.1 的 compute shader 通過image2D訪問紋理比傳統(tǒng)的 framebuffer 方式靈活得多。下面是一個(gè)灰度化的例子。// grayscale.comp.glsl #version 310 es layout(local_size_x 16, local_size_y 16) in; // rgba8 格式的輸入圖像readonly 表示只讀 layout(rgba8, binding 0) readonly uniform highp image2D inputImage; // 輸出圖像writeonly layout(rgba8, binding 1) writeonly uniform highp image2D outputImage; void main() { ivec2 coord ivec2(gl_GlobalInvocationID.xy); // 邊界檢查圖像尺寸不一定是 16 的整數(shù)倍 ivec2 size imageSize(inputImage); if (coord.x size.x || coord.y size.y) return; vec4 color imageLoad(inputImage, coord); // 標(biāo)準(zhǔn)灰度公式0.299R 0.587G 0.114B float gray dot(color.rgb, vec3(0.299, 0.587, 0.114)); imageStore(outputImage, coord, vec4(gray, gray, gray, color.a)); }邏輯說明imageLoad和imageStore是 compute shader 讀寫紋理的標(biāo)準(zhǔn)方式坐標(biāo)是整數(shù)ivec2。imageSize返回紋理尺寸用來做邊界檢查。參數(shù)說明rgba8是紋理格式必須和 Java 側(cè)創(chuàng)建的紋理格式一致否則行為未定義。highp精度限定符在移動(dòng)端很重要默認(rèn)的mediump在圖像坐標(biāo)計(jì)算時(shí)可能溢出。Java 側(cè)創(chuàng)建紋理并綁定到 image unit// 創(chuàng)建輸入紋理 int[] textures new int[2]; GLES31.glGenTextures(2, textures, 0); GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, textures[0]); // 上傳圖像數(shù)據(jù)width/height 是圖像尺寸 GLES31.glTexImage2D(GLES31.GL_TEXTURE_2D, 0, GLES31.GL_RGBA8, width, height, 0, GLES31.GL_RGBA, GLES31.GL_UNSIGNED_BYTE, pixelBuffer); // 必須設(shè)置過濾和環(huán)繞方式否則紋理不完整 GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MIN_FILTER, GLES31.GL_NEAREST); GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MAG_FILTER, GLES31.GL_NEAREST); GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_S, GLES31.GL_CLAMP_TO_EDGE); GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_T, GLES31.GL_CLAMP_TO_EDGE); // 輸出紋理先分配空間 GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, textures[1]); GLES31.glTexImage2D(GLES31.GL_TEXTURE_2D, 0, GLES31.GL_RGBA8, width, height, 0, GLES31.GL_RGBA, GLES31.GL_UNSIGNED_BYTE, null); // 綁定到 image unit注意這里用的是 glBindImageTexture GLES31.glBindImageTexture(0, textures[0], 0, false, 0, GLES31.GL_READ_ONLY, GLES31.GL_RGBA8); GLES31.glBindImageTexture(1, textures[1], 0, false, 0, GLES31.GL_WRITE_ONLY, GLES31.GL_RGBA8); // dispatch注意這里按圖像尺寸計(jì)算工作組 int groupX (width 15) / 16; int groupY (height 15) / 16; GLES31.glDispatchCompute(groupX, groupY, 1); GLES31.glMemoryBarrier(GLES31.GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);邏輯說明glBindImageTexture的第三個(gè)參數(shù)是 mipmap 層級第四個(gè)參數(shù)layered對 2D 紋理傳 false第五個(gè)參數(shù)是層索引。GL_SHADER_IMAGE_ACCESS_BARRIER_BIT是 image 讀寫專用的屏障和 SSBO 的屏障不能混用。參數(shù)說明GL_READ_ONLY和GL_WRITE_ONLY是訪問限定和 shader 里的readonly/writeonly對應(yīng)寫錯(cuò)會(huì)導(dǎo)致鏈接失敗。3.2 工作組大小怎么選16×16 不是萬能答案local_size的選擇直接影響性能。我做過一組對比測試在同一臺(tái)中端設(shè)備上跑灰度化圖像 1920×1080local_size工作組數(shù)耗時(shí)ms備注8×8324004.2工作組太多調(diào)度開銷大16×1681002.8移動(dòng)端最常見甜點(diǎn)值32×881003.1長條形部分 GPU 不友好32×3220253.5超過部分設(shè)備的 size 上限結(jié)論16×16 在大多數(shù)移動(dòng) GPU 上是穩(wěn)妥選擇但如果你明確知道目標(biāo)設(shè)備是某類架構(gòu)可以針對性調(diào)。比如某些 GPU 的 wavefront 是 64 線程那 8×8 或 16×4 可能更匹配。判斷方法很簡單把 local_size 當(dāng)變量跑 benchmark 看耗時(shí)曲線拐點(diǎn)就是最優(yōu)值。3.3 用 SSBO 傳大數(shù)組比 uniform 更靠譜uniform 變量有大小限制移動(dòng)端通常只有 64KB 左右傳個(gè)幾千個(gè) float 就滿了。SSBO 沒有這個(gè)限制而且支持 shader 內(nèi)動(dòng)態(tài)索引。做點(diǎn)云處理或矩陣運(yùn)算時(shí)我一般直接用 SSBO省得算 uniform 夠不夠。// 矩陣乘法C A * BA 是 MxKB 是 KxN #version 310 es layout(local_size_x 16, local_size_y 16) in; layout(std430, binding 0) readonly buffer MatA { float a[]; }; layout(std430, binding 1) readonly buffer MatB { float b[]; }; layout(std430, binding 2) writeonly buffer MatC { float c[]; }; uniform int M, K, N; void main() { uint row gl_GlobalInvocationID.y; uint col gl_GlobalInvocationID.x; if (row M || col N) return; float sum 0.0; for (int k 0; k K; k) { // 行主序存儲(chǔ)A[row][k] a[row * K k] sum a[row * K k] * b[k * N col]; } c[row * N col] sum; }邏輯說明每個(gè)線程負(fù)責(zé)計(jì)算 C 的一個(gè)元素內(nèi)層循環(huán)累加 K 次。參數(shù)說明M、K、N通過 uniform 傳入因?yàn)樗鼈兪菢?biāo)量不占多少空間。這個(gè)實(shí)現(xiàn)沒有做 shared memory 優(yōu)化性能一般但勝在簡單易懂。如果要優(yōu)化可以把 A 的行和 B 的列緩存到 shared memory 里減少全局內(nèi)存訪問次數(shù)——這是進(jìn)階話題后面第 5 章會(huì)提。4. 避坑指南compute shader 在 Android 上的五個(gè)血淚教訓(xùn)這一章是我踩過的坑里最有代表性的五個(gè)每個(gè)都按「現(xiàn)象 → 原因 → 解決」寫希望能幫你省下幾個(gè)通宵。4.1 讀回?cái)?shù)據(jù)全是 0漏了內(nèi)存屏障現(xiàn)象dispatch 之后用glGetBufferSubData讀回結(jié)果發(fā)現(xiàn)全是初始值 0但 shader 編譯鏈接都沒報(bào)錯(cuò)。原因compute shader 的寫入對后續(xù)操作不是自動(dòng)可見的必須插入對應(yīng)的 memory barrier。SSBO 用GL_SHADER_STORAGE_BARRIER_BITimage 用GL_SHADER_IMAGE_ACCESS_BARRIER_BIT兩者不能混用。解決在glDispatchCompute之后、讀回之前調(diào)用glMemoryBarrier并傳入正確的 barrier bit。如果不確定用哪個(gè)可以傳GL_ALL_BARRIER_BITS但會(huì)有性能損失。4.2 shader 編譯失敗但日志為空現(xiàn)象glGetShaderInfoLog返回空字符串但GL_COMPILE_STATUS是 0。原因GLES 驅(qū)動(dòng)對 shader 錯(cuò)誤的報(bào)告不總是可靠尤其是某些廠商的驅(qū)動(dòng)。常見觸發(fā)點(diǎn)是local_size超過設(shè)備上限或者std430布局用在了不支持的地方。解決先檢查GL_MAX_COMPUTE_WORK_GROUP_SIZE確保 local_size 沒超。然后在 shader 開頭加#version 310 es確認(rèn)沒有漏掉。如果還是空日志把 shader 簡化到最小可復(fù)現(xiàn)版本逐步加回代碼定位問題。4.3 圖像邊緣出現(xiàn)黑邊或錯(cuò)位現(xiàn)象處理后的圖像在右邊緣和下邊緣出現(xiàn)黑邊或者整體偏移了幾個(gè)像素。原因dispatch 的工作組數(shù)量是按(width 15) / 16向上取整的多出來的線程如果沒做邊界檢查會(huì)寫到圖像外面或者讀到越界數(shù)據(jù)。解決在 shader 的main開頭加邊界檢查用imageSize或傳入的尺寸做判斷越界直接return。這個(gè)檢查幾乎不耗性能但能避免一堆詭異問題。4.4 性能不如預(yù)期可能是工作組太小或太大現(xiàn)象compute shader 跑起來比 CPU 還慢或者只比 CPU 快一點(diǎn)點(diǎn)。原因工作組太小比如 4×4會(huì)導(dǎo)致工作組數(shù)量爆炸調(diào)度開銷吃掉并行收益工作組太大比如 32×32可能超過設(shè)備上限或者導(dǎo)致寄存器壓力過大、occupancy 下降。解決用 16×16 作為起點(diǎn)然后以 2 的冪次調(diào)整跑 benchmark 找拐點(diǎn)。同時(shí)用glGetIntegeri_v讀設(shè)備的GL_MAX_COMPUTE_WORK_GROUP_SIZE和GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS確保不超限。4.5 在低端設(shè)備上直接崩潰現(xiàn)象在高端機(jī)上跑得好好的 shader到低端機(jī)上直接閃退或黑屏。原因低端 GPU 的 compute 能力可能很弱比如GL_MAX_COMPUTE_WORK_GROUP_COUNT只有 65535而你的 dispatch 數(shù)量超過了這個(gè)值?;蛘?SSBO 的最大尺寸不夠分配失敗。解決在初始化時(shí)讀所有相關(guān)上限dispatch 前做檢查。如果超限要么分塊處理要么回退到 CPU 路徑。我一般會(huì)寫一個(gè)isComputeSupported()方法在進(jìn)入 GPU 路徑前統(tǒng)一判斷。5. 進(jìn)階技巧用 shared memory 和異步讀回把性能再壓一截走到這里你已經(jīng)能跑通 compute shader 的基本流程了。但要讓它在生產(chǎn)環(huán)境里真正能打還有兩個(gè)技巧值得掌握shared memory 減少全局內(nèi)存訪問以及異步讀回避免阻塞渲染線程。5.1 shared memory把重復(fù)讀取的數(shù)據(jù)緩存到片上矩陣乘法那個(gè)例子里每個(gè)線程都從全局內(nèi)存讀 A 的行和 B 的列訪問次數(shù)是 O(M×N×K)。如果用 shared memory 做分塊可以把訪問次數(shù)降一個(gè)數(shù)量級。// 分塊矩陣乘法tile size 16 #version 310 es layout(local_size_x 16, local_size_y 16) in; layout(std430, binding 0) readonly buffer MatA { float a[]; }; layout(std430, binding 1) readonly buffer MatB { float b[]; }; layout(std430, binding 2) writeonly buffer MatC { float c[]; }; uniform int M, K, N; // 每個(gè)工作組共享一塊 16x16 的緩存 shared float tileA[16][16]; shared float tileB[16][16]; void main() { uint row gl_GlobalInvocationID.y; uint col gl_GlobalInvocationID.x; uint lx gl_LocalInvocationID.x; uint ly gl_LocalInvocationID.y; float sum 0.0; // 按 tile 分塊累加 for (int t 0; t (K 15) / 16; t) { // 協(xié)作加載 A 的 tile uint aCol t * 16 lx; if (row M aCol K) tileA[ly][lx] a[row * K aCol]; else tileA[ly][lx] 0.0; // 協(xié)作加載 B 的 tile uint bRow t * 16 ly; if (bRow K col N) tileB[ly][lx] b[bRow * N col]; else tileB[ly][lx] 0.0; // 等待所有線程加載完成 barrier(); // 用 shared memory 里的數(shù)據(jù)做累加 for (int k 0; k 16; k) { sum tileA[ly][k] * tileB[k][lx]; } // 等待所有線程用完才能進(jìn)入下一輪加載 barrier(); } if (row M col N) c[row * N col] sum; }邏輯說明shared變量是工作組內(nèi)所有線程共享的片上內(nèi)存訪問速度比全局內(nèi)存快一到兩個(gè)數(shù)量級。barrier()是工作組內(nèi)的同步點(diǎn)確保所有線程都加載完 tile 之后才開始計(jì)算計(jì)算完才能進(jìn)入下一輪加載。參數(shù)說明tile size 取 16 是因?yàn)楹?local_size 一致這樣每個(gè)線程正好負(fù)責(zé)加載一個(gè)元素。如果 local_size 是 16×16tile 也是 16×16加載和計(jì)算的比例是 1:16收益明顯。5.2 異步讀回用 PBO 避免 glReadPixels 阻塞處理完圖像后如果直接glReadPixels讀回會(huì)強(qiáng)制等待 GPU 完成所有工作CPU 和 GPU 串行化。用 PBOPixel Buffer Object可以異步讀回讓 CPU 在 GPU 還在算的時(shí)候就去干別的。// 創(chuàng)建 PBO int[] pbo new int[1]; GLES31.glGenBuffers(1, pbo, 0); GLES31.glBindBuffer(GLES31.GL_PIXEL_PACK_BUFFER, pbo[0]); // 分配空間但不傳數(shù)據(jù) GLES31.glBufferData(GLES31.GL_PIXEL_PACK_BUFFER, width * height * 4, null, GLES31.GL_STREAM_READ); // 發(fā)起異步讀回此時(shí) GPU 還在算CPU 不阻塞 GLES31.glReadPixels(0, 0, width, height, GLES31.GL_RGBA, GLES31.GL_UNSIGNED_BYTE, 0); // CPU 可以在這里做其他事情比如更新 UI // 需要數(shù)據(jù)時(shí)用 glMapBufferRange 映射這一步才會(huì)真正等待 ByteBuffer mapped (ByteBuffer) GLES31.glMapBufferRange( GLES31.GL_PIXEL_PACK_BUFFER, 0, width * height * 4, GLES31.GL_MAP_READ_BIT); if (mapped ! null) { // 處理 mapped 里的數(shù)據(jù) GLES31.glUnmapBuffer(GLES31.GL_PIXEL_PACK_BUFFER); }邏輯說明glReadPixels的最后一個(gè)參數(shù)傳 0 表示偏移量實(shí)際數(shù)據(jù)寫到當(dāng)前綁定的 PBO 里。glMapBufferRange返回一個(gè)直接映射到 GPU 內(nèi)存的 ByteBuffer這一步會(huì)等待 GPU 完成但之前的時(shí)間 CPU 是自由的。參數(shù)說明GL_STREAM_READ是提示驅(qū)動(dòng)這塊 buffer 會(huì)被頻繁讀取驅(qū)動(dòng)可以據(jù)此優(yōu)化內(nèi)存分配。5.3 一個(gè)判斷值不值得上 compute shader 的簡單標(biāo)準(zhǔn)不是所有任務(wù)都適合 GPU。我的經(jīng)驗(yàn)是如果任務(wù)滿足「數(shù)據(jù)并行度高、每個(gè)元素計(jì)算獨(dú)立、分支少」那 compute shader 大概率能帶來 5 到 20 倍的加速。如果任務(wù)里有大量分支、遞歸、或者數(shù)據(jù)依賴強(qiáng)GPU 的優(yōu)勢會(huì)被抵消甚至不如 CPU。具體判斷方法先寫一個(gè) CPU 版本測出耗時(shí)。如果單幀處理時(shí)間超過 16ms60fps 的預(yù)算且數(shù)據(jù)量超過 100 萬個(gè)元素那就值得試試 compute shader。如果數(shù)據(jù)量只有幾萬GPU 的調(diào)度開銷可能比計(jì)算本身還大不如用 NEON 優(yōu)化 CPU 路徑。我自己的習(xí)慣是新算法先用 CPU 寫一版跑通邏輯確認(rèn)結(jié)果正確后再把熱點(diǎn)循環(huán)搬到 compute shader 里。這樣調(diào)試成本最低——GPU 端的調(diào)試工具鏈遠(yuǎn)不如 CPU 成熟別一上來就在 shader 里死磕。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
青青草白白色| 久久精品无码不卡| 日日噜噜夜夜狠狠视频无| a片亚洲一本通视频| 8050无码八戒| 日韩福利综合一区| 欧美日韩人人精品| 91麻豆va国产精品| 国产亚洲日本精品在线| 一区二区三区免费视频入口| 亚洲精品天堂久久A∨51成人漫| 麻豆人妻少妇在线免费观看| 亚洲图片欧美91N| 综合久久久久久久综合网| 天啪| 99热这里都是精品| 深爱伊人影院| 日本五区不卡| 熟女露脸激情自拍视频| 香蕉免费一区二区三区不读 | 亚洲 综合 欧美| 中国操逼无码| 成人一级性爱| 大黄片做爱的大的| 色婷婷九月天天综合| 熟女露脸激情自拍视频| 亚洲天堂女优在线| 美女超碰978| 夜夜草网站| 亚洲中文字幕在线视频一区二区| 国产97色在线| 亚洲av综合伊人久久| 日韩另类色图| 亚洲aw毛茸茸在线| 欧美日本天堂| 日韩精品资源| 日本色色视频网站| 国产九九九九九九九九| 日本熟妇熟色97一本在线观看| 啊啊啊不要好疼视频| 吖在线不卡一区二区国产剧情 | 激情小说激情视频| 26uuu成人影片| 18禁免费视频| 丁香六月综合激情| 91总综合网| 5252色欧美在线男人的天堂| 中日韓欧美高清| 色情综合网| 天综合网| 妇女乱色二区| a一区二区三区乱码在线| 国产精品嫩草影院免费| 亚洲 日本 一 二 三| 天操天操夜操夜月操月年年操| 1二区9| 一区二区三区一亚洲中文字幕、综合区灬 | 国产精品96久久久久久| a天堂视频| 91人妻视频在线| 96超碰网| 大香蕉五月天| 国产一级作爱毛片| 热久日综合| 97久久精品| 操一区| 97国产精品久久久久| 色综合国产在线观看| 日本污ww视频网站| 日本道人妻久久久在线不卡色视频| 国产操逼网站亚洲一级黄色| 欧美老熟另类| 2024黄色视频| 日本精品性生活久久久| 精品人妻一区二区蜜桃视频| 日韩 欧美 国产 麻豆| 爱爱啊啊啊| 色色国产| 婷婷超| 日本丝袜美腿人妻九九| 2021国产成人精品久久| 啊啊啊啊啊操我视频| 亚洲激情片| 97碰| 亚洲人成色9999精品久久| 欧美综合第一页| 亚 欧 美 综合| 欧美欧美啪啪视频| 亚洲欧美另类少妇精品| 色狠狠 - 百度| 青青草原成人| 9丨久久九九九| 久久是精品| 国产亚洲女v在线观看| 中文字幕在线观看第二页| 亚洲欧美不卡线| 91 丝袜在线| 国产午夜激片Av毛片不卡| 中文字幕欧美日本乱码一线二线| 国产成人精品日本亚洲语言| 欧美在线91| 啊啊啊好舒服好爽啊啊啊视频| 欧美视频第二页| 欧美日韩色综合网| 91熟女网| 国产精品粉嫩福利在线| 亚洲中文制服诱惑| av资源在线观看少妇| 久热一区二区| 9久热这里只有精品| 嗯……啊…嗯嗯…啊…好舒服| 操逼国产免费| 热无码中文亚洲H一道本一区二区| 国内精品久9| 91是天天| 久久精品欧美一区蜜桃| 成人精品在线| 免费av在线播放二区| 天天久久久久久| 亚洲另类综合欧美| 九九无码| 大香蕉伊在线久草麻豆天堂故事| 欧美日韩 强奸乱伦| 操比国产| 国产精品第一区第一页| 91在线色综合| 传媒免费一区二区三区| 少妇3P性爱自拍| 91青视频| 五月天丁香| 少妇 综合| 91丝袜美腿片| 性影在线视频| 91国精产品| 熟女熟妇伦久久影院毛片一区二区 | 熟妇操花| 人妻夜夜爽天天爽三区麻豆AV网站| 亚洲色图20p| 亚洲色人| 四虎av在线| 偷窥自拍亚洲色图| 91日本在线观看| 国产精品视屏| 熟女高潮精品一区二区| 九九英色视频| 五月天激情国产综合婷婷婷| 老熟女搡BBBB搡BBBB视频| 亚州熟妇精品| 91大神电影天堂| 精品然女一区二区| 日本一区二区成人在线| 伊色久人大在线| 在线黄页看毛片| 久久的免费性爱视频| 伊人991| 亚洲男人的天堂亚洲| 中国一级操逼视频| 翔田千里AV无码秘 三区| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 亚洲综合草草| 亚洲欧美日韩电影网站一区 | 亚洲日本激情| 日韩9区| 偷拍亚洲情色| 91狠狠色丁香婷婷综合久久精品| 久久这里只精品免费福利| 女同性恋中文字幕| 精品人妻视频一区二区在线播放 | 亚洲一区二区三区中文字幕| 国产 日韩 欧美一区| 久久精品成人| 国产精品午夜精品| 欧美精品欧美精品系列| 91人妻丝袜无码| 97在线精品| 人人爱人人操人人性| 亚洲熟女精品| 清纯唯美亚洲综合| 国产400孕妇孕交群| 亚欧成人综合影院| 成人五月天丁香激情综合| 偷拍精品一区二区三区| 一起草三级AV电影在线观看 | 久久久性爱视频| 大稥蕉免费视频这里只有精品| 国产成人精品亚洲日本| 亚洲色综合| 丁香婷婷久久| 亚洲人在线| 精彩视频日韩| 欧洲乱码视频| 97日韩欧美亚洲| 亚州高清AV| 国产精品无码在线| 隔壁邻居波多野结衣中文字幕| 久久久国产av美女私房| 少妇高潮对白在线观看| 91女网站| 92大香蕉| 乱伦一区二区三区‘| 欧美国产伊人久久久久| 日本有码影片下载| rivers-china.com| 国产精品无码av在线| 色综合久久久久| 激情终合网| 麻豆亚洲AV成人无码久久精品| 久久精品人人做人人看| 人妻熟女午夜精品在线| 亚洲精品蜜桃久久久久久久| 天堂а√在线最新版在线| 午夜一区二区三区国产| 伦理弟一页| 2017天天操| 精品国产片亚洲一区| 国模91| 国产超碰AV在线精品| 人妻激情偷乱视频一区二区三区| 久久蜜桃一区二区| 精品国产精品一区二区| 综合色久欲| 乱伦av麻豆| 亚州春色| 美国日韩黄色片| 亚州色图欧美| 国内毛片国产专区二| 啊啊啊不要好爽日韩无码一区| 美女淫穴| 欧美一区二区三区四区综合| 欧美亚洲厕所精品偷拍91 | 香蕉精品二区二区| 爱我干综合| 久久9精品网站| 极品极品色影院| 性感美女91影视| www.激情| 国产特级毛片AAAAAA高潮流水| 超碰地址97| 台湾成人无码AV| 天天天操天天天爱| 免费观看有码高清视频| 日韩av免费一级电影| 日韩久久艹| 日韩一级成人毛片免费观看| 久久国产精品视频| 亚洲色图超碰在线| 国产网站在线播放| 中国AAAAAA黄色片| 色九九九九九九| 亚洲 欧美 中文 日韩超碰| 久久超碰亚洲人| 日韩99精品视频综合区| 黄色工厂这里只有精品| 亚洲怡春院| 色av中文字幕| 91天天综合网,天天综合网| 九九热九九| 欧美色视频在线| 日韩成人高清一区二区| 黄色成年| 啊啊啊啊,啊啊好多水| 夂久色| 午夜啪啪片| 成年人黄色| 欧美黑人91| 人妻精品综合中文字幕在线| 婷婷导航| 中文字幕在线观看丝袜| 六月丁香啪啪| 丁香六月综合激情| 思思99热| 天综合网| 99热免费精品| 亚洲色香| 白丝在线一区| 男人天堂网手机版婷婷| 粉嫩久久久极品| 国产成自自拍在线观看| 欧美白嫩女HD| 好看的久久不射无码影视影院| 精品 码产区一区二-1080P高清在线www-B029AV| 曰韩精品视频一区二区| 综合免费无码中文| 一区三区啪啪| 99超级碰免费视频| 色综合91| 九九成人精品| 中文字幕精品专区搜索结果91| 99久热精品99re6热| 东京热精品97综合网| 欧美熟妇亚洲版| 天天插天天操天天摸天天射天天看| 99RE在线视频精品,这里只有精品| 久久9亚洲| 大香蕉中文aV在线| 日本不卡一区二区三区| 少妇色欲综合网2| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 一卡二卡三卡| 91春色| 肏逼视频日本| 9超碰免费| 久久欧洲| 99久在线精品99re8蜜桃| 啊啊啊啊啊啊好多水| 亚洲欧美电影| 桃花色涩综合影院| se,,,亚洲欧美| 亚洲欧美综合网| 嗯嗯嗯嗯啊啊啊好紧好大| 婷婷色网| 91亚洲综合| 久久久九97| 国产中文字幕在线点播| 日韩中文字幕国产| 伊人久久综合精品欧美| 日本免费中文字幕在线| 久久av成人无码免费| 一区二区三区免费岛国片| 超碰成人最新最好看| 久精品无码av一区二免费国产在线观看 | 青青草在线成人视频| 伊色综合天堂色97| 免费网色网站| 安微少妇操BBB| 97伊人网| 国产精品视频麻豆入口| 久久欧美性爱视频| 天天做天天爱天天高潮| 亚洲欧美爆| 欧亚成人在线视频| 精品久| 色婷婷六月丁香七月婷婷| 日韩操逼性鲍| 99热伊人| 蜜桃视频一区二区三区| 午夜性刺激视频免费观看| 伦激情人妻另类人妻| 亚洲一卡2卡3卡4卡乱码网站| 无码 有码 国产18p| 丁香五月婷婷色| 嗯嗯啊啊操死我| www.男人天堂| 91精品国产综合久久久蜜臀酒店| 99国产在线 精品 视频| 亚洲中文字幕网| 欧洲Au麻豆| 综合性视频99| 天天干天天舔| 久久五月综合| 亚州高清av| 熟女人妻精品一区二区视频 | 大香交| 精品综合久久久久久五月天| 精品v日韩欧美国产| 亚洲欧洲小说图片视频 | 九月丁香婷婷| 日韩欧美久久婷婷网站| 91影库| 先锋精品av色鲁| 欧美成人国产精品| 久久国产乱子伦精品免费女人| 99激情视频| 中文字幕诱惑制服人妻丝袜美丝袜美 | 日韩内射视频| 亚洲综合九九| 日本天天色| 走光一区92下载| 日本操逼视频在线| 人人天天欧洲| 91bbbbbb| 日韩午夜啪啪视频| 久久宗合97| 精品中文字幕第一页| 99热这里只有精| 一区二区三区看视频| 亚洲高清无码在线桃色| 人人妻人人色| 日B操| 欧美中文字幕男人天堂久久精品| 91操熟女视频| 无码日韩网站| 国产一| av最新免费中文字幕| 打av高清| 亚洲欧洲日韩天堂av| 夜夜夜久久| 91狠狠| 男人兔费天堂| 日日爱99| 97爱亚洲综合色| 青娱乐老司机视频| 五月天伊人| 夜夜草我| 一二三四视频在线社区中文字幕| 3P乱轮视频| 老司机午夜福利视频一区二区| 色欲三区| 校园春色中文字幕AV| 高清国产成人无码| 91无摭挡| 蜜臀av一区二区三区免费观看| 美女好片色日本| 天天干天天插| 日韩性爱啪啪视频| 国产亚洲色婷婷99精品91| 久久午夜鲁丝片| 东京热一区二区三区四区五区六区| 人妻精品视频一区二区三区| 亚洲精品欧洲精品| 黑人嘿嘿嘿超爽免费视频| 九七毛片九九毛片| 日本三级日本三级99| 欧美狠狠狠| 97AV爱| 国产美女自拍AV| 日韩免费在线观看不卡| 老女人碰碰在线碰碰视频| 91成人久久 | 欧美亚男人的天堂| 最新日日夜夜天天干干| 亚洲色图自拍| 啪啪综合网| av亚欧| 天天舔天天日天天射| 日韩精品在线观看网站| 天天综合网网欲色| 欧美午夜视频| 91丨九色丨东北熟女| 极品国产内射| 久久精品一区二区三区蜜桃臀| 99视频精品| A片大香蕉在线| 激情婷婷丁香| 国色天香av| 精品午夜福利国产一区二区在线观看| 麻豆天天躁天天揉揉AV| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 一本色道熟妇| 美欧老女人97| 中文字幕在线观看丝袜| 日韩av不卡在线看| 天天欧美| 走光一区92下载| 91久久国产综合久久| 中国大陆国产高清AⅤ毛片| 超碰九九| 日本欧美m v精品网站加| 欧美天天拍| 俺去俺来也在线www| A级片一区| 天天综合91入口| 精品视频97| 天天舔天天 | 精品v日韩欧美国产| 国产精品人妻免费精品| 疯操AV| 啊啊啊97视频| 黄页大片在线观看| 三级三久久线久久99久目本WW| 级做a爱无码性色永久免费| 久久伊人影院| 久久久久久裸体| 超碰人妻久久人妻中文97| 992这里有精品| 无码乱人伦中文视频| 国产无码高清操逼视频| 日韩色| 乱人乱色一区二区三区免费| 中亚黄色三级大片| 久久久久久中文版| 蜜臀亚洲中文| 久久大香蕉手机高清视频| 亚洲欧美日韩综合在线尤物| 思思性爱| 日本成人电影资源网| 久久久久久久久久久免费精品| 伊人麻豆传媒| 久久久一区二区三区四区五区| 人澡逼| 激情人妻另类| 大黄片做爱的大的| 一区不卡在线观看av| 日本一区二区中文字幕久久| 香蕉视频欧美一卡二卡| 精品999999| 欧美96精品在线| 91亚洲图片| 易易A毛视频| 国产sv美女内射| 夜夜夜爽www精品视频| 99色在线| 外国91| 婷婷丁香激情| 亚洲AV麻豆Aⅴ无码电影一| 国产亚洲99久久精品熟| 极品欧美一区二区三区| 麻豆国产视频精品观看| 老司机天天操| 国产偷拍自拍在线视频| 日本在线视频导航| 色玖玖| 精品一区二区三区蜜桃臀赵总| 日本熟妇一区二区三区| 啊啊啊啊啊啊啊国| 一区二区 电影 亚洲| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 我爱操| 极品色综合| 国产精品视屏| 激情抓乳插进去啪啪啪日韩| 欧美日本一区二区a人| 99热国产| 内射中出日韩在线观看视频| 五月天色电影| 亚洲伊人久久精品影院| 全国男人天堂网| 91精片| 1级黄色夫妻对换性交免费看| 日本免费一级AAA大片器| 强奸乱伦日韩AV| 国产av尤物| 情色五月天久久久| 97视频免费在线| 免费视频97| 欧美日韩黄片精品在线| 午夜国产成人福利视频| 欧美专区第一页| 欧亚成人在线视频| 99av| 久草免费福利在线播放| 日本在线一二| 欧美国产操逼| 国产深夜福利| 激情干在线| 中文字幕精品丝袜| 欧美韩日精品99综合| 人妻天天爽天天爽三区| 国产吞精a级片激情电影| 伊人97超碰| 亚洲最新a在线观看| 大香蕉亚洲中文| 夜精品久无码| 欧差乱伦二三| 色欲天天综合网| 天天夜夜久久| 精品人妻av区天天看片| 乱伦系列一区二区| 日韩99999色| asc国产精品| 小视频国产| 欧美午夜精品久久久久久超碰| 亚洲天天影视综合网| 亚洲精品人体| 综合色播| 夜夜春夜夜操| 一本一道波多野毛片中文在线| 少妇高潮99p| 白嫩妹子国产骚| 日本免费人成视频播放120秒| 美女诱惑1区2区| 天天日骚逼熟女| 91在线秘 男同| 67914在线精品观看| 久久二| 91Chinese在线| 日日日大屁股骚女人精品| 中文字幕高清精品一区| 四月丁香婷婷| 久久 精品| www.婷婷六月天| 久久精品日韩专区免费观看| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 狠插 制服 自拍| 97在线观看免费视频| 25国产精品免费观看| 午夜福利一区二区三区四区五区色婷婷| ji熟女.com| 中文乱码99| 国产强奸AV在线| 二区熟妇韩日| 桃花色综合影院| 尤物av网站| 国产91影院| 毛片17S| 中国操逼无码| 最新中文字幕av| 亚洲AV成人无码一二三久久| 久久水蜜臀亚洲AV无码精品| 天天谢天天干| 天天操天天7| 日韩少妇一区二区三区| 91高清欧美| 男人的天堂亚洲| 精品午夜福利导航| 中文字幕在在线观看网站| 人妻天天爽天天爽三区| 97免费视频网| 精品成人动漫一区二区| 天天天操天天天爱| 九九伊人网| 综合欧美亚洲| 大香蕉伊在线久草麻豆天堂故事| 国产精品爽爽v| 夜夜青青无码影院| 91精品综合久久久久久五月丁香| 中文字幕第2页| 蜜臀在线免费观看在线免费观看| 自拍偷拍亚洲熟女妇人精品| 日韩淫色网| 亚洲无码99| 日本αv| 亚洲综合夜色| 婷婷97| 久草尤物| 色偷偷综合91久久噜噜| 色综合91| 青青操综合网| 999精品乱码| 久久久久久久久九九久孕交| 午夜精品久久久久久久99蜜桃一| 大香蕉综合网| 亚洲精品1区| 97干在线视频| 午夜精品久久久久久久久久蜜桃| 99热欧美| 中出789在线视频| 久久人妻精品| 性爱乱伦视频免费| 成人性交免费视屏| 91天天爱| 又大又白奶子| 在线强奷到舒服的无码视频 | 久久婷婷欧美| 亚洲有薄码区日本系列中文字幕| 美女午夜福利免费视频| 亚州综合在线| 亚洲熟女乱色一区二区三区久久久| 久久综合九九| 日本精品无码三级网站| 久久精品久| 久久9精品网站| 亚欧中文字幕在线视频| 97人人操人人干| 国产精品麻豆视频网站| 毛片一区二区| 久久久一区二区三区麻豆| 97精品第3页| 97九色人妻| 国产精品视频精品一二| 精品国产一区二区三区四区在线看| 美女91在线| 国产精品97超碰| 密臀视频一区二区三区| 台湾佬激情综合| 国内三级自拍小视频在线观看| 亚洲成人在线高清| 神马九九| …亚洲黄色厕厕女女在线播…| 中文一区二区| baiduhicn.com。| 91neishe| 色蜜AV| 午夜欧美女人操逼| caoni国产亚洲av| 欧美激情性久久久久久| TS人妖另类精品视频系列| 亚洲人妻五月丁香婷婷| 208天天久久九九九| 综合97亚洲| 天天干天天日天天射黄色片| 91女在线观看| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 日韩三级视频一区二区三区| 综合自拍| 91|九色|国产熟女| 欧美性爱在线无码| 国产高清成人传媒影视| 福利色色| www黄片免费看com| 免費黃色視頻觀看一| 人人操,操人人| 亚洲av综合色区无码一| 伦伦成年午夜免费视频| 日本丝袜人妻内射| 国产一区二区精品久久99| 无码人妻精品一区二区中文| 成人av影院在线观看| 免费观看国产小粉嫩喷水精品午| 成人影院永久免费观看网址| 国产日韩欧美中文在线播放| 人人 操人人 操人人| 无码最新| 久久‘黄片视频| 乱老女人一区二区视频| 九九色精品| 麻豆天美国美国产AV| 极品丝袜无码| 97亚洲资源| 97碰碰日本乱偷人妻中文的| 夜夜爽爽夜夜精品视频| 婷婷精品国产欧美精品亚洲人人爽| 物业黑人 AV一区| 青青草导航在线视频| 九九九九热只有精品| 欧美 亚洲 第一页| 永久免费av无码网站国产app| 正在播放国产精品一区| 欧美黑人精品一区二区| 六月丁香五月婷婷| 超碰在线974| 欧美男人亚洲天堂| 99999亚洲另类| 久久人妻| 精品亚洲国产成人av网站| 激情久久av一区av二区av| 五月婷婷色| 天天爽夜夜欢视| 国模久久在线| 国产久久久| 亚洲欧美综合区自拍另类| 亚洲欧美国产其他二区| 大香蕉男女超碰精品在线| 99国产精品久久久久久久成人热| 欧美91久久久久| 99夜夜操| 国产宅男宅女在线观看| 99色色网| 亚洲色资源| 亚洲日韩美女丝袜美腿人妻视频| 久久久久久亚洲Av无码| 无码少妇精品一区二区60岁老人 | 国产不卡免费在线视频| 久久久久久午夜男人的天堂| 欧美日韩精品国产91| 久操电影网| A片大香蕉在线| 欧美日韩性爱精品| 午夜精品久久久久| 91色亚洲| 岛国大片在线观看网站入口| AV 少妇 人妻 偷拍| 九九热精彩视频| 国产女大学生AV| 熟女人妻一区二区三区| 91在线美女| julia国产在线 | 男人的天堂网页| 人人操人人摸人 | 九九热精品免费视频| 大但人体久久久久| 成人无码在线视频网站| 日本免费中文一区二区三区四区| 国产精品久久久九九九| aaa亚无码专区| 色婷婷丁香五月| 60秒免费视频| 1769国内精品视频| 国产一区二区三区中文字幕| 男人的天堂三级| 国产日韩精品人妻久久久久色欲网站| 99久久久无码| 91色婷婷综合久久中文字幕二区| 青青草丝袜在线视频| 日日黄色三级网站| 午夜男女爽爽大片免费观看| 天天综合色电影| 久久久久久十| 午夜一区| 天天色综合影视网| 日本操BAV| 97视频在线免费播放| 久久国产乱子伦精品免费女人| 99re这里只有精品3| 欧亚日韩中文在线| 无码又爽又硬又激情免费视频 | 亚洲日韩av一区二区三区百合| 神马麻豆福利院| 一级黄色影片| 日韩无码人妻中字久久三区四区| 96久久精品一二三区色欲| 亚洲精品一卡二卡三卡福利视频网站| 日韩一级性爱无码| 国产精品网站免费| 亚洲AV秘无码一区..| 欧美综合加勒比在线| 精品人妻一区二区三区四区石在线| 天天欧美色| 亚洲 暴爽 AV人人爽日日碰| 蜜色网色哟哟| 思思热在线视频免费| 国产一级久久久| 人人操人人操人人人操| 蜜臀久久久国产| 日韩欧美tv一区二区在线观看| 久久精品国产久精国产| 日韩久久.一级黄色片| 亚洲人久久久网| 91精品啪在线观看国产城中村| 狠狠爱夜夜干| 热九九精品| 亚州性色| 久草色悠悠在线视频| 无遮挡一级毛片视频免费的| 欧美熟妇亚洲版| 免费观看的黄色的网站| 亚洲第一视频 欧美风情 日韩| 欧美色图99| 五月丁香成人网| 另类专区加勒比| 97精品人妻一二三四| 国产视频第二页| 国产欧美精选自拍一区| 色嘟嘟人妻天堂网| 亚洲国产97在线精品一区| 性爱乱伦视频免费| 偷窥自拍亚洲色图| 大香蕉人妻久久| 99精品久久久久久久婷婷| 婷婷三区| 99re9| 色婷婷丁香| 日本性一区| 这里只有精品视频在线观看麻豆| 欧美最婬乱婬爆婬性视频| 伊人九九| 在线观看日韩av不卡| 国产亚洲精品美女| 国产视频一区二区三区在线免费观看 | 日韩福利综合一区| 亚洲综合射| 2021国产成人精品久久| 欧美婷婷| 欧美激情亚洲| 日韩国产中文字幕| 97伊人超碰| 亚洲精品无码少妇久久| 综合97久久| 黄色视频特级毛片| 任你干在线视频| 伊人五月天激情| 精人妻无码一区二区三区伊人直播| 亚洲欧美日韩免费电影| 欧美aⅴ99久久黑人专区| 精品久久久久久AV无码| 综合网欧| 亚洲精品性爱片| 久久久久9999妇女| 中文字幕乱在线伦视频中文字幕乱码在线| 97久久久精品| 色欲蜜臀AV| 人人爽夜夜玩视频| 天天插天天操| 久久久精品网| 91xingse| 久久精品国产亚洲AV高清演员表| 北京美女一区二区| 色婷婷九月天天综合| 亚洲日本大香蕉1| 婷婷激情综合网| 亚洲精品少妇| 东北老女人的激情视频| 午夜AV人气不卡| 天天大干大香蕉| 国产欧美一区激情交| 欧美激情在线观看视频| 亚洲天堂色图| 天天色天天干天天射| 男人的天堂日韩| 99激情视频| 男女一进一出视频久久| 99色日| 精品黑人一区二区| 中文字幕乱码在线观看| 亚洲综合图文| 成人免费在线网站| 另类图片天天影视| 西西美女视频网| 国产18精品亚洲精品| 99热这里只有精品18| 操b网站亚洲无码| 5278欧美一区二区三区| 97国产超碰| 欧美亚洲厕所精品偷拍91| 国产精品久久久三级无码| 屁股久久久久久久| 色阁阁AV综合网| 色五月婷婷五月天| 欧美午夜视频免费观看| 亚洲色婷婷综合久久一区二区三区| 欧美少妇大量自拍视频在线观看| 麻花豆传媒剧国产MV出差| 久久亚洲一区二区色婷婷| 天堂国产AV| 91精品丝袜久久久久久| 黄色香蕉视频网站一区| 亚洲猛交| 中文字幕在线2| 欧美黑人猛交春色影视大全| 日韩欧美俄罗斯A片| 青青草中文字幕| 91精品少妇搡搡搡| 亚洲精品欧美专业| 99热精品在线| 欧美日韩激情无码专区| 加勒比综合| 熟女91网| 嗯嗯啊啊好疼| 欧美日韩国产中文精品字幕自在自线,| 老司机老司机午夜影院| 亚洲 小说 欧美 激情 另类| 伊香蕉综合久久久久久久噜噜噜 | 日韩97P| 婷婷五月天色网| 麻豆 亚洲 97| 人妻在线臀日韩| 亚洲综合色网| 国产男女无套视频免费观看| 人人操人人舒服| 五十路熟女人妻一区二区在线观看| 天美麻豆黄色录像| 亚洲图片 激情小说| 人人爽夜夜操| 国产精品91一样| 五月丁香综合激情| 囯产乱伦一区二区三女| 亚洲情色中文字幕一区| 久久久久亚洲av综合波多野制衣| 久久午夜色播影院免费高清| 男同专区一区二区三区在线| 免费男人的天堂| 骚逼自拍99| 色男人色天堂东京热| 欧美精品双插| 欧美狠狠弄| 欧美九九99久久精品| 67194无码不卡| 午夜激情床戏激情| 91大胆欧美| 婷婷日韩一区二区三区中文字幕在线| 91九色精品熟女内射| 日本精品不卡一二三区| 一起草精品人妻| 69精品久久久久中文字幕| 中国国产精品一区视频| 一区二区三区视频国产免费| 思思热久久成人| 男人a天堂手机在线版| 国产www色在线观看| 乱伦3P视频| 日本午夜精品理论片A级APP发布| 日本午夜福利影院| 久久综合激情| 欧美成人9797| 高树玛利亚无码流出| 精久久久91| 欧美亚洲厕所精品偷拍91 | 免费av高清无码| 久久五月天婷婷丁香中文字幕| 女人被男人桶爽视频网站| 亚洲色图日韩精品| 精品国产片亚洲一区| 激情五月天婷婷| 91天天日| 神马久久啊啊| 亚洲国产福利视频| 色图四区| 国产精品不卡一区二区三区av| 国产精品久久久久久久AV大片 | 骚货人妻偷情自拍在线视频| 欧美最婬乱婬爆婬性视频 | 婷婷丁香成人| 久久精品免费| 九九热精彩视频| 久艹免费| 粉嫩av平台| 亚洲九月丁香| 久久黄色网址| 天天综合网~91综合网| 99re黄| 五月天久久综合网| 思思热免费视频观看| 区日韩亚洲乱码av电影| 好舒服视频| 91精品国产91熟女| 精品国产一区二区三区香蕉欧美| 强奸a片网| 宗合情欲网| 天堂av最新电影网| 最近2018中文字幕在线高清第一页| 久久久免费的精品| 亚洲精品一区二区三区新线路| 国产第二页| 超碰2017| 亚洲女毛多水多21P| 啊嗯好大视频在线观看| 熟妇高潮二区三区| 青春草莓视频在线观看网址| 国产色呦呦| 欧美色图私拍91| 欧姜老司机| 凹凸久久人人| 美腿色图| 91久| 欧美成人一级免费电影| 欧美色九九九| 怡春院久久| 精品高清一区二区三区三州| 国产欧美伊人| 日1区2区3区2020| wwwxxx日本爽| 国产不卡精品91| 久啪视频| 日本高清_区二区三区| 青青草自拍视频在线播放| 性欧美第一页| 亚洲成人日韩小说| 情色av电影| 精品视频在线观看| 五月婷婷色| KK色在线影院| 国语精品内射在线观看| 四虎视频在线观看| 国产精品免费久久久久久久久久| 九九色精品| 91蜜桃传媒精品久久久一区二区| 无码WWW免费视频网站| 夜夜狠狠躁日日躁色视频| 亚洲学生妹高清av| 免费观看有码高清视频| 97ai亚洲| 国产久久久久久久久一区二区| 91少妇通奸网站| 国产91啪| 91爱欧美| 无码乱人伦中文视频| 蜜桃久久久久久久久久久久| 99re免费视频精品全部| 嗯嗯,啊啊,国产精品| 久久 精品| 亚洲有码 视频一区| 麻豆亚洲AV成人无码久久精品| 丁香六月啪| 成人精品久久| 五月丁香影视| 亚洲成人贴图| 97色五月天完| 2017av无码免费无线播| 夜夜操夜夜爽夜夜高潮| 男女啪啪网站免费视频| 成人女人国产| 欧美一区二区三区互相| 亚洲色性情三级| 国产一区二区三区视频在线看| 日韩精品作爱导航| 国产三级多多影院2022国产AA一级毛片无码 | 久久久久久久九九九九九九| 麻豆影音天美视频| 亚洲欧洲日韩天堂av| 使劲用力艹少妇视频一区二区 | 亚洲综合小视频小说在线观看| 蜜乳AV.COM| 天天草AV| 色999;丁香五月| 久久久蜜桃臀无码视频| 草b在线 | 亚洲熟妇乱女区二区三区| 网站A V在线| 亚洲色香| www.色操逼| 亚洲精品97| 高潮综合网| av凤凰久久久| 97在线视频观看| 乱久久久| 99热66| 黑人精品XXX一区一二区| 伊人网在线视频| 大香蕉九九| 婷婷色色五月天福利| 日日噜噜夜夜久久亚洲一区二区 | 97爱亚洲综合色| 强奸乱伦动态污图免费| 亚洲 欧美 色图| 久久久久久久久久久久黄色 | 老熟妇一区二区三区| 亚州色图第三区| 日韩操逼HD| 韩日欧亚a级| 男人天堂日日夜夜| 人妻人人操| 以及麻豆国产入口在线观看免费| 99最新日韩偷拍视频| www.97在线| 中文久久爆乳| 69视频入口| 日本高清一本二本免费不卡| 7月婷婷综合| 国产一区二区啪啪视频| 大象AV在线| 天天综合,91入口| 大吊色| 婷婷色网| 亚欧无码在线| 欧美激情综合| 日本高清一本二本免费不卡| 久久99精品九九久久久婷婷| 亚欧美色图| 2019AV天堂| 欧美日韩国产在线| 国产一级作爱毛片| 久久性爱视频99| 欧成人精品一区二区三区| 亚洲天堂美臀在线| 久草资源欧美在线视频| 啊啊啊操一区| 99日韩| 天天天天天天天天天天干美女| 欧美呦呦性爱| V A在线| 99少妇内射| 国产高清在线自在拍69| 亚洲AV无码久久精品蜜桃小说| 麻豆黄色五月天| 天天干天天爽| 黄色小视频日本txt| 国内毛片热久久思思热| 91亚洲情色| 欧美同性恋 的搜索结果 - 91n| 先锋音影AV| 色情亚洲日本成人| 欧美日韩淫加| 97精品国产97久久久久久户外免费| 久久九色| 久9视频| 日韩成人大片在线观看| 九月丁香综合网| 超97在线精品视频| 成人日韩3| 国产成人无码a| 国产成人自拍视频视频| 国产午夜精品理论片一二三区区| 超碰在线一区二区三区| 久久久久久九九九九九| 又黄又硬又粗又长国产视频| 99最新日韩偷拍视频| 综合九九| 99re在线视频国产| 啊啊啊啊好大好硬啊啊啊啊啊| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | AV乱伦专区| 极品综合| 国产91啪| 成人网站 免费观看| 在线综合色| 国产精选三级在线观看| 亚洲成?V人片在线观看福利| 国产日韩欧美三级片| 亚洲五月婷| 色色色色色色色色色色色色色色综合|