99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

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
返回資訊列表
99久久婷婷国产综合精品草原| 久久婷五月| 九九精品综合| 五月伊人91| 人人播| www.91.com黄| av首页在线| 免费五月婷婷网| 五月天婷婷基地综合网| 欧美一级a| 99亚州综合精品成人网| 丁香五月狠狠综合欧美| 日本久久精品| 国产在线网| 亚洲va成人va成人va在线观看| 在线观看熟女少妇| 欧美色婷婷| 99视频免费播放| 97人人操人人| 婷婷狠狠97| www.国产亚洲69ty.久久久久久久久久久久| 亚洲午夜国产成人电影VA国产欧…| 五月天色社区| 射久久丁香五月| 五月丁香六月香香蕉| 黄网在线免费观| 亚洲无码另类| 亚洲精品视频电影| 色色色色色网| 天天日天天草| 色亚洲欧洲| 激情五月天开心网丁香无码| 久久婷婷激情五月天一区二区| 综合成人小说婷婷| 亚洲另类婷婷五月综合| 激情丁香五月天图片| 婷婷五月电影院| 色操综合| www.婷婷五月.com| 超碰成人在线免费观看| 丁香婷婷综合影院| 丁香五月成人自拍| 97成人在线视频| 丁香六月婷婷久久综合| www.五月天| 成人视频在线免费播放| 玖玖五月| 六月丁香综合| 色综合五月| 久久精品视频9| 婷婷五月天激情在线观看| 日韩久久视频| 97色婷婷| 亚洲俩性性爱图片久久第六页| 超碰9| 激情五月天福利| 成熟妇人A片免费看网站| 亚洲操操| 精品久久99| 欧美色图天堂网| www.9797国产| 天天色色天天| 天天综合精品| 成人性生活免费观看。| 久久婷婷激情久久| 久热 91| www.久久爱.c n| 精品9l九九九九九77777| 九九热青草| 夜夜操狠狠操| 99热精品在这里| 天天操天天谢| 女人天堂 AV| 五月天婷婷婷| 视频一二区| 99色热| 五月天婷婷成人网| 饮料下药迷倒漂亮女同事强干| 激情久久久| 777色色色| h在线看免费版在线看| 色婷婷网| 久久全色| 99久久66| 丁香美女主播视频在线观看| 成人丁香色| 国产精品成人AV在线| 五月丁香久久网| 国产67194| 色综合色色| 99在线观看| 亚洲V国产V欧美V久久久久久| 成人国产欧美大片一区| 丁香五月激情综合婷综| 五月天色狠狠| 欧美日韩AAAA| 99人人干| 久久久精品99| 二人电影免费版在线观看| 亚州欧美国产久精国产99综合视频| 亚洲人妻AV| 99高级会所久久| 天天干天天干天天干天天干天天干天天干天天| 天天操比比| 色色丁香婷婷综合| http://www.sd-xiangsu.com/| 99爱在线观看视频| 久久婷婷综合五月天| 最近中文字幕大全免费版在线 | 99在线精品视频| 大香蕉欧美在线| 丁香五月综合婷婷| 91九色超碰| 日韩另类在线观看| 99在这里有精品| 免费看欧美成人A片无码| 狠狠综合网| 国产全是老熟女太爽了| 91婷婷搞| 激情综合色播| 丰满少妇猛烈A片免费看观看| 激情性爱网站| 久久这里只有精品16| 天天综合网站| 五月停停大香蕉| 天堂成人久久| 99热这里只有精品免费观看| 亚洲乱码日产精品BD| Caoporn公开| 99综合| 五月天激情.com| 五月婷婷黄色| 色狠狠综合网| 五月婷婷亚洲综合在线 | 日韩99精品| 99热精品在线| 九九色色色| 五五月五月| AV在线中文| 996热| 玖玖婷婷五月| 五月草视频| 色情五月丁香| 亚洲另类在线观看| 色婷婷婷婷| 亚洲AV日韩在线观看| 久99| 深夜男女福利刺激影院一区| 肏日网在线看| 五月婷婷丁香五月婷婷| 国产肥白大熟妇BBBB视频| 91九色视频在线观看| 青青草日本亚洲| 九九这里都是精品| 婷婷六月啪啪| 天天爽,夜夜爽| 欧美大肥婆大肥BBBBB| 激情婷婷久久| 激情综合99| 丁香五月色激情| 亚州激情在线视频| 日本人妻A片成人免费看片| 玖玖在线视| 色色 亚洲| 亚洲日韩一页精品发布| 26UUU亚洲欧美| 久久婷婷六月综合| 99精品激情| 26uuu精品一区二区| 中文字幕丰满孑伦无码专区| 激情 婷婷 插| www日本熟妇99在线视频| 亚洲乱码日产精品BD| 97碰在线视频| 五月丁香色| 亚洲AVwwwwwww| 婷婷五月天六月| 日本欧美成人片AAAA| 五月天婷婷黄色视频| 色久女| 91婷婷在线观看| 开心五月深爱婷婷| 婷婷伊人视婷婷婷| 婷婷丁香色情| 超碰AV在线| 99自拍视频网站| 综合狠狠干| 成年人看Va免费视频| 激情人妻蜜夜系列区| 久久丁香| 先锋影音av色五月天资源站| 亚洲色情网站| 色婷婷综合亚洲| www.射伊蕉婷婷| 日韩在线一级| 欧美成人A片AAA片在线播放 | 婷婷伊人綜合中文| 激情图片婷婷丁香五月| 色狠狠色| 久久丁香久久| 婷婷五月色影视先锋| 天天操夜夜操| 六月丁香大香蕉| 99热最新精品| 超碰在线免费| 99精品视频在线观看| av婷婷丁香 六月| 中国女人做爰A片| 狠狠大香婷婷爱| 99热在线播放| 激情五月天色婷婷综合| 成人综合视频在线| 国产精品国产成人国产三级| Www,五月天| 中文字幕五月久久婷婷| 色色a| 欧美成性色| 另类少妇人与禽zOZZ0性伦| WWW激情五月天| 五月天婷婷激情六月久久 | 五月J香蕉婷婷| 97韩国久久电影院| 日本欧美国产| 激情玖玖sh| 丁香婷婷视频| 干亚洲天堂| 丁香色婷婷色手机免费在线| 五月丁香啪啪啪综合网| 色丁香婷婷美女视频网站| 婷婷五月天在线一区| 操操日韩| 无码人妻少妇色欲AV一区二区| 蜜臀嫩草| 天天爽在线视频| 色色色五月天婷婷| 国产67194| 丁香久久五月天视频在线观看| 婷婷中文字暮| 99热精品在线| 婷婷 色 丁香 夜| 激情久久五月天| 久久精品A片777777| 亚洲热视频在线| 久久99视频| 激情综合网激情五月婷婷| 色噜噜五月天| 激情五月无码| 97av在线视频| 亚洲碰碰碰| 人与禽A片啪啪| 婷婷色狠狠| 色情婷婷| 9 99免费视频| 91伦| 免费无码毛片一区二区A片| 五月婷婷在线观看| 五月婷六月综合在线观看| 天天视频精品9| 色色色综合网| 99碰网站| 五月色影院| 成人网站免费在线播放| 丁香六月婷婷色XXXXX| 色婷婷五月天在线观看| 丁香五月在线自慰| 欧美影院| 五月丁香六月婷婷综合免| 六月激情婷婷综合| 亚洲性爱AV| 婷婷五月天成人| 美女五月狠狠| 婷婷激情丁香六月| 天天日夜夜夜操操操操| 激情五月深爱五月| 九九色精品| 色综合av超碰| 丁香五月色色婷| 狠狠操天天干| 婷婷丁香成人| 五月天丁香成人社| 婷婷日欧美在线观看| 天天撸夜夜爽| 色色丁香五月婷婷| 啪啪啪啪五月天| 丁香色六月婷婷| 在线99精品| 欧美色激情四射| 五月丁香影视| 99热成人| 无码激情AAAAA片-区区| 中文字幕丰满孑伦无码专区| 97精品人人A片免费看| www.minyis.com【JT】实力收量可预付QQ2101460746 | 少妇搡BBBB搡BBB搡毛茸茸 | 久机视频这只有精品| 五月天激情国产综合AV| 中文字幕日韩无码制服诱或| 丁香婷婷六月激情| 三十路磁力链接| 人妻操逼| 婷婷色日本| 中文字幕丰满乱孑伦无码专区| 超碰精品在线| 五月丁香六月婷婷,婷| 亚洲日韩国产黑丝黑丝AVAV一区二区三区 | 99网址在线看| ww久久| 日韩啪| 思思99久久| 久九九热| 久久婷婷亚洲| 97色色色视屏| 丁香五月天视频在线播放| 翔田千里无码| 色XX综合网| 婷婷深爱五月| 激情综合婷婷| 成人精品视频99在线观看免费| 五月丁香网站| 人妻人人操| 丁香五月影院| 婷婷天堂综合网| 色婷婷丁香AV综合| 婷婷激情五月天桃花网| 亚洲成人av在线| 超碰在线人人| 亚洲成人电影aaaa| 99热这里只有精品在线观看| 99综合视频一体| 五月婷婷综合网| 成人视频网| 噢美99| 9999热精品| 激情性爱五月| 五月丁香婷婷AV天堂| 色。 日日日| 日日夜夜天天爽| 五月天激情无码| 99干视频| 婷婷综合中文| 九九这里是免费的视频5| 婷婷月五天在线在线看| 区区欧美你爱| 91一起艹| 九色综合网| 婷婷色色综合| 99网址在线看| 亚洲性爱99在线| 婷婷色狠狠| 丁香六月情| 色婷婷在线播放| 麻豆WWWCOM内射软件| 丁香六月婷婷激情| 久久三级视频| 欧美激情 日韩无码 婷婷 五月天 久久婷婷丁香五月一二三 | 国内在线99视频| 久草婷妨| www久久99com| 色色a| 久久久99视频| 9|人妻人人操| 久久天天天| 成人性爱精品视频| 大香蕉综合| 久久久久视剧HD| 综合五月婷婷| 天天夜天天色天天| 狠狠色丁香| 99re视频在线精品| 99这里只有免费的小视频在线观看| 亚洲人妻五月丁香婷婷| AV操操操| 婷婷久久图片| 思思re视频在线| 久草五月婷婷| 一级无码作爱片| 五月6香色婷婷视频| 国产无套精品一区二区| 中文字幕日本最新乱码视频| 成人精品在线观看| 天天日夜夜| 99riav 亚洲| 丁香九月久久| 亚洲中文乱字字幕在线永久| 99热午夜精品| 狠狠五月丁香色婷| 婷婷俺去也| 大香蕉七区| 欧美成人网婷婷综合在线| 久久婷婷综合网| Av中文在线| 99这里精品| 伊人激情综合网| 97超喷视频在线观看| 欧洲亚洲免费视频区| 玖玖婷婷色五月| 青青草免费公开视频| 五月天之色情综合网| 99热热九九| 色五月色五天免费视频| 噜噜在线| 婷香五月网在线| 思思热高清在线观看| 日韩av手机在线观看| 亚洲午夜精品久久久久久人妖| 五月丁香色综合| 超碰啪啪网| 五月天激情中文字幕| 中文字幕 中文字幕明步| www.精品久9| 成人色色视频| 久久婷鲁| 天天爽免费视频| 日本黄色三级片内射| 77799热| 91超级碰| 9色在线| 99色中文| 67194成I人在线观看线路1| 色色色热| 激情综合网激情五月天| 激情九色| 9久久精品视频| 色婷婷久久综合久色综| 吊色AV男人的天堂| 久久超级碰碰| 91精品久久久久| 五月天婷婷影院| 97资源欧美日韩大香蕉超碰一区| 超碰成人电影| 丁香五月天欧洲在线| 亚洲天天| 色播丁香五月婷婷操:屄| 久热无码| 综合五月激情网| 久久久婷丁香五月| 婷婷五月激情图片| www.99久| 婷婷色网| 五月情综合| 国产午夜精品AV一区二区麻豆| www.五月婷婷久久.com| www.夜夜爱.com| 色色色色色色色色综合网| 激情综合丁香| 国产精品色婷婷99久久精品| 超碰99在线| 九九热精品| 欧美日韓成人亚洲精品另类| 超碰色碰碰| 99热九九热| 色五月色图| 五月丁香激情啪啪| 久久这里只有精品网| 婷婷99视频全集高清| 常久最新免费的色吊丝| 亚洲婷婷久久综合| 色九区| 激情五月婷婷啪啪| 色九九七七| 激情五月丁香五月| 99日这里只有精品| 色琪琪一综合久久激情五月视频| 婷婷激情四射| 少妇口诉沐足视频播放器网址| 婷婷五月激情综合网| 丁香五月开心婷婷| 欧美色99| 天天日天天久久青青| 国产26uuu| 久久九九爽| 色婷婷成人做爰A片免费看网站 | www激情五月天| 欧美毛卡| 青草青草视频2免费观看| 婷婷丁香午夜综合影视| 色婷九九九| 色五月AV| 丁香六月婷婷综合欧美| www.xtbsty.cn.com蜜乳AV| 亚洲狠狠色丁香婷婷综合久久| 婷婷五月天狠狠色| 激情综合网,五月| 91趴趴| 色婷婷亚洲婷婷| 亚洲色色在线| 五月天久久网站| 综合久久影院| 99色最新在线视频网站| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | α久久| 九九精品99| 九月婷婷综合在线| 艹B高清无码| 天天日夜夜拍| 91人人爽狠狠狠| 九九九九这里只有精品| 亚洲、热| 婷婷久久婷婷色五月| 大香蕉人人网| 91蝌蚪窝视频在线| 天天日天天操心| 日熟女| 久久久久9999| 操操天堂| 99热97| 色婷婷五月天成人网| 婷婷99热| 五月丁香偷拍| 超碰在线观看三级片| 婷婷婷婷色| 99精品热| 亚洲热综合网在线观看| 五月天婷婷綜合院| 99婷婷五月天激情| 婷婷激情五月天桃花网| 久久人妻熟女一区二区| 超碰碰碰碰| 婷婷五月天av| 亚洲成人综合在线| www.久久爱| 激情五月综合亚洲另类| 五月天色不卡| 久久色情| 人妻丰满精品一区二区A片| 日本三级日本三级99| 五月丁香啪啪综合| 色色色综合| 日日天天干| 亚洲综合色色色| 国产精品大香蕉| 99在线精品观看99| 久久婷婷五月综合| 国产毛片欧美毛片久久久| 五月婷婷综合网| 伊人久久艹| 九九亚洲| 97大香蕉五月天| H亚洲| 九九热内射| 久久亭亭电影| 九九色色色| 91色噜噜狠狠狠狠色综合| 九九人人自拍| 色色五月天婷婷| 丁香六月AV| 日本五月婷婷久久久六月丁香| 婷婷综合网在线| 国产精品国产VA片国产| 久久ab| 丁香五月婷婷色情综合| 亭亭色色五月天| 五月丁香婷婷无码中文| 日日做天天操夜夜爽| 婷婷色成人| 99热97| 色婷五月天| 综合婷婷| 九九视频在线观看视频在线播放69| 久久青青日本视频| 色色色999| 国产成人AV人人爽人人澡Va| 色色色色色网站| 99久视频| 久久女婷| 超碰色人妾| 婷婷九九| 涩涩网五月天| 五月丁香六月婷| 色情五月综合婷婷| www九九免费视频| 色玖玖玖| 99爱免费在线观看| 婷婷五月天综合久久| 99操逼| 国产美女无遮挡裸体毛片A片| 欧美97超碰| 久热 91| 五月激情开心婷婷| 五月丁香综合中文| 欧美电影在线观看| 婷婷丁香五月综合网上| 亚洲AV网站| 丁香五月98| 性综合网| 中文字幕免费高清电视剧| 伊人久久大香线蕉亚洲五月天,| 一区视频网站| 婷婷五月天成人影片| 任你搞网站| 婷婷色情 | 91丨九色丨熟女丰满| 婷五月天在线草| 激情小说在线视频| 香蕉97碰碰碰欧美| 亚洲激情av| 啪到高潮激情丁香五月| 日本狠狠干| 大香蕉人人网| 天天爱天天做天天爽| 九九精品综合| 97热超碰| 99免费视频精品| 婷婷伊人五月天| 天啪色| 色婷婷久久综合久色| 丁香五月天狠狠| 亚洲熟妇AV乱码在线观看| 九月婷婷色色| Www.激情| 五月天久久色| 久热这里只有精品在线观看 | 99热免费在线| 日本黄色在线观看| 婷婷5月九九| 五月丁香综合网| 欧美综合五月丁香六月婷| 99视频只有这里精品| 在线播放成人网站| 色情综合| 九九99九九99| 伊人久久综合| 婷婷丁香五月综合网上| 操操操B| 麻豆科斗777| 激情综合无码| 色9月| www.五月.com| 色婷婷AV在线观看| site:feetmall.com| 五月天婷婷激情| 婷婷色综合| 久久精品4| 亚洲黄3级片网站欧美| 蜜乳中文字| 琪琪布丁香社区激情五月天| 热99视频精品在线| 激情com| 天天干天天干天天干天天干天| 五月丁香在线观看99| 九九这里都是精品| 玖玖九九9999在线观看视频精品| 色情播放| 中文字幕无线久必| 久久96热| 日本三级日本黄色| 欧美爆乳一区二区三区| 蒲京久久无码视频| 色色综合色| 亚洲天堂玖玖| 天天操比比| 丁香久久九九99| 99视频在线| www色综合亚洲92| 999热这里只有精品| 月色色综合婷婷网| 激情99| 色情五月婷| 操逼视频一区| 婷婷五月大| 九九热AV| 五月丁香婷婷啪啪综合网| 666555。COm毛片| 青草激情在线| 艹天天射| 亚洲精品国产成人AV在线| 大香蕉综合在线| 婷婷五月天堂| 另类丁香五月天区图| 成人免费黄色短视频| 九色色| 丁香五月大香蕉AV| 久热91| 天天色一道本综合婷婷| 日韩ww| 六月婷婷开心| 丁香九月婷| AV中文在线| 日日射天天射| 男人視頻站| 亚洲综合成人网| 99re这里只有精品免费| 97婷婷五月| 日本女人久久| site:picc-up.com| 五月丁香亚州综合网| 色九九九九| 五月份婷婷| 日本WwW色偷偷丁香花久久久京东热| 视频色色色色色色| 婷婷精品在线| 激情婷婷狠狠干综合| 久久激情网| 亚洲综合在线伊人婷| 九九9久九9国产视频| 开心激情综合| 丁香五月狠狠在线观看| 开心久久网婷婷| 欧美色色色| 婷婷五月开心中文字幕在线| 大香蕉人在线65| 91Chinese在线| 亚洲欧美一区二区三区四区爱爱动图| 影音先锋噜一噜| 色伊人91在线视频| 日本啪啪天堂| 九九热这里只有精品31| 99热最新网址| 色婷婷精品视频在线播放| 亚洲最大在线| 婷婷丁香综合| 人妻狠狠操| 久久丁香九| 中文字幕成人| 七七色色综合| 五月婷婷视频ab| 丁香九月激情| 亚洲欧美国产A片免费观看| 人人操AV| 婷婷六月综合基地| 五月天久久www| 婷婷中文在线| 大香蕉娱乐| 精品无码久久久久久久久| 激情综合国产| 婷婷色爱| 日本va欧美va精品发布视频 | 久久美女五月天| 五月丁香婷婷无码A∨| 超碰无码318604| 久久五月婷综合| 天天插天天插| 九九碰九九爱97超| 欧美婷婷五月天| 麻豆123区| 五月婷婷另类| 亚洲成人超碰| 久久久五月天婷婷成人网| 99国产精品久久久久久久久久久 | 五月天欧美激情| 天天综合久久| 五月色婷| 任你擦免费视频| 五月婷婷丁香五月| 五月婷A V在线| 91久久久久久| 色五月天婷婷| 色五月色五天色情网| 99网99热| 五月婷婷婷婷| 色色 9| 夜夜夜叫天天天做| 丁香八月综合激情| 五月丁了香蕉综合| 五月天日日操夜夜操 | 婷婷五月激情欧美| 另类小说五月天| 天天干天天干天天操| 99久久免费精品| 很操日本7| 五月婷免费视频久久久| 五月激情丁香久久综合网| 99碰碰| 亚洲精品电影| 亚洲综合1024| 99热在线精品观看| 久久婷婷色情7777网站| 久久婷婷五月天激情四射| 久草九九| 67194中文字幕| 国产激情在线观看| 91九色小视频| 9精品在线| 色综合区| 欧美日韩成人在线| 美女天天艹人人爽| 性做久久久久久久免费看| 国产人妻人伦精品一区二区| 天天综合精品| 无码少妇高潮喷水A片免费| 日日躁夜夜躁狠狠久久AV| 国产精品日本一区二区在线播放| 国产精品久久久久久久久久免费 | 久9热在线免费观看| 99在线免费视频播放| 人妻在线网站| 色色色区| 日本99久久| 综合丁香婷婷五月天| 玖玖伦理电影| 5月丁香六月情| 日日狠狠久久偷偷四色综合免费 | 五月婷婷色色网址| 91日日日| 在线播放中文字幕| 深爱丁香网| 天天摸日日舔狠狠添婷婷婷| 狠婷婷五月| 六月丁香五月天| 久久99大全| WWW.婷婷| 欧美色一级色| 大香婷婷| 一级片sese片.COM| 欧美五月丁香在线观看| 五月丁香在线综合| 99热这里只有精品1025| 丁香五月激情婷婷| 波多婷婷久久| 操人久久| 色五月久久成人婷婷| 99热精品6| 婷婷五月天综合AV| 五月天成人免费视频| 99热在线观看| 丁香五月婷婷99| 婷婷伊人| 婷婷激情五月综合丁香社| 停婷丁五月在线| 熟女激情五月天| 99视频这里有精品| 日本久草福利| 在线,国产,色,热视频| 欧美爆乳一区二区三区| 免费观看亚洲AV片| 久九男女天堂| 免费播放片大片| 天天AV导航网| 色五月丁香婷婷| 俺去也婷婷| 色都都狠狠色都都色综合色| 99热最新| 婷婷.com| 天天干一干| 国产探花一片区| 婷婷五月天成人导航| 快色t v在线入口| 久操热线| 激情网色五月| 梁铮版蜘蛛女在线观看| www.99热视频| 99国产精品久久久久久久久久久| 色99无码| renre人人操国产超碰在线| www.9797国产| 婷婷六月激情综合| 色色色激情| 五月丁香六月婷婷久久| 六月色色| 丁香九月综合激情| 可以直接看的AV网站| 91狠狠综合久久久久久| 七七久久婷婷| 另类图片五月天婷婷| 亚洲天堂大香蕉| 9九九久久精品无码专区| AAA久久| 丁香婷婷五月| 中文字幕精品无码一区二区| 丁香五月另类色婷婷麻豆| 人妻VideOssS人妻高清| 五月婷婷影院| 五月丁香激情婷婷| 人妻无码精品一区| 99ree6| 五月六月婷婷激情网| 免费看欧美成人A片无码| 九月丁香久久网| 欧美成性色| 丁香婷婷九月| 久久精品噜噜噜成人A∨色欲| http://www.lingjunshare.com/| 久久丁香| 97在线/亚洲| 色综合色色| 久久久久久久久18久久| 色五月开心五月激情五月| 午夜丁香| 黄色成人网站在线播放| 天天干天天日天天操| www.色色色com| 五月丁香久久久日婷婷久久婷婷日 | 色欲操| 五月丁香人妻| 日本美女上人| 99久久99久久| 日本3级片一区2区| 婷婷六月天激情| 久久99草五月婷婷| 激情久久综合网| 影音先锋91在线资源站| 五月激情综合激情五月| 99久久99久久综合| 婷婷五月天受日本法律保护| 丁香五月色情| 91丨九色丨大屁股| 亚洲另类在线观看| 婷婷五月天色色| 99精品久久久久久久婷婷| 日韩精品一区二区亚洲AV观看| se影音资源在线观看| 91久久久久| 久久久精品人妻录| 99爱在线| 深情五月天| 婷婷九九色| 这里只有精品免费观看网占| 天天肏在线视频| 亚洲综合色棒| 综合精品啪啪| 99精品在线观看视频| 狠狠色狠狠爱| 狠狠99| 欧美精品99| 婷婷性爱| 亚洲色婷婷色| 国产欧美性成人精品午夜| 欧美韩日AAA网站| 婷婷五月花.97| 欧美色五月天| 婷婷五月丁香香蕉| 丁香五月婷婷亚洲综合精品| www色色com| 亚洲婷婷五月天| 就爱啪啪婷婷| 亚洲操女| 色色色色网| 91狠狠色色丁香婷婷综合久久| 99自拍视频网站| 色墦五月丁香| CHINESE熟女老女人HD视频| 五月婷婷在线网站| 天堂va久久久噜噜噜久久Va| www.色婷婷.com| 五月丁香久久综合| 五月丁香啪啪| 五月丁香AV在线| 婷婷丁香综合| 亚洲色综合| 五月丁香六月婷婷综合免| 久久婷婷五月综合色欧美| 亚洲日日操| 超碰91人人操| 九九色热| 激情色视频| 色婷婷五月在线| 大香蕉久久| 丁香六月无码| 人人九色| 开心激情站| 色五月婷婷丁香五月| 超碰色综合| 疯狂做受XXXX高潮A片| 亚洲欧美另类在线23p| 97干在线播放| 日本人妻伦在线中文字幕| 黄色AAAAA| www,久久久| 电影91久久久| 丁香激情五月| 五月婷婷视频啪啪美女| 九九美女视频| 狠狠操天天干| 伊人啪啪网| 丁香无月在线观看| tingtingseav| 国产精品大香蕉| 五月婷婷手机在线| 日韩一级A片黄色| 九九99久久精品| 婷婷月综合| 激情婷婷狠狠干| 日本97在线视频| 99热热热99精品婷婷| 色色色五月婷| 天天色色婷婷| 国产成人av在线| 九九精品免费视频99| 五月丁香香蕉| 人人噜天天上| 狠狠操天天操| 六月色激情| 精品一二三区久久AAA片| 五月婷婷黄网站大全| 丁香婷婷色色| 国产做爰视频免费播放| 91九色欧美| 六月丁香五月亭亭| 亚洲综合1024| www.9色色色| 婷婷五月影院| 九热...av| 五月停停激情网| 色色色色色级无码| 国产精品成人AV在线| 91精品刘玥| 六月丁香五月婷婷| 色婷婷日本| 日日肏天天操| 狠狠香婷婷五月| 五月婷婷深深爱| 淫视馆av三区| 99在线精品视频| 91一起艹| 成年人丁香五月| 五月欧美色色五月| 天天日日夜夜爽| 9月色婷婷| 丁香亚洲色综合| 午夜天堂一区人妻| 五月天色影院| 爽极品色| 天天做天天爱天天爽| 天天精品视频在线观看视频| 乱女乱妇熟女熟妇综合网站| 99riAv1国产在线观看| 九九热青青草| 日本在线播放97| 无码少妇高潮喷水A片免费| 色婷婷丁香五月| 大香蕉久热| 色五月婷婷五月| 婷婷五月综合激情免费视频| 久久婷婷操| 国产精品噜噜在线视频| 丁香五月六月久久综合| 国产成人av在线| 99爱99操| 九热视频在线精品15| 丁香五月天天| 五月天婷婷激情四射综合| 狠狠婷婷综合| 五月婷婷久久大片| 天海翼中文字幕高| 亚洲精品久久久无码| 九九99久久| 久久综合婷婷| 91碰碰| 思思热在线观看| 色久综合| 嫩草AV久久伊人妇女超级A| 97干在线| 激情综合五| 专区无日本视频高清8| 色色色综合网| 99精品偷自拍| 欧美电影在线观看| 久久人妻熟女一区二区| 青青久在线视频免费观看| 中文字幕日产A片在线看| 亚洲无码色| 少妇性按摩无码中文A片| 香蕉久久国产AV一区二区 | 看婷婷五月天网| 天天日天天舔天天摸| 日本精品在线噜噜噜| 激情五月天在线观看婷婷| 国产亚洲99| 人妻内射麻豆视频| 五月婷婷色丁香| 五月婷婷免费视频| 国产资源91在线| 色五月天成人| 国产精品色| 五月婷婷久久久| 亚洲天天| 噼里啪啦在线观看免费完整版视频| 日产精品久久久久久久蜜臀 | 成人va在线播放| 青青青在线视频国产| 丰满少妇乱A片无码| 9|人妻人人操| 色色色色色五月| 久久久大香蕉| 狠狠操之狠狠操| 日日射天天射| 欧美VA在线| 超碰日日操| 久久五月丁香| 日曰躁夜夜躁2026| 99久高清视频| WWW久久久| 狠狠干2007| 亚洲天码视频www蛋播视频| 激情99| 色婷婷电影网| 九月丁香婷婷基地| 毛v一区二区视频| 99热自拍| 婷婷五月激情欧美大胆视频| 日日夜夜婷婷| 91狠狠综合久久| 夜精品无码A片一区二区蜜桃| 久久受www免费人成| 日本操片| 九九热视频网站| 综合激情网激情五月。| 亚洲无线视频| 无码人妻少妇色欲AV一区二区| 婷婷丁香六月天激情四射网| 97色色婷婷五月天| 日本精品。999| 久久婷婷大香蕉| 91色婷婷综合久久中文字幕二区| 五月丁香六月婷婷综合免| 噜噜色噜噜网| 无码色色色| 亚洲AV成人在线观看| 黄网免费观看| 婷婷五月天人妻| 婷婷狠狠18禁久久| 99视频| 精品99在线看| 综合在线丁香五月| 色婷婷国产精品综合在线观看| 日本综合色图| 久热伊人9| 高清无码 一区 二区 三区| 丁香五月天综合| 99re在线播放| WWW,五月| 天天操天天日天天爽| AV在线免费播放| 婷婷五月丁香基| 亚洲成人网站在线观看| 婷婷色欧美激情| 亚洲精品视频在线播放| 亚洲色综合色网| 五月六月丁香婷婷在线观看| 婷婷六月天| 九九婷婷激情综合网| 综合网色| 色五月婷婷小说亚洲中文字幕组| 婷婷在线视频| 婷婷五月电影| www.99成人视频| 99久久综合| 人妻久久婷婷| 五月婷婷开心综合| 99热成人| 天堂A∨在线| 99热这里只有精品1| 久久99国产综合精品免费| 99在线视频色版| 色婷婷狠狠18| 国产SUV精品一区二区883| PORNY九色9l自拍视频成人| 色婷婷AV久久久久久久| 另类少妇人与禽zOZZ0性伦| 五月婷婷欧美| 丁香五月中文字幕色播| 新激情婷婷| 婷婷丁香五| 色五月婷婷久久| 欧美VA视频| 色色色色av色色色色| 成人做爰A片免费看网站找不到了| 五月天综合在线| 干一干xxxx| 国产精品成人网站| 婷婷五月骚厕所| 免费看欧美成人A片无码| 日日撸夜夜操| 九色色| 日本猛少妇色XXXXX猛叫| 97人人操在线| 97色色综合| 青青草原爱爱网| 操逼棍操逼| 国产精产国品一二三在观看| 亭亭五月丁香综合欧美| 免费国产视频| 第四色大香蕉| 五月丁香六月婷婷网| 狠狠色噜噜狠狠狠777奇米| 秋霞网在线观看理论91| 五月天激情小说| 色五月成人婷婷| 俺去也综合| 91蜜桃婷婷狠狠久久综合9色| 天天色丁香| 久久婷婷色综合| 九九热最新| 99久免费视频| 天天久| Aα在线免费观看| 色五月色五天免费视频| 五月色婷婷夜色| 丁香六月婷婷激情| 狠狠做深爱婷婷久久综合一区| 96丁香婷婷九月蜜桃综合久久| 激情WWW| 久久婷婷五月天激情新地址| 五月丁香九九九综合| 久久9热好| 亚洲性爱99在线| 超PEN精品在线| 九九热这里只有精品一| 99人人爽| 婷婷五月天黄色小说| 超碰人人操人人9| 激情都市丁香婷婷| 九九精品热播| 超碰在线观看9| 9l视频自拍九色9l视频自拍九色9l社区 | 插逼综合网| 亚洲AV成人片无码网站| 久久综合中文| 丁香五月天电影| 天天日人人| 六月色丁香婷婷| 亚洲欧美999| 欧美丁香五月| 99自拍视频网站| 丁香丁婷五月激情| 99精品成人无码A片观看金桔| 九九爱看亚洲| 色婷婷色综合| 99热精品在线| 久久女婷| 国产乱人偷精品人妻A片| 色综合日日| 七月激情六月婷婷综合在线播放| 99精品在线观看视频| 九九热这里只有精品7| 伊人综合网站| 99热这里只有精品国产首页| 伊人九九综合| 色色色色色色色色综合网| 日本www五月婷婷| 超碰自拍天堂| 在线成人网址| 激情丁香淫荡婷婷| 潮汕成人AV片在线| 4399亚洲视频| 久月丁香爱婷婷综合| A片天天| 久久五月婷婷丁香| 五月婷婷丁香啪啪| 婷婷五月五月丁香| 五月婷婷成人| 最新午夜理论片| 久草婷| 五月婷婷AV| 婷婷成人五月天一区| 色婷亚洲五月丁香| 天天干夜晚夜操| 久久欧洲综合网| 日韩高清成人| 亚洲亚洲人成综合网络| 色色色色综合| 无码九九| 99ri精品在线观看| 九九黄色网| 久久aaaa片一区二区| 中文AV在线播放| 影音先锋日本三级资源| 亚洲五月丁香六月婷婷| 青青草a在线| 婷婷国产欧美97| 极品人妻VIDEOSSS人妻| 色久丁香五| 色婷婷丁香五月高清在线| 欧美人人女女精品综合五月天| 日日爽夜夜爽| 激情啪啪五月|