免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(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) 簡(jiǎn)介這份資源面向Android圖形與通用計(jì)算方向的開發(fā)者聚焦OpenGL ES 3.0引入的Compute Shader技術(shù)幫助讀者在移動(dòng)端利用GPU并行能力加速計(jì)算密集型任務(wù)適用于圖形處理、物理模擬等場(chǎng)景需要一定的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)作一等公民。它解決的核心問(wèn)題是把那些「每個(gè)像素/每個(gè)元素獨(dú)立計(jì)算、數(shù)據(jù)并行度極高」的任務(wù)從 CPU 搬到 GPU。適合誰(shuí)做相機(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無(wú)法使用 compute shader); } // 查詢工作組數(shù)量上限后面 dispatch 時(shí)不能超過(guò) 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è)備的硬件上限讀出來(lái)。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超過(guò)了GL_MAX_COMPUTE_WORK_GROUP_SIZE而編譯失敗。我一般會(huì)先讀這兩個(gè)值再?zèng)Q定 local size。2.2 寫第一個(gè) compute shader數(shù)組平方用一個(gè)最簡(jiǎn)單的例子把流程跑通輸入一個(gè) float 數(shù)組輸出每個(gè)元素的平方。這個(gè)例子沒(méi)有圖像、沒(méi)有紋理純粹驗(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; // 邊界檢查防止越界訪問(wèn) if (idx inputBuf.data.length()) return; float v inputBuf.data[idx]; outputBuf.data[idx] v * v; }邏輯說(shuō)明gl_GlobalInvocationID是當(dāng)前線程在整個(gè) dispatch 網(wǎng)格中的全局坐標(biāo)。inputBuf.data.length()返回緩沖區(qū)元素個(gè)數(shù)用來(lái)做邊界保護(hù)——因?yàn)?dispatch 的線程總數(shù)往往不是元素?cái)?shù)的整數(shù)倍多出來(lái)的線程必須直接返回否則會(huì)讀到垃圾數(shù)據(jù)甚至崩潰。參數(shù)說(shuō)明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 寫好了接下來(lái)是 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 寫入對(duì)后續(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);邏輯說(shuō)明整個(gè)鏈路是「編譯 shader → 鏈接 program → 創(chuàng)建 SSBO → 綁定 binding point → dispatch → 內(nèi)存屏障 → 讀回」。glBindBufferBase把 buffer 綁到 shader 里binding 0/1對(duì)應(yīng)的位置這個(gè)對(duì)應(yīng)關(guān)系不能錯(cuò)。glDispatchCompute(groupCount, 1, 1)里的 groupCount 是工作組數(shù)量不是線程數(shù)量——總線程數(shù) groupCount × local_size_x × local_size_y × local_size_z。參數(shù)說(shuō)明GL_SHADER_STORAGE_BARRIER_BIT告訴驅(qū)動(dòng)「compute 階段對(duì) 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 對(duì)象讀寫紋理GLES 3.1 的 compute shader 通過(guò)image2D訪問(wèn)紋理比傳統(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)); }邏輯說(shuō)明imageLoad和imageStore是 compute shader 讀寫紋理的標(biāo)準(zhǔn)方式坐標(biāo)是整數(shù)ivec2。imageSize返回紋理尺寸用來(lái)做邊界檢查。參數(shù)說(shuō)明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è)置過(guò)濾和環(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);邏輯說(shuō)明glBindImageTexture的第三個(gè)參數(shù)是 mipmap 層級(jí)第四個(gè)參數(shù)layered對(duì) 2D 紋理傳 false第五個(gè)參數(shù)是層索引。GL_SHADER_IMAGE_ACCESS_BARRIER_BIT是 image 讀寫專用的屏障和 SSBO 的屏障不能混用。參數(shù)說(shuō)明GL_READ_ONLY和GL_WRITE_ONLY是訪問(wèn)限定和 shader 里的readonly/writeonly對(duì)應(yīng)寫錯(cuò)會(huì)導(dǎo)致鏈接失敗。3.2 工作組大小怎么選16×16 不是萬(wàn)能答案local_size的選擇直接影響性能。我做過(guò)一組對(duì)比測(cè)試在同一臺(tái)中端設(shè)備上跑灰度化圖像 1920×1080local_size工作組數(shù)耗時(shí)ms備注8×8324004.2工作組太多調(diào)度開銷大16×1681002.8移動(dòng)端最常見甜點(diǎn)值32×881003.1長(zhǎng)條形部分 GPU 不友好32×3220253.5超過(guò)部分設(shè)備的 size 上限結(jié)論16×16 在大多數(shù)移動(dòng) GPU 上是穩(wěn)妥選擇但如果你明確知道目標(biāo)設(shè)備是某類架構(gòu)可以針對(duì)性調(diào)。比如某些 GPU 的 wavefront 是 64 線程那 8×8 或 16×4 可能更匹配。判斷方法很簡(jiǎn)單把 local_size 當(dāng)變量跑 benchmark 看耗時(shí)曲線拐點(diǎn)就是最優(yōu)值。3.3 用 SSBO 傳大數(shù)組比 uniform 更靠譜uniform 變量有大小限制移動(dòng)端通常只有 64KB 左右傳個(gè)幾千個(gè) float 就滿了。SSBO 沒(méi)有這個(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; }邏輯說(shuō)明每個(gè)線程負(fù)責(zé)計(jì)算 C 的一個(gè)元素內(nèi)層循環(huán)累加 K 次。參數(shù)說(shuō)明M、K、N通過(guò) uniform 傳入因?yàn)樗鼈兪菢?biāo)量不占多少空間。這個(gè)實(shí)現(xiàn)沒(méi)有做 shared memory 優(yōu)化性能一般但勝在簡(jiǎn)單易懂。如果要優(yōu)化可以把 A 的行和 B 的列緩存到 shared memory 里減少全局內(nèi)存訪問(wèn)次數(shù)——這是進(jìn)階話題后面第 5 章會(huì)提。4. 避坑指南compute shader 在 Android 上的五個(gè)血淚教訓(xùn)這一章是我踩過(guò)的坑里最有代表性的五個(gè)每個(gè)都按「現(xiàn)象 → 原因 → 解決」寫希望能幫你省下幾個(gè)通宵。4.1 讀回?cái)?shù)據(jù)全是 0漏了內(nèi)存屏障現(xiàn)象dispatch 之后用glGetBufferSubData讀回結(jié)果發(fā)現(xiàn)全是初始值 0但 shader 編譯鏈接都沒(méi)報(bào)錯(cuò)。原因compute shader 的寫入對(duì)后續(xù)操作不是自動(dòng)可見的必須插入對(duì)應(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)對(duì) shader 錯(cuò)誤的報(bào)告不總是可靠尤其是某些廠商的驅(qū)動(dòng)。常見觸發(fā)點(diǎn)是local_size超過(guò)設(shè)備上限或者std430布局用在了不支持的地方。解決先檢查GL_MAX_COMPUTE_WORK_GROUP_SIZE確保 local_size 沒(méi)超。然后在 shader 開頭加#version 310 es確認(rèn)沒(méi)有漏掉。如果還是空日志把 shader 簡(jiǎn)化到最小可復(fù)現(xiàn)版本逐步加回代碼定位問(wèn)題。4.3 圖像邊緣出現(xiàn)黑邊或錯(cuò)位現(xiàn)象處理后的圖像在右邊緣和下邊緣出現(xiàn)黑邊或者整體偏移了幾個(gè)像素。原因dispatch 的工作組數(shù)量是按(width 15) / 16向上取整的多出來(lái)的線程如果沒(méi)做邊界檢查會(huì)寫到圖像外面或者讀到越界數(shù)據(jù)。解決在 shader 的main開頭加邊界檢查用imageSize或傳入的尺寸做判斷越界直接return。這個(gè)檢查幾乎不耗性能但能避免一堆詭異問(wèn)題。4.4 性能不如預(yù)期可能是工作組太小或太大現(xiàn)象compute shader 跑起來(lái)比 CPU 還慢或者只比 CPU 快一點(diǎn)點(diǎn)。原因工作組太小比如 4×4會(huì)導(dǎo)致工作組數(shù)量爆炸調(diào)度開銷吃掉并行收益工作組太大比如 32×32可能超過(guò)設(shè)備上限或者導(dǎo)致寄存器壓力過(guò)大、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ù)量超過(guò)了這個(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)存訪問(wèn)以及異步讀回避免阻塞渲染線程。5.1 shared memory把重復(fù)讀取的數(shù)據(jù)緩存到片上矩陣乘法那個(gè)例子里每個(gè)線程都從全局內(nèi)存讀 A 的行和 B 的列訪問(wèn)次數(shù)是 O(M×N×K)。如果用 shared memory 做分塊可以把訪問(wèn)次數(shù)降一個(gè)數(shù)量級(jí)。// 分塊矩陣乘法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; }邏輯說(shuō)明shared變量是工作組內(nèi)所有線程共享的片上內(nèi)存訪問(wèn)速度比全局內(nèi)存快一到兩個(gè)數(shù)量級(jí)。barrier()是工作組內(nèi)的同步點(diǎn)確保所有線程都加載完 tile 之后才開始計(jì)算計(jì)算完才能進(jìn)入下一輪加載。參數(shù)說(shuō)明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); }邏輯說(shuō)明glReadPixels的最后一個(gè)參數(shù)傳 0 表示偏移量實(shí)際數(shù)據(jù)寫到當(dāng)前綁定的 PBO 里。glMapBufferRange返回一個(gè)直接映射到 GPU 內(nèi)存的 ByteBuffer這一步會(huì)等待 GPU 完成但之前的時(shí)間 CPU 是自由的。參數(shù)說(shuō)明GL_STREAM_READ是提示驅(qū)動(dòng)這塊 buffer 會(huì)被頻繁讀取驅(qū)動(dòng)可以據(jù)此優(yōu)化內(nèi)存分配。5.3 一個(gè)判斷值不值得上 compute shader 的簡(jiǎn)單標(biāo)準(zhǔn)不是所有任務(wù)都適合 GPU。我的經(jīng)驗(yàn)是如果任務(wù)滿足「數(shù)據(jù)并行度高、每個(gè)元素計(jì)算獨(dú)立、分支少」那 compute shader 大概率能帶來(lái) 5 到 20 倍的加速。如果任務(wù)里有大量分支、遞歸、或者數(shù)據(jù)依賴強(qiáng)GPU 的優(yōu)勢(shì)會(huì)被抵消甚至不如 CPU。具體判斷方法先寫一個(gè) CPU 版本測(cè)出耗時(shí)。如果單幀處理時(shí)間超過(guò) 16ms60fps 的預(yù)算且數(shù)據(jù)量超過(guò) 100 萬(wàn)個(gè)元素那就值得試試 compute shader。如果數(shù)據(jù)量只有幾萬(wàn)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 成熟別一上來(lái)就在 shader 里死磕。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
婷婷亚洲天堂| 婷婷五月综合国产精品| 大香蕉院线| 色综啪啪网| 欧美成人精品A片免费一区99| 激情综合网址| 欧美日韩成人| 五月激情综合网| 99热在线中文字幕| 久久er免费视频| 色色999三级片| 久99视频在线观看| 狠狠操综合| 九九热这里只有精品556| 噼里啪啦在线观看免费完整版视频 | 中文字幕在线免费| 亚洲av网址| 婷婷五月六| 亚洲五月婷婷| 五月丁香啪啪综合| 婷婷综合日本| 操操熟女| 超碰京东热av男人的天堂| 婷婷五月天色| 99热老网站| AAA亚洲AV| 97资源欧美日韩大香蕉超碰一区| 日韩精品无码AV| 天天日天天爽夜夜爽| 玖玖资源站蜜臀| 五月丁香激情片| 婷婷九月久久| 九九99偷拍视频| 欧美成人AAA片一区国产精品| 亚洲婷婷丁香| 丁香激情网| 久久人妻www| 欧美综合激情五月丁香| 情欲综合网| 久久9久| 71在线精品视频一区| 少妇被下春药玩弄A片| 狼人久草| 中文AV网| 九九热视频在线观看| 97超碰人人操| 黑人糟蹋人妻HD中文字幕| 操逼视频一区| 五月丁香在线| 久操激情| 九九热在线视频观看| 91婷婷色| 婷婷婷婷婷婷婷五月丁香| 五月激情婷婷开心五月| 日韩一级一片内射视频4K| 色婷婷综合网| 久久人妻视频| 在线综合亚洲欧美65| 噜噜在线| 亚洲精品久久久久久久久久飞鱼| 性欧美大战久久久久久久83| 九九色video| 五月天激情婷婷| 日本色五月| 99热精品中文字幕| 最近免费中文字幕大全高清大全1| 九九色热| AV在线免费观看不卡| 九九99免费视频| 婷婷色网站| A片一曲| 国产67194| 日韩欧美颜射| 99丁香婷婷综合网| 中文字幕av在线播放| 99久久久久久www| 色五月婷婷操逼| 狠狠色丁香五月婷巨| 综合激情伊人影视在线| 天天干天天操天天拍| 久久丁香五月天| 久久免费操| 激情五月婷婷综合| 一级黄色片看看| 99人人干人人操| 五月丁香婷婷激情影院欧美| 天天插天天插天天日| peg 2区三区四区的| 久久综合网免费视频| 六月伊人婷婷| 五月丁香六月婷婷视频| 色色热| 久久婷婷五月天| 五月天成人综合| 五月丁香琪琪| 五月丁香啪啪| 婷婷五月天激情电影小说| 色99热| 亚洲AV免费在线| 国产69久久久欧美黑人A片| 天天色中文字幕女优AV| www.日本久久videos| 激情丁香五月激情婷婷| 色五月成人| 99热这里是精品| ..真实国产乱子伦毛片| 婷婷综合欧美| 99色色| 国产精品美女| 97干综合网| 这里只有精品热| 婷婷五月草| 六月丁香av| 99久久久免费| www色综合亚洲92| 日韩999| 婷婷伊人激情婷婷| 五月丁香六月婷婷综合在线| 色播激情五月天| 六月 丁香 视频| 国产91资源在线| 久久影视婷婷五月| 天天干天天操天天爱| 9久久久久| 超碰在线网站9| 五月丁香婷婷色色色| 丁香婷婷五月六月天| 五月天婷婷伊人| 午夜成人片400| 天堂中文国产| 婷婷成人AV| 久久久久久久久月丁| 99热一本| 色五月婷婷综合| 欧美顶级少妇做爰HD| 五月天综合久久丁香91| 99色网站| 五月丁香五月丁香五月丁香五月丁香91| www.av视频xx999.com| 婷婷丁香五月激情密臀av| 99热99艹在线观看| 香蕉影院色| 超碰chaompinm| 婷婷五月天亚洲综合| 久久免片| 人妻久久久久| 丁香五月激情婷婷| 五月婷婷中文网| 色五月婷婷基地| 色欲天天综合| 婷婷社区五月天| 国产精品丝| 久久只有18视频| 久久婷婷五月综合色欧美| 日本片日本片祼观看网站在线看中文版网页在线看 | 97人人妻人人艹| 五月天自拍网| 68热超碰在线| 色婷婷久久综合久色综| 91丨九色|PRNY熟妇| 五月天婷婷激情| 91传媒无码人妻精| 殴美日韩成人| 色婷婷五月天av在线| 五月天婷婷激情四射综合| 色五月丁香五月五月婷婷| 五月婷中文字幕| 精品亚洲日韩99欧美片| 色婷婷五月在线| 大香蕉 伊人夜| 婷婷久久五月天| 月丁香久久久| 2017狠狠干| 91艹人| 婷婷六月色开| 丁香婷婷九月| 日日干夜夜干| 这里精品| 丁香五月天啪啪| 婷婷久久五月| 99思思| 天天色综| 97av在线视频| 噜噜五月天综合| 中文字幕中文有码在线| 亚洲国产精品VA在线看黑人| 九九色精品| 色色色色综合网| 亚洲性图一区二区三区| 五月天激情无码| 色五月婷婷伊人| 51XX午夜影福利| 五月丁香久久精品在线观看| 99热最新国内| 91chinese在线| 婷婷6月综合网| 激情五月婷婷视频| 五月婷婷AV| 99热在线99| 久久婷婷六月综合国际| 9久久精品| 六月婷婷俺也去| 开心五月婷婷激情| 亚洲色网址| 91久久婷婷| 丁香婷婷综合激情五月色| 婷婷激情啪啪| www.天天色综合| 91在线视频观看午夜福利| 狠狠色成人影片| 久久99久久99精品免视看婷| 五月色情婷婷| 欧美大片| 六月激情综合| 伊人九九综合| 99九九精品视频推荐| 五月天天综合| 99热中文字幕久久| 婷婷五月天无码熟女| 一起操最新网址| 日本色五月| 五月天激情av| 激情五月综合免费| 色999亚洲人成色| www.99精品日操伊人乱碰在线| 99色| 深爱开心激情| 日本在线视频手机播放五月婷| 五月情涩综合婷婷| 99se丁香| 99在线精品免费视频| 六月婷婷激情| 99色性爰网络| 婷婷五月天综合色| 能看的AV网站| 丁香婷婷激情五月色| 午夜婷婷久久| aaa9区免费在线观看| 色噜噜丁香| 欧美va视频不用播放器的va视频网| 五月停停99| 六月婷婷综合| 久久久18| 婷婷香蕉| 五月婷婷五月天| 99久久婷婷五月综合| 婷婷五月图片小说视频| 五月综合精品| 日逼免费视频| 99精品视频在线6| 久综合色| 99九色视频在线观看| 国产亚洲成AV人片在线| 丁香色五月AV在线| 亚洲九九婷婷| 玖玖午夜视频| 97超碰人人操| 色欲人妻综合aaaaaaaa网| 激情视频综合| 91色吧网| AV在线观看网站| 99热线观看9| 国产4P视频精品五区| 任你干aa| 成人啪啪色婷婷久| 精品乱码久久久久| 五月丁香啪啪| 欧洲亚洲免费视频9| 五月丁香婷婷婷激情爱爱| 五月天激情网开心网| 狠色狠色综合久久| 天天插综合网| 超碰在线人妻| 天天操综合网| 色婷婷中文| 五月综合激情久久| 大香婷婷| 色综合久| 人妻在线中文字幕久久| 婷婷五月色情天| 五月婷在线视频免费看| 激情五月婷| 婷婷精品在线| 成人片黄网站色大片免费毛片| 色婷婷综合视频| 色色色色综合网| 99热官网| www.久9| 激情五月天啪啪| 色综合中文色综合网| 91超碰在线观看| 五月久久五月激情| 影音先锋五月天婷婷丁香在线观看| 久久se 综合网 | 开心五月色婷婷综合开心网| 婷婷五月天福利| 久热综合| 665566 无码| 日本情色一区二区| 超碰三级秋霞| 亚洲视色| 国产 码在线成人网站| 五月婷婷啪啪啪啪| 色碰碰| 久热中文字幕| 色婷婷AV五月天| 五月色婷婷综合| 欧美97色| 真实熟女-91九色| 五月婷婷亚洲| 五月天婷婷高清无码| 人妻久久久| 婷婷色导航| 婷婷五月久久| 综合色五月天| 夜夜夜夜夜操| 成AV人片一区二区三区久久| 婷婷色啪| 丁香五月激情啪啪| 激情内射人妻1区2区3区| 五月天激情黄色网址| 久/久精品99看9| 国产精品久久久久久喷浆| 99在线综合视频| 色婷婷XXXXX| 99热精品网| 色五月欧美| 五月天丁香网| 成人五月天丁香婷| 五月婷婷激情视频| 亚洲乱码日产精品BD| 中文AV在线观看| 色婷婷婷综合五月天| 色色无码| 天天肏天天肏| 久久黄色片| 久久久久9999| 久久五月婷婷电影| 五月丁香色| 国产精品成av人在线视午夜片| 婷婷五月天午夜激情影院| 五月丁香亭亭成人电影| 色优久久| 99热这里只有精品1025| 激情綜合網址| 欧美大道不卡| 日本色五月| 色伦专区97中文字幕| 亚洲永久免费| 大香蕉九九| 99爱在线精品视频免费观看| www99精品在线观看| 婷婷五月花免费视频在线| 九九干视频| 91碰免费视频| 手机免费福利视频| 香蕉人妻AV久久久久天天| 99热99成人| 69久久99精品久久久久婷婷| 久久在线92| 天天干天天干天天干天天干天| 色日本颜射| 99成人精品六| 免费观看全黄做爰的视频| 欧韩性爱| 丰满老熟妇BBBBB搡BBB| 丁香五月天殴美激情| 97综合在线| 五月婷久久| 久久婷婷激情| 五月婷婷黄色| 五月天激情国产综合婷婷婷 | 人妻22p| 成人网址在线观看| 日本99久久| 久久婷婷五月天懂色| 五月婷婷综合久久| 五月天亚洲图片婷婷| 色色综合网站| 色色影院aaaav| 九九视频在线观看视频6 | 九九精品这里只有| 黄色AAAA韩国guochansanji| 婷婷五月色天| 五月丁香狠狠爱| 狠狠干,狠狠操| 99噜噜噜在线播放| www.97视频| 色婷五月天网站| 人五月天婷婷喷水| 先锋资源婷婷| 六月丁香激情综合网| 久久九九综合| 天天插,天天射| 五月婷婷九| 综合视频久久| 亚州精品色情在线观看| 亚洲婷婷综合视频| 色综合com| 丁香五月天天| 久久九九经典| 久热91| 丁香五月婷婷成人网| 婷婷丁香综合在线| www.色婷婷.com| 成人网站免费sxj| 人人97操| 成人做爰A片免费看视频| 色天天综合成人网| 日本久久高清| 狠狠操狠狠色| 五月天另类视频| 综合色综合| 伊人婷婷色| 九九热免费视频| 久久香蕉网| 我要色综合五月婷婷| 色婷婷亚洲综合网站| 99狠狠| 五月天天天综合| 天堂美国久久| 色吧五月婷婷| 丁香五月电影| 九九热在线观看视频网站| 色五月,婷婷大香蕉| 婷婷久久色| 日日夜夜爽| 婷婷色综合| 五月丁香六月片| 亚洲精品视频在线播放| 日日爽日日爽| 久热最新视频| 激情婷婷丁香五月天小说| 国产婷婷婷| 久久精品9| 丁香五月在线视频黑人| 天天玩夜夜操天天爽| 操操操91| 97日本在线播放| 五月天另类视频| 婷婷五月天高清无码| 久久亚洲婷婷综合色五月| 亚洲xx网| yazhochengrenavwang| 五月婷婷六月丁香| 丁香五月天啪啪| 人妻久久久久久久 | 婷婷五月激情视频| 操逼123网| 思思99热热热99| 大香蕉伊在| 美女婷婷激情亚洲| 日本黄色三级片内射| 99精品免费视频| 日韩人妻无码精品| 色综合九九| 激情电影五月婷婷| 激情五月成年| 亚洲成人影视在线| 九九RE视频在线精品| 色狠久| 五月丁香 久久久| 狠狠爱综合| 久久久宗合| 久久亚洲天堂| 日本123区日韩欧美不卡在线看| 日本强伦片中文字幕免费看| 国产精品久久久久久久久久免费| 久热婷婷| 婷婷亚洲色| 99爱视频在线观看这里只有精品| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 色狠狠色综合久久久绯色aⅴ影视| 婷婷俺去也| 五月丁香色色网| 久久人操| 97久久超碰| 色区久久| h在线看免费版在线看| 玖玖综合网| 色三级色三级| 99色色网| 91人人人人人| 亚洲国产黄色电影| 噜噜操操| 精品婷婷五| 天天激情夜夜干| 狠狠操天天日| 久久久久思思热| 天天五月天综合网址| 激情伊人五月天| 天天摸天天日天天舔| 五月婷婷福利| 婷婷八月丁香激情综合| 色婷婷网| 婷婷D区| yw.av| 超级碰碰碰碰视频| 激情综合播播| 99在这里有精品| 色欲午夜无码久久久久久张津瑜| 91欧美| 九九综合九九| 一级黄在线| 日韩黄色AV无码| 99色色热热| 久热最新视频| 韩国三级五月天婷婷。| 激情综合五月| 久久久久久99日本| 婷婷伊人| 日屌日日操日日色| 天天日天天爽夜夜爽| 丰满老熟妇BBBBB搡BBB| 国产精品人妻在线网址| 五月婷婷丁香伦理网| 婷婷十月激情综合网| 色综合久久44| 五月激香蕉网| 91九色国产| 天天综合亚洲综合| 91九九| 激情五月天网页| 97超碰在线免费观看| 天天操综合网| 91精品婷婷国产综合| 五月婷婷久久开心网| 五月开心激情| 色婷婷丁香| 亚洲另类在线观看| 亚洲xx网| 婷婷五月天色综合| 五月婷婷激情五月| 在线观看996精品| 色欲五月天| 婷婷97碰碰| 91国产精品视频播放| av九九| 天天操天天曰| 色五月综合激情网| 丁香五月天偷拍| 五月婷婷深深爱| 亚洲情综合五月天| 九月丁香婷婷综合激情| 久青操| 人人综合色| 一区二区三区四区五区| 成人丁香五月| 偷拍91九色| 五月天激情啪啪| 熟妇人妻中文字幕无码老熟妇| 激情五月综合久久| 夜夜操夜夜操| 91九色 熟| 啪啪婷婷五月天激情| 久久久久久久久久8888| 日本97在线视频| 天天插天天操| 超碰成人影视| 婷婷综合在线观看视频| 三男玩一女三A片| 婷婷亚洲色| 久久综合影院| 久久精品99久久久久久| 天天做天天爱天天高潮| 久热9热| 中文不卡一二区| 精品夜夜澡人妻无码AV| 99 频99热国里只有精品| 日韩人妻无码专区| 99在线精品观看99| 色婷婷视频在线| 成人av在线电影| 九九这里是免费的视频5| 亚洲成人无码免费| 伊人五月天在线| 热99热久| 九九这里有精品| 五月深情久久| 天天天干夜夜夜操| 欧美在线视频免费播放| 伊人网碰碰| 啪啪丁香五月| 激情五月综合| 一区二区中文字幕| 欧美午夜乱妇午夜福利| 久热精品视频| 91色干| 久久婷狠狠色| 五月天婷婷xxx| 婷婷六月激情| 狠狠va| 日韩av一区二区在线/日产精品久久久| 婷婷五月天国产手机在线视频观看| 欧美成人AAA片一区国产精品 | 大香蕉伊人久久| 激情无码五月天| 婷婷中文字幕| 丁香五月精品| 色婷婷88| 99精品偷自拍| 69色色视频| 婷婷D区| 夜夜躁爽日| 色色九九五月天| 九九色色| 深爱丁香激情| wWW九九在线播放| 狠狠干婷婷| 欧美丁香六月激情视频| 激情五月天婷婷色色色色色色色色色色色| 黄网免费观看| 激情久久久| 欧洲MV日韩MV国产| 五月天激情综合| 91五月天| 亚洲视频在线观看区| 91碰| 九九热视频思思| 手机在线日韩视频中文字幕| 少妇被躁爽到高潮无码文| 深爱五月最新网址| 国产67194| 丁香五月婷婷国产av| 免费看成人747474九号视频在线观看| 亚洲精99| Www99热| 国产亚洲精品久久久久久郑州| 久久女伦| 99热在线观看精品| 密乳视频| 综合色视频| 久热这里只有精品6| 色色色国产| 色优久久| enecarbon-materials.com污K127封锁请涟系@wip1688 | 最新高清无码专区| 久青操| 人人操A| 亚洲操逼网| 五月色情婷婷| 极品人妻VIDEOSSS人妻| 久久一热| WWW、日本色丁香、co m| 超碰在线中文字幕| 超级碰 久久9| 久久小说网| 91天天操天天干天天射| 丁香五月天啪啪a日本| 这里只有精品,日韩视频| 激情综合文学| 精品影院| WWW·天天操·视频?| 熟美女麻豆| 色婷青青| 欧亚成人A片一区二区| 色播婷婷大香蕉| 色五月激情婷婷| 5月丁香综合网| av中文在线| 99.N在线视频| 99热大| 99免费在线视频| √天堂资源在线人妻熟女| 激情网综合| 五月天性色| 婷婷五月天视| 亚洲小视频免费观看| 香蕉五月婷婷| 九九99视频精品| 九月丁香久久网| 99国产精品久久久久久久久久久 | 在线色婷婷| 欧美大片| 草草女人亚洲| 深夜婷婷 丁香| 精品少妇人妻AV无码专区偷人| 亚洲精品99| 国产成人亚洲综合A∨婷婷| 韩国天天婷婷| 天天爱天天做天天| 亚洲va综合va国产va中文| 丁香六月婷婷激情| 国产成人亚洲综合A∨婷婷| 五月开心深爱激情网| 五月天社区狠狠| 婷婷五月深爱五月| 天天日夜夜操五月| 天天操狠狠操| 99热在这里只有精品| 永久精品| 五月色丁香| 六月色色| 色婷婷成人做爰A片免费看网站| 伊人色综合网| www五月婷婷88导航| 五月花丁香婷婷| 五月天激情婷婷丁香| 色五月天视频| 这里只有精品1| 五月天狠狠色| 一本色道久久综合狠狠躁小说| www.夜夜操| 免费黄色视频网址| 无码人妻少妇色欲AV一区二区 | 丰滿爆乳一区二区三区| 日本黄 色 片| 欧美碰碰碰| 九九热99免费视频| 99热这里只有精品国产免费| 狠狠草综合网| 五月丁香婷草| 人妻久久久| 五月做爱| 超碰人人操人人干| 久久婷婷五月综合97色一本| 丁香六月毛片| 97干视频在线| 中文字幕精品无码一区二区| 色婷综合| 99激情网| 丁香六月久| 色五月色五天色情网| 国产69久久久欧美黑人A片 | 激情久久久久久久久| 激情小说婷婷| 五月天色欧美| 99r这里只有精品哦| 久久免费婷婷视频| 99热这里只有精品免费| 韩日AV片| 色欲丁香| 五月停停激情网| 婷婷色播婷婷| 五月色情婷婷| 天天色综合色色色色色。| 午夜五月天| 97啪啪| 婷婷人妻激情| 丁香无月在线观看| 99久在线精品99re8热| 九九aV| 亚洲色基地| 极品人妻VIDEOSSS人妻| 狼人狠狠操| 久久机热这里只有精品| 中文av网站| 丁香狠狠操| 激情婷婷丁香色情五月天| 激情五月色婷婷| 狠狠综合网| 久久五月天色婷婷| 思思久日精品视频| 婷婷综合久久| 黄色三级日本| 日本色爽| 少妇人妻丰满做爰XXX| 天天操B| 五月婷婷五月天在线| 天天久综合网永久入口18| 草草视频91| 久久综合影院| 色色综合院| 婷婷五月伦理| 成人做爰高潮A片免费视频| 在线婷婷| 日韩久热| 91|九色|动漫| 天天影院色| 影音先锋五月天婷婷丁香在线观看| 丁香久色| 婷婷精品| 高清无码.com| 偷拍五月丁香| 婷婷她六月天| 开心五月网| 玖玖综合色| 99热网址| 日本美女上人| 久婷婷婷| 殴美激情综合网| 色婷婷激情| 激情综合在线播放| 色婷婷五月天激情在线观看| 在线成人国产| 婷婷五月花丁香| 92久久久| 色婷婷五月天激情在线观看| 激情五月狠狠喔| 九九热视频精品| 美女被肏网站在线看| 啄木鸟丝袜美女福利视频| 4399无码视频二区| 色综合天天天天做夜夜| 99热欲| 色五月天综合网| 97在线干| 99久在线精品| 极品另类| 色婷婷综合久久久久| 激情综合五| 亚洲激情在线| 亚洲性爱干干| 操操操97| 五月丁香六月合| 久久婷婷原创视频| xx人人xx| 亚洲99综合| 久久久久久人妻| 都市激情五月婷婷综合| 激情婷婷狠狠干综合| 丁香婷婷视频一区二区| 免费成人中文字幕| 日韩性视频| 亚洲色爽| 久久3级片| 开心五月婷婷| 欧洲激情网站| 五月天大香蕉av| 五月激情六月综合| 性视频久久| 91操操| 人人爱人人添| 久久激情综合| 图片区 小说区 区 亚洲五月| 丁香五月天啪啪激情综和网 | 在线日韩av| 99九无网码| 亚洲丁香五月综合| 丁香五月天影院| 久久9精品| 99热99热在线观看| 日本人妻久久| 99热精品免费| 六月丁香社区| 操操操操操操婷婷五月天| 大香蕉220| 97九色视频| 五月丁香少妇A| 九9九9无码| 91精品丝袜久久久久久| 欧美人妻一区二区| 婷五月天天| 国产XXXX搡XXXXX搡麻豆| 色播五月| 99视频地址| 色婷婷久久视屏| 亚洲色五月| 思思热在线视频精品| 天天舔夜夜操www com| 婷婷色一二三区波多野结衣| 五月天色图| 日韩三级高清无码| 丁香五月婷婷激情123| 丁香六月婷婷久久亚洲天堂| 久久思思热| 天天色天天操天天射| 欧美日韩大黄| 91色色色18| www.金莲av| 激情五月婷婷五月| 久久五月丁香| 丁香六月天婷婷开心综合| 亚洲超碰在线| 婷婷九月丁香天堂丁香天堂| 亚洲熟妇AV乱码在线观看| 日韩欧美颜射| 2025天天日爽| 欧美激情凹凸丁香网| 98毛片| 久热一本| 秋霞丝袜啪啪啪| 九月丁香婷婷基地| 日本三级韩三级99久久| www,色婷婷| 五月丁香网中文字幕| 色爱综合网| 亚洲色图81p| 欧在线一区| 大香蕉久久视频久久视频| 欧洲色| 欧美日韩99| 精品爆操| 99视频这里有精品| 五月伊人婷婷| 欧美久久婷婷| 99热只有国产在线精品| 久久五月人人摸| 性日本激情| 色婷婷综合久久久久| 五月丁香婷婷狠狠操| 久久人妻熟女一区二区| 色色五月婷婷| 九九这里只有精品| 久久久久久久久久8888| 五月婷婷激情久久| 婷丁香五月天| 日本在线视频播放91| 五月丁香六月婷婷激情网| 五月六月伦理| 丁香五月六月综合欧美| 色色射| 开心五月网| 色天五月天在线观看视频| 综合色激情| 久久婷婷成人综合色怡春院| 五月丁香六月婷婷操操操| 色婷婷AV久久久久久久| 伊人五月天在线| 五月婷婷之六月丁香| 国熟女视频| 久久九九99字幕| 亚洲人妻一区二区| 婷婷激情六月中文| 婷婷开心综合人妻小说网址| 6080av| 色综合色色色色色| 深爱激情婷| 国产精品久久久海的味道| 操操操Av| 久久新地址| 五月天偷拍| 色五月激情综合网| 性生生活大片又黄又| 一级片无码| 影音先锋偷偷色男人站| 色综合久久88色综合天天| 色婷亚洲五月丁香| 人妻AV在线观看| 99热这里在线精品| 五月天婷婷色小说| 婷婷五月激情视频在线| 综合一区二区三区| 99亚洲精品| 黄急一级视频| 小泽玛利亚视频一区二区| 五月天婷婷影院| 99久久黄色顶级视频| site:ornaments52.com| 国产偷人妻精品一区| 大香蕉久艹| 日韩中文字幕| 超色欲天天| 丁香五月婷婷激情小说| 人妻操在线看| 99热亚洲精品| 青青草免费公开视频| 97超碰99热99| 久久久人妻不卡| 五月天久久www| 123草逼网| 风流少妇A片一区二区蜜桃| AV六月丁香| 亚洲思思热久| 操日挥操日日| 久久九九免费视频| 婷婷五月天av小说| 久久xxxx| 五月色天情| 丁香成人五月天| 激情色色| 啪啪六月婷婷| 丁香五月亚洲无码| 色色色地址| 色色色色热| 狠狠色狠狠色综合日日91| 丁香五月色| 亚洲AV日韩在线观看| 高清无码视频网址| www.韩日视频| 99久久99视频只有精品| 99精品大片| 开心五月深爱五月| 婷婷综合色网| 丁香五月网在线观看| 婷婷99狠狠躁天天躁| 禁片二区| 五月婷婷开心色伊人| 亚洲成人中心| 五月激情小说| 超碰免费大香蕉| 五月天影院| 另类少妇人与禽zOZZ0性伦| 久久嘟嘟丁香| 久久网思思| www.夜夜| 五月天激情综合网| 亚洲99在线视频| 日韩成人电影AV| 91无码视频| 久久怕怕视频| 天堂呦 呦百度搜索-百度搜索| 天天草人人摸| 中文字幕av久久爽一区| 久久国产高潮白浆免费观看99| 天天摸天天舔天天爽| 97av在线视频| 六月婷婷综合久久| XX色综合| 91精品久| 99热这里只有精品50| 99热啪啪| 激情婷婷丁香五月天小说| 综合色色婷婷| 碰超在线九色| 欧美va欧美va差| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 激情五月天在线观看婷婷| 91人人操人人爱| 玖玖爱导航| 色五月婷婷五月天激情综合| Av狠狠色丁香婷| 午夜九九电影| 少妇性按摩无码中文A片| 人妻自慰在线| 色婷网| 色色综合成人网| 思思热在线观看| 五月婷婷丁香成人网| 天天操人人干| 色婷婷99| 亚洲五月婷婷| 琪琪理论片| 大学生高潮无套内谢视频| 五月婷婷开心深| 精品人妻一区二区| 亚洲另类婷婷五月丁香在线播放| 色噜噜狠狠一区二区三区| 五月丁香狠狠爱| 夜夜撸夜夜骑| 亚洲av免费在线| 99热精品中文字幕| 成人五月天在线观看| 99色在线观看| 6080av| 美女久久天堂| 99色精品| 色狠狠色综合久久久绯色AⅤ影视 大香蕉五月天婷婷丁香91 | 天天天天天日| 色色五月天com| 日本一毛片| 大香蕉综合| www.色综合| 欧美久热| 全部老头和老太XXXXX| 亚洲一区二区无码蜜乳av| 超碰免费人人肏| 久久婷婷五月综合| 色综合久久综合| 日韩综合久久| 综合在线网| 国产操B| 99激情视频| 视频1区2区| 九热视频| 全国最新疫情| 六月婷在线| 狼人久草| 婷婷激情在线| 五月综合激情网| 婷婷亚洲色| 五月丁香六月婷综合成人综合| 天堂成人A片永久免费网站| 亚洲五月花| 成人五月天婷婷| 操b视频在线观看一区二区| 五月天色图| 丁香婷婷久久综合在线| 丁香六月婷婷综合激情欧美| 亚洲第一成人无码A片| 亚洲人妻电影| 五月丁香六月婷婷免费视频| 在线观看996精品| 国产又色又爽又黄又免费| 激情五月天色播| 国产精品五月丁香| 激情五月,激情综合网| 免费观看欧美成人AA片爱我多深| 色色色无码| 四色综合网| 色 噜噜 九月 婷婷| 六月激情婷婷| 91精品综合久久久久久五月丁香| 婷香五月| WWW久久99久久99久久| 久久99热这里只有精品| 蜜臀A∨在线水帘洞| 色婷婷玖玖影院| 色五月人妻| 久久五月综合| 五月婷婷高清| 丁香五月电影院在线观看| 农村熟妇高潮精品A片| 亚洲精品色| 99惹精品视频| av中文在线| 99热99| 亚洲中文字幕AV在线| 夜夜爱网站| 九九热视频免费观看| 激情五月综合网| 亭亭玉月丁香| 激情图片亚洲| 五月丁香影视| 九九99热| 亚州操人在线视频| 久久婷婷婷婷伊人| 精品视频99看在线视频| 亚洲成人影视在线观看| 射久久丁香五月| 久久亭亭电影| 久久加勤综合| 久久久亚洲精品一区二区三区浴池 | 九九这里只有精品| 亚洲色五月| 色婷婷97| 一区视频网站| 激情五月婷黄版| 天天操天天操天天操天天操天天操 | 婷婷99狠狠躁天天久久久九九九| 丁香五月激情综合| 久久色情| 婷婷五月天在线观看| 亚洲精品大片| 九九久久网| 天天搞天天爽| 99精彩视频| 97香蕉碰碰人妻国产欧美| 丁香五月六月综合激情| 另类小说五月天| 色~性~乱~伦~噜| 黄色五月婷婷| 婷婷五月丁香久久| 九九亚洲视频| 色综合色色| 九九色精品| 色婷婷丁香五月| 国产精品18久久久| 婷婷丁香社区| 综合 激情 婷婷| 色五月丁香六月欧美综合| 激情五月天婷婷视频| 亚洲激情精品| 色久天| 国产激情在线| 操一区| 色五月综合网| 国产精品天天狠天天看| 九九爱激情| 五月天丁香欧美激情| 五月婷婷七月丁香| 婷婷激情综合| 激情婷婷内射| 三十路磁力链接| 天天插AV丝袜中| 99色精品| 精品人妻久久久久久| 国产精自产拍久久久久久蜜| 九九操屄| 久久区区一二三av| 伊人久久大香线蕉av最新| 国产精品久久99| 插插五月天| 色五月婷婷亚洲最大| 婷色五月| 丁香香蕉射射射| 久热精品在看| 99久久久| 色综合综合色| 狠狠操狠狠| 日日干夜夜干| 婷婷五月天综合久久日| 99热这里有精品首页10| 丁香五月影| 五月天婷婷色情| 亚洲无码成人网| 天天射夜夜骑| 婷婷五月香蕉| 人与禽A片啪啪| 日本毛片内射| 天天日夜夜B久久| 丁香成人视频| 婷婷香五月天| 五月天大香焦| 婷婷在线精品| 永久地址 色| 丁香六月婷婷综合激情欧美| 日本人妻伦在线中文字幕| 天久久久久| 久久老码第一| 色无码| 夜夜穞天天穞狠狠穞AV美女按摩| 大香蕉啪啪啪啪啪啪| 五月丁香在线| 9色小视频在线观看| 婷婷午夜精品久久久| 狠狠操天天操综合| www,com,五月色色| 中国女人内射6XXXXX| 色九月欧美| 五月婷婷乱| 人妻操逼视频| 综合久久伊人| 婷婷激情六月中文| 婷婷五月激情网| 九九在线91| 日韩a热| 五月天婷婷基地| 色伊人91在线视频| www色婷婷| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 这里只有免费的精品| 五月婷婷啪| www.玖玖婷婷在线| 深夜婷婷五月丁香| 色五月婷婷av| 99ri视频在线观看| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 婷婷色影院| 综合激情在线观看| 五月四色色| 亚洲精品99| 91碰超| 五月婷婷综合在线视频小说| 国产美女无遮挡裸体毛片A片| 超碰在线视屏| 五月婷婷丁香婷婷| 五月综合人妻| 妻久久久久| 九九热在线精品视频| 97五月久久丁香婷婷| 色女伊人| 五月婷三级片| 午夜丁香六月婷| 99热这里只有精品55| 另类A片| 色婷婷888| www,com,五月色色| 天天爽夜夜爽夜夜爽精品视频| 色五月丁香A欧美com| 婷色成人| 99在线精品视频| 爱性综合网| 99碰碰| 中文字幕永久免费| 五月丁香婷婷在线| 亚洲激情综| 婷婷九月综合| 九九色之九九色88| 97人人做| 99九九玖玖| 香蕉狠狠爱视频| 亚洲性爱电影| 久久激情五月婷婷| 玖玖在线视| 色婷婷欧美| 亚洲综合九九| 五月天播播| 蜜乳9188| 婷婷久久综合| 久久与婷婷| 日韩一本操| 99热日韩| 91色欲综合| 超碰男人色| 97干在线视频|