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
返回資訊列表
色婷婷六月| 五月丁香六月婷婷久久| 欧美在线视频9| 婷婷射综合| 色色成人網| 国产午夜精品一区二区三区四区| 色五月婷婷一二| 婷婷五月天六点丁香五月| caop在线| 丁香六月婷婷综合欧美| 久热这里只有精品在线观看| AV片在线观看| 九九热免费视频| 天天天天色天天天天天干| 婷婷五月天黄色| 亚洲成人在线在线| 丁香五月天社区| 五月丁香六月婷婷国产视频| 深爱丁香激情| 天天干狠狠操| 色色色色综合网| 丁香五月婷婷呀| 人橾人| 九九热免费视频| 99re在线这里只有精品视频首页| 99色看这里只有精品| 激情色五月天| 日本不卡一区二区三区| 国产日韩欧美| 久久婷婷亚洲| 久久天天| 伊人五月天在线| 综合五月婷婷| 欧美人人草| 亚洲Va成人| 激情骚五月| 国产精品色色| 日产精品一线二线三线芒果| 99视频精品| 久久一热| 五月婷婷激情久久| 激情综合久久| 六月丁香啪啪| 五月婷婷综合激情| 五月婷婷丁香啪啪| 婷婷丁香五月激情密臀av| 男同91 | 人妻久久久久久久| 999九九九久久久99HD| 五月天婷婷在线观看| 无套内射极品大美女| 婷婷色5月天在线。| 丁香五月欧美成人| 天天爽在线视频| 99资源在线视频| 日本在线观看aaa 99| 极品少妇高潮啪啪AV无码| 五月激情在线| 五月丁香成年黄色| 99色热| 涩涩涩.com| 五月丁香色五月| 丁香 婷婷 激情 综合 五月| 亚洲99激情| 久久98| 色狠狠色综合久久久绯色AⅤ影视| 久久综合综合综合| 五月丁香综合成人社区| 97视频.干com| 久久er免费视频| 任你干嘛免费视频播放| 不卡在线视频| 婷婷久久久| 99热在线观看| 日韩丰满少妇无码内射| 97成人丁香| 91九九九九九九| 亚洲精品无码A片一区二区| 操操操B| 国外亚洲成AV人片在线观看| 亚洲视频1区| 91亚洲视频| 日本一级大片| 成人av免费观看| 久久九九爽| 综合五月婷婷| 人人天堂操| 婷婷激情另类| 99视频在线精品免费观看2| 婷婷香五月天| 91狠狠色色丁香婷婷综合久久| 婷婷五月天无码熟女| 色域五月丁香| 婷婷综合在线播放| 蜜桃婷婷丁香五月天狠狠久久综合| 五月婷成人网| 亚洲无码色色| 99热都是精品| 色色五月综合| 婷婷五月激情六月丁香| 五月丁香六月婷婷的女人| 久久精彩免费视频| 99精品久久| 99综合| 激情综合久久| 色婷亚洲五月丁香| 五月天婷婷基地| 激情综合播播| 狠狠搞狠狠操| 荫道BBWBBB高潮潮喷| 欧在线一区| 97人人搞| 韩国久久少妇视屏| 色播五月丁香| 麻豆WWWCOM内射软件| 久久99免费视频网站| 吊色AV男人的天堂| www.com操| 婷婷成人五月天成人文学| 激情小说视频图片| 狠狠色婷婷7777久综合| 啪啪啪啪五月天| 婷婷噜噜| 亚洲乱码日产精品BD| 五月天丁香欧美激情| www.yw尤物| 亚洲综合在线丁香五月| 亚洲色五月| 亚洲欧洲另类| 九九热10| 婷婷开心五月| 日比网免费国产| 久久9热| 99re久热只有精品6在线直播| 99久久大片| 久久五月天婷婷| 最近中文字幕2019视频1| 五月婷狠狠| 玖玖婷婷五月天| av性爱在线| 久久婷五月婷| 99热69| 人色五月天婷婷| 久久98热re| 成人做爰黄A片免费看直播室男男| 超碰国产在线观看| 狠狠色婷婷777| 少妇大叫太大太粗太爽了A片| 一级七香蕉| 九九热视频网站| 日本天天操| 久久人妻熟女一区二区| aaa丁香五月天| 99爱在线观看视频| 91人妻人人操| 天天爽天天爽夜夜爽| 久久激情视频| 色99在线视频| 中文av网站| 日本人妻伦在线中文字幕| 青青草原亚洲天堂| 999热在线视频| 婷婷成人av| 99极品视频| 超碰在线观看99| 人妻六月天| 成年人99热| 欧美肉大捧一进一出免费视频| 97色97干| 久操福利| 九九色色| 婷婷99| www98日本小时间到了| 蜜桃五月天| 国产一级片色色| 这里只有精9| 五月婷丁香| 婷婷99中文字幕| 天天色色天天| 欧美操综合| 情婷婷五月天| www.金莲av| 激情五月综合色婷婷| 五月丁香色婷婷| 日韩免费乱轮网站| 夜夜操狠狠操| 五月丁香六月婷婷不卡免费无码| 狠狠爱青青草| 五月丁香淫淫婷婷婷| 色五月丁香五| 久久思思热视频| 变态 另类 在线| 能看的av片| 少妇高潮呻吟A片免费看软件| 婷婷五月天激情综合| 色婷婷久久| 婷婷激情五月天综合| 六月婷婷综合| 五月天激情社区| 精品AV无码超碰| 婷婷性爱五月天| 丁香六月婷婷社区| www婷婷| 丁香六月婷婷开心| 国产欧美日韩综合精品一区二区| 99免费视频在线观看爱| 欧美激情中文字幕| 99热成人| 丁香六月开心| 色色9 9| 欧美va在线| www.99免费视频| 婷婷五月天视频免费在线观看| www.久久爱.c n| 啪啪 综合网| 色五月天激情| 99免费在线视频| 六月伊人婷婷| 久久综合色情网站| 99这里都是精品| 人人干Av| 欧美婷婷丁香五月社区| 日本一级淫| 韩国三级五月天婷婷。| 最新色色五月天| 99热在这里只有精品| 五月丁香婷婷AV天堂| 亚洲激情四射色| 精品久久这里热66| 九热视频| AA片在线观看视频在线播放| www.色婷婷.com| 久久人人看| 国产日韩欧美| 婷婷综合97| 激情丁香五月| 婷婷综合五月| 人人爱天天摸摸天天爱| 日本一毛片| 九九色综合| 日日爱激情| 操婷婷基地| 婷婷色五月天在线| 无码操B| 亚洲成人高清在线| www.cao.com久久| 久久精品五月天| 欧美又粗又大一区二区在线观看| 久久人视频| 亚洲成人免费在线| 超碰国产在线观看| 天天色激情| 99色色热热| 久热A片| 91久久久久久| 开心五月天激情网站| 91碰操| 丁香五月婷婷大香蕉| 26uuu美女三级视频| 婷婷综合伊人| 先锋影音av色五月天资源站| 婷婷导航| 久久 婷婷 五月天| 亚洲欧州色情在线观看| 久久久久亚洲AV成人无码电影| 五月天成人小说| 操久久网| 色九月婷婷| 夜色综合网| 亚洲开心激情网| 亚洲午夜电影| 热久久色| 5五月综合网亚洲| 少妇高潮呻吟A片免费看软件 | 久久天天| 欧洲毛片基地c区| 五月丁香中文| 久草五月天电影网| 综合性视频99| 天天肏天天插| 电影《战争与艾拉》免费观看| 日本三级毛片| 99热精品网| 五月婷婷六月激情| 日韩AV无码影片| 久久免片| 成年人丁香五月| 97色在线观看视频| 久久激情天堂| 香蕉国产2013| 人妻综合网| 99热国产免费| 91九色中文| 天天天天天日| 婷婷狠狠干| www.激情五月天| 色五月aV| 五月天婷爱综合| 婷婷六月天精品| 99热久只有精品首页| 国产精品久久..4399| a在线免费v| 丁香五月婷婷综合激情啪啪啪啪啪啪啪| 天天色情站| 五月丁香婷婷欧美| 免费看欧美成人A片无码| 99精品综合| 婷婷综合激情| 日本99热| 99操| 成人无码精品1区2区3区免费看| 丁香五月天激情| 久久五月天婷婷| 九九视频在线| 无码少妇高潮喷水A片免费 | 天天插夜夜爽| 天天激情| 五月婷婷深深爱| 婷丁香五月天| 成人在线99| 亚洲天堂99| 亚洲综合五月天| 五月天社区| 99丁香五月| 久婷婷久草| 亚洲av成人一区二区电影在线| 91综合网| www.婷婷亚洲基地| 欧洲亚洲最新精品| 丁香激情婷婷网| 五月婷婷之美女图片| 五月婷婷六月丁香色| 99免费热视频在线| 97久久久| 欧美日本日韩| 99资源人人| 六月色激情| 玖玖爱综合网| 夜夜天天久久婷婷| 五月丁香婷婷导航视频| 天天插天天干| 成人在线免费网址| 欧美日韩99| 日本a片网址| 色噜噜狠狠色综合日日免费| 久久久免费精彩视频| 二色AV| 在线观看免费视频| 九九视屏| 日韩狠狠色婷婷| 天天爽综合| 丁香五月天亚洲视频| 亚洲人妻av| 丁香五月九九| 日日夜夜婷婷| 色99在线视频| 女人被男人吃奶到高潮| 五月婷婷综合影院| 五月天开心色情网| 五月婷视频| 午夜一区| 狠狠狠狠狠狠| 天天爽综合网| 六月婷婷网站| 99精品这里只有免费视频| 成人片在线免费看| 色色色激情网| 成人国产欧美大片一区| 天天狠狠夜夜狠狠2023| 99人妻碰碰碰久久久久视| 欧美综合婷婷网| ww久久| www.色色com| 亚洲精品V天堂中文字幕| 91日视频| 26uuu亚洲| sesesesezonghe| 美女精品一级不卡视频| 五月丁香六月婷婷综合| 色亭亭九月| 色婷婷成人做爰A片免费看网站 | 97干在线| 青青草性爱视频| www.99热在线| 99精品偷拍视频| 九月丁香婷婷基地| 日韩在线看AV| 丰满少妇乱A片无码| 久久xx| 色色色色色色色色色色色色色色,网站| 色丁香综合影院| 婷婷啪啪| 99re66热这里只有精品| 香蕉久久国产AV一区二区| 亚洲成人网站在线| 狠狠干综合网| 97se视频在线| 亚洲免费av在线| 婷婷狠狠狠爱| 91疯狂操操操操| 另类图片五月天婷婷| 激情婷婷五月丁香啪啪啪| 99精品在线观看| 91碰碰碰| 99这里只有免费的小视频在线观看| 日都一级A片| 久久国产高潮白浆免费观看99| 五月天婷婷丁香成人网| 成人性生活免费观看。| 女同在线9| 超碰操日| 综合久久综合五月天婷婷| 99热 日韩| 五月丁香色停停啪啪啪| 久久婷婷婷婷伊人| 婷婷五月天首页激情| 九月婷婷激情久久| 超碰在线免费9| 五月久久婷婷天堂视频| 久久伊人婷婷| 婷婷五月激情四月综合| 久久在线视频只有这里有精品| 天天做天天爱天天爽夜夜揉| 久久久久亚洲A∨成人乱码电影| 超碰碰碰碰| 激情AV| 激情五月婷婷| 婷婷五月开心中文字幕色| 久久这里只有精品07| tingting五月天亚洲| 就爱啪啪婷婷| 婷婷五月激情在线视频| 婷婷爱五月| 91丨九色丨熟女丰满| 五月天婷婷在线播放| 99爱在线视频| 色情五月婷婷| 国产偷人爽久久久久久老妇APP| 日比网免费国产| 字幕网AV中文字幕| 97碰成超视频免费视频| 欧美va视频| 色婷婷五月影视| 丁香五月在线视频| 色色色色色网站| 六月丁香婷婷综合在线| 91超级碰碰| 欧美大肥婆大肥BBBBB| 婷婷99狠狠躁天天久久久九九九| 黄色AAAAAAA| 欧美性爱中文字幕| www.99热国产| 激情综合丁香五月| 激情都市丁香婷婷| 五月丁香六月激情| 久99久视频精选| 丁香五月网址| 66久久视频在线| 激情小说 五月天| 日日操天天操| 天天拍天天操| 91成人看| 丁香激惜男女| 五月天色丁香| 99日韩| www.亚洲激情.com| 五月天激情小说| 色五月色综合| AV在线大香蕉| 亚洲狠狠色丁香婷婷综合久久| 色射7856五月天激情四射| 免费AV播放| 丁香五月天激情AV| 在线看片av| 激情婷婷五月丁香啪啪啪| 99碰视频| 激情五月五月五月婷婷| 亚洲av成人在线| 国产亚洲精品久久久久久郑州| 99热欲| 婷婷97| 色色cOm| 激情五月天在线视频| 亚洲123区高清入口| 亚洲激情综合网| 婷婷免费无视频| 亚洲综合视频网| 成人九九视频| 99热综合网| 999热视频精品99免费在线| 91久久精品无码一区二区三区| 五月天另类综合网| 九色PORNY9l原创自拍| 熟女强人妻一区二区三区四区无| 五月丁香六月婷综合成人综合| 五月丁香激情六月| 五月丁香影视| 91精品又长又大又粗又爽又猛| 97涩涩丁香五月天| 91久久99久久91熟女精品| 五月丁香婷婷狠狠操| 亚洲夜五月| 99色在线观看视频| 69久久久| 99这里只有精品在线| 任你爽视频| 丁香五月激情综合久久| 亚洲综合网激情小说| 九色七七| 九九九九中文字幕| 久久精品永久免费| 大香蕉啪啪啪| 91日本在线| 天天操天天操天天操天天操天天操 | 1024人妻| 99超级碰免费视频| 9久久久久| 丁香五月婷婷久久久| 五月天婷五月天综合网在线观| 性天堂久久| 国产原创视频91九色| 成人婷婷五月天| 激情综合五月| 丁香五月激情啪| 五月丁香六月情| 九九色婷| 五月丁香在线偷拍视频| 丁香激激情网| 99亚洲天堂| 97操在线视频| 九九五月天| 大伊香蕉玖玖爱| 婷婷五月激情图片| 久久久五月天婷婷成人网| 五月婷婷干| 国产精品a无线| 婷婷五月天受日本法律保护| 激情综合网五月| 久久婷婷啪啪视频| 色婷婷免费观看| 人妻久久婷婷| 97碰碰人人| 大香蕉久久婷婷| 在线只有精品| 色色色97| 九色无码| 久久看婷婷| 日韩精品一区二区亚洲AV观看 | 怡红院99| 99精品国产在热久久| 日韩黄黄| 日本不卡一区二区三区| 爱的综合网| 中文字幕乱码亚洲精品一区| 99久久思思| 久草婷婷网| 五月丁香无码| 欧美婷婷九月| 久久精品夜色噜噜亚洲a∨| 久久狠婷婷| 五月天激情网站| 五月天激情啪啪| h亚洲| 99操久久| 337p大胆噜噜噜噜噜91Av| 欧洲永久精品| 欧美大片| 丁香婷婷中文字幕| 97日本在线| 99热这里是精品| 色狠狠色| 色五月视频无码播放| 九月婷婷在线视频| 丁香狠狠色婷婷久久无码视频| 99热在线网站| 亚洲AV网站在线观看| 亚洲不卡| 少妇高潮A片无套内谢麻豆传| 天天综合永久| 91丨九色丨老熟女激情| 狠狠色大香蕉| 色婷婷五月影视| 五月婷婷六月丁香| 亚洲婷婷激情五月天| 久久婷婷资源| 噜一噜在线| 欧美内射AA| 99这里有精品视频| 丁香婷婷色情社区成人小说| 婷婷丁香婷婷97| 激情五月婷黄版| 亚洲五月婷| 99这里都是精品| av性爱在线| 婷婷色中文| 亚洲热综合| 五月丁花色综合网| 百度4399有码精品V在线观看 | 婷婷五月激情五月激情| 精品怡红九九九| 亚州婷婷五月激情综合| 99精品热| 日日日天天干| 操人91| 日操夜操天天操不卡| 五月天天久久香| 婷婷在线观看五月天在线视频| 男人先锋久久| 在线网黄| 婷婷播播五月天| 国产九九一区二区三区| 五月丁香六月情| 日本熟女一区二区| 五月色色色| 亚洲三A| 91天天操天天干天天射| 国产亚洲精品久久久久久郑州| 停停五月天激情网| 久久久这里都是精品| 99九九热播在线免费视频| 超碰人人操在线| 六月婷婷影院| 九艹在线| 狠狠爱深色婷婷综合| 五月丁香无码| 深爱激情网五月天| 亚洲激情淫网| 色欲影香| 九九色婷| 思思99热| 97干网站| 激情99在线视频| 五月丁香久人妻中文| 区啪精品| 日韩一本操| www.狠狠| 99热国产免费| wwwC0maV五月花| 五月综合久久| 99热热热国产超碰| 婷婷99视频在线| 9色在线| 五月天成人免费视频| 五月天婷婷色播| 丁香六月婷婷综合激情欧美| 婷婷五月综合网激情| WWW.桔色成人.COM| 五月天综合婷婷| 九九色99| 一个色的综合| 五月色综合网欧美网| 色婷婷影音| av大片在线| 国产成人亚洲综合A∨婷婷| 欧美性丁香色色五月天干干| 丁香五月婷婷俺也要去| 狠狠va| 丁香五月激情婷婷| 色色五月婷婷久久| 九九热青青草| 综合在线观看99| 婷婷伊人五月天| 五月婷婷色影院| 五月天另类小说| 深爱激情网噜噜色| 五月婷婷很很色| 五月综合久久| 五月丁香六月婷婷久久| 91久热| 五月丁香六月色| 婷婷五月天小说网| 无码色色| 五月婷婷丁香综合| 天天影视色综合网| 激情五月,深深爱五月| 日日操夜夜操狠狠操| 色五月天激情| 99热这里都是精品| 久操激情| www.97碰碰com| 五月天久久色| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | www亚洲无码| 久久9热综合| AV操一操| 爱狠射| WWW久久99久久99久久| 91夫妻网站九色| www99精品日韩| 婷婷综合中文字幕| 91人无码久久久久久| 91聚色综合网| 日本波多野结衣视频| 久月久在线视频| 伊人狼人干| 色操综合| 2018夜夜草| 色色六月| 九九激情视频| 综合99久久天天综合| 男人的天堂五月丁香| 色99热| 婷婷五月天久久久| 人人人人人人人人人草| 婷婷在线午夜| 午夜婷婷六月天| 久久少妇视频| 日日夜夜狠狠| 色综合色五月| 国产成人精品一区二三区熟女在线| 这里只有免费的精品| 日韩成人精品一区久久久久| A久网| 五月色亚洲| 亚洲精品国产精品乱码视99| 伊人网碰碰| 色婷婷五月综合| 99精品在线播放| 天天日天天久久青青| 婷婷色色色| 五月丁香综合影院| 99热99网| 五月天色网站| 亚洲人成色A777777在线观看| 99re视频在线播放| 久久综合九九| 热99玖玖99玖玖99九九| 99亚洲精美视频在线观看| 九九久久99精品免费观看www| 99re热精品在线视频| 五月激情视频网| 婷婷五月天黄色小说| 激情人妻综合| 国产婷婷色综合AV蜜臀AV| 日逼影音先锋男人资源站| 婷婷五月天大香蕉| 日本怕怕视频| av免费人人| 思思热国产在线| 一区二区三区视频| 91人在线观看| 九九av在线| 久久无码激情视频| 可以免费看AV网站| 久久五月天婷婷| 香蕉影院色| 六月色激情| 久久丁香五月婷婷激情综合网| 狠狠干思思热| 97人人草| 99ri视频在线观看| 色狠狠五月天| 婷婷色正月| 九九在线精点品| 伊人大香蕉毛片| 狠狠综合| 亚洲热视频在线| 天天干天天爽| 伊人久热91| 久鲁鲁色网| 狠狠色狠狠鲁| 99热6这里只有精品| 色色9 9| 色婷婷综合网站| 五月天激情av| 丁香六月激情综合网| 五月天婷婷爱| 久久婷婷丁香花综合网| 91超碰九色| 开心五月综合| 久久丁香五月天| 人五月天婷婷喷水| 五月丁香综合网色欲| 狠狠干五月天| 日本黄色一级| 五月花综合| 26uuu在线观看| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 色五月婷婷老师| 久久婷婷色综合老司机| 五月丁花色综合网| 九九99免费视频| 91成人看| 日日射天天射| 996er热| 六月婷久久| http://www.sd-xiangsu.com/| 色播播五月天| 另类图片激情五月| 四色五月婷婷在线观看| 天天日夜夜拍| 欧美婷婷日本| 天天摸天天透天天舔| 色色欧美。| 久思思热视频在线观看| 97欧美在线| 91人人爽人人操| 99热这里只有精品23| 大香蕉综合网| 激情爱爱网站超大免费| 五月婷婷综合久久| 精品热青草| ji'qing'luan'ren'lun| 99这里只有精品视频| A1片久久久| 激情六月天婷婷| 日本熟妇乱妇熟色A片蜜桃| 色色色色热热| 久久激情视频| 91超级碰在线视频| 激情综合一| 日本97在线看片| 色狠狠综合| 又大又粗九一在线| 色综合久久88色综合天天人守婷| 夜夜谢天天干| 亚洲人妻av| 久热9| 五月天婷婷久久| 国产免费一区二区三区三州老师F1F1.CC | 99热最新网址| 国产在线6| 欧美性爱五月天| 丁香色色网| 五月婷婷与六月丁香图片激情| 99热全是精品| 丁香婷婷色五月| 九久九精品| 这里只有精品视频在线看| 一级黄在线| 丁香综合伊人AV| 牛色色碰| 99.色| 天天肏在线| 五六月丁香激情视频| 疯狂做受XXXX高潮A片| 亚洲五月综合色播| AⅤ网站在线看| 亚洲AAAA网| 中文字幕视频色婷婷| 丁香五月在线观看综合| 久久国产成人9999久久久久| 人人操人人爱丁香五月| 夜色爱爱亚洲| 久久激情网| 五月天综合久久丁香91| 色欲天天综合网| 91精品91久久久中77777| 久久精品性爱| 色久婷婷网| 亚洲乱码日产精品BD| www.26uuu.com亚洲电影| 中文超碰视在线| 五月色色激情网| 9999热在线观看| 一区二区免费看| www.激情五月天。com| 国产激情综合| 色亚洲色宗合| 婷婷综合久久综合| 五月天婷婷社区| 99碰碰| 天天干天天干天天干| 第四色婷婷五月| 丁香五月玖玖| 狠狠综合网| 蜜臀AV在线成人| 99精品偷自拍| 五月激情婷婷开心| 91 原创 在线 九色| 激情网五月| w婷婷五月婷婷w| 大香人妻| 99色天堂| 情欲综合网| 99热www| 婷婷五月天综合网| 熟女重口味αV| 大香伊人久色| 丁香婷婷色| 色婷婷亚洲精品天天综| 五月婷丁香在线视频在线| 中文字幕91,综合| 激情爱爱网站超大免费| 乱女乱妇熟女熟妇综合网站| 热久综合| 久久久.COM| 丁香六月亚洲| 丁香视频| 五月丁香综合| 美国色五月天婷婷资源站| 9久久婷婷国产综合精品性色| 久久精品99| 婷婷丁香小说| 狠狠大香婷婷爱| 97碰碰免费.视频| 日韩在线99| 久热无码| 九九精品系列| 久久久这里有精品| 夜夜做夜夜愛| 亚洲超碰在线| 69人人操人人爽| 丁香九月婷| site:publishdd.com| 久色激情| 国产成人精品一区二区三区视频| 激情影院丁香五月| 欧美综合丁香网| 99ri精品在线| 久草婷婷网 | 五月婷婷激情综合视频| 91ncom.色| 久久婷婷电影| 五月婷婷开心网| 色婷婷婷婷五月天| 狠狠夜夜五月丁香| 丁香婷婷六月| 另类激情综合| 六九色综合婷婷五月天| 无码G高清天| 久久日九九| 逼特逼在线免费播放| 九九热黄色| 五月丁香婷婷激情视频| 99精品视频在线6| 人人97碰| 国产亚洲成人综合| 午夜少妇在线观看视频| 婷色五月天| 亚洲最大视频| 玖操97| 噜噜色天天开心| 十区AV| 影音先锋男士资源网一区| 日日干天天| 97色色色| www.六月丁香看AV| 中文色婷婷| 99热精品网| 超碰在线caop| 99九九视频| 色欲婷婷五月天丁香| 99青青草| 欧美激情xxxXX| 亚洲无码播放| 玖玖激情网| 三日本无码| 99ER热精品视频| 欧美日韩999| 天天做天天爽| 亚洲操b| 九九热99精品| 77799热| 日韩国产在线免费观看| 久久全意婷婷| 麻豆AV一区二区三区| 国产激情综合五月久久| 六月婷久久| 欧洲亚洲免费视频9| 婷婷丁香五月天色色| 五月婷婷爽爽爽| 五月婷婷色色| 91欧美| 久久婷婷五月综合| 婷婷九月亚洲| www.婷婷五月天| 久久久久er热| 丁香久久| 天天干天天爽天天操| 99热日本| 丁香五月天人体| 亚色网站小视频| www.主妇. com| 精品久热| 丁香五月天激情四射网| 婷婷五月中文字幕| 激情五月天婷婷色色色色色色色色色色色| 色色五月婷婷网| 久草热久草在线视频| 国产精品18久久久| 99热思思| 99色在线| 五月天婷婷丁香| 国产成人网址| 国产超碰在线| 三男玩一女三A片| 国产国产乱老熟女视频网站97| 99九九久久| 色噜噜狠狠色综合日日| 五月婷婷激情综合| 天天色情站| 无码日本精品XXXXXXXXX | 九九在线视频| 免费视频WWW在线观看网站| 天堂成人A片永久免费网站| 性爱久久| 一本大道熟女人妻中文字幕在线| 欧美精品XXXXBBBB| 久久综合五月天激情小说网站 | 91操人| 色欲一区二区三区精品A片| 丁香五月天堂| 激情五月天视频| 亚洲乱码日产精品BD| 国产69精品久久久久999小说| 欧类av怡春院| 国产精品人成A片一区二区| 日本一級黃色一級片| 丁香五月激情图片婷婷| 大香蕉福利导航| 婷婷五月天AV在| 婷婷九月狠狠色| 色婷婷六月天| 亚洲欧洲99| 激情五月天色爱| 深爱五月网| 99国产精品久久久久久久久久久| 久久色亭亭五月天| 超碰激情网| 天天爽天天| 色综合久久之分久久| 久热精彩视频98| 婷婷五月综合色中文字幕| 亚欧州精品视频| 国产99美少妇| 天天五月情| 天天天在线观看| 丁香五月香蕉| 嫩草AV久久伊人妇女超级A| 色色亚洲99com| 五月丁香人妻| 99色热| 五月婷婷丁香色播网| 丁香五月社区| 久久九九免费视频| 婷婷五月天激情基地| 99在线免费视频| 91丨九色丨熟女高潮| 九九草草逼| 9|无码久久久久久| 伊人婷婷激情| 丁香五月成人社区| 天天插天天日| 20253AV| 丁香婷婷五月六月久久| 激情小说五月天| 99视频精品8| 五月天激情国产综合婷婷婷| 丁香五月伊人| 黄色短视频在线观看| 亚洲综合色色| 亚洲人妻一区二区| 99热亚洲| 亚洲九N| 色综合狠狠色| 亚洲sesesese| 深爱激清网| 91精品91久久久中77777| www,黄色在线,con| 琪琪色五月天| 色五月激情综合| 婷婷五月综合色拍| AV片一区在线观看| 欧美色色干| 激情五月丁香色婷婷| 丁香五月网在线观看| 91热爆在线| 久久ri精品| 亚洲无码另类| 丁香六月色婷婷| 久久综合五月天| 综合激情四射一theav| 五月丁香综合网色欲| 天天精品视频免费观看| 五月丁香啪啪网| 九九99热| 五月天婷婷影院影院| 九九热视频99| 美女视频图片久久91| 色五月天.con| 五月婷婷真爱激情网| 91久久1118| 色婷婷色和| 99小精品| 五月丁香花视频| 久久久久久久,99精品视频| 99re热精品视频国| 99视频这里有精品| 99精日本久久| 丁香五月天欧洲在线| 色婷婷五月天久久| 91碰人人| 丁香五月天偷拍| 久久综合中文字幕| 奇米影视在线视频| 丁香桃色综合网| 综合色色网| 9久久AV| 日日夜夜天天爽| 丁香五月激情婷婷| 99久热在线精品| 久久怕怕视频| 日韩青青| 五月婷色丁香| 日本三级日本黄色| 久久五月丁香| 99视频在线啪| 亚洲色vA| 国产亚洲成AV人片在线观黄桃| 在线观看的av| 狠狠干综合| 无码字幕中文| 无码天天操| 婷香五月激情视频| 大香蕉综合在线| 精品成人在线观看| 九月色婷婷综合| 5月婷婷6月六月丁香| 婷婷在线日韩综合| www激情网| 国产毛片精品一区二区色欲黄A片| 97自拍视频在线| 97人人看| 九九人人自拍| 国产97色在线 | 日韩| 九九中文字幕九| 婷婷丁香色情五月天| 果冻传媒A片一二三区| 五月永久激情| 国产亚洲精品久久久久久郑州| 久久婷婷成人视频| 五月天综合婷婷| 超碰二区| 91黄址| 婷婷五月天综合久久| 天天艹夜夜艹| 4399高清无码视频| 中文av网| 色婷婷精| 丁香婷婷色五月| 色综合婷婷99| 5月丁香啪啪啪| 99精品久久久久久久久| 久久这里有精品视频在线免费观看| 婷婷五月丁香青青草在线| 思思99热这里只有精品6| 成人亚洲精品久久久久 | 很很操96| 欧美日韩99| 天干干夜夜操| 屁股翘好撅高迎合跪趴| 六月香五月婷| 亚洲综合五月天婷婷| 国产在线另类五月婷婷| 桃色五月婷婷| 婷婷五月成人系列| 9久热在线视频| 激情美女五月天激情在线| 影音 五月 婷婷 久久| 丁香六月天婷婷开心综合| 性爱激情综合网| 这里只有精品视频一区| 草榴视频黄色网| 中文AV网| 婷婷五月色色| 97干欧美| 六月丁香视频网站| 国产精品扒开腿做爽爽爽A片唱戏| 狠狠爱婷婷爱| 黄色片区子| 久久9久| 91狠狠色| 亚洲九九夜夜| 夜夜夜夜做天天天做无码视频| 久热婷婷综合| 五月激情天天干| 26uuu偷拍亚洲欧洲综合| 女同激情久久av久久| 久久机热这里只有精品免费视频| 婷婷五月天久久久| 美女亚洲五月丁香| AA片在线观看视频在线播放| 婷婷娱乐丁香综合网| 草了bav视频在线观看| 99热在线观看亚洲区| 色色九区| 色五月六月| 深爱婷婷色| 一区操| www.色99| 狠狠色性| 九月av在线| 丁香六月啪| 丁香桃色综合网| 九九九九九九九九九九九九九国产精品| 色婷婷精品视频| 九九人妻福利| 婷婷色五月大香蕉在线| 人人干人人看| 草综合网| 亚洲五月六月婷婷| 五月丁香做爱视频| 人人性久久| 日韩成人精品中文字幕| 五月婷婷综合在线观看| 欧美激情综合色综合啪啪五月| 九九色色| 99久久极情精品一区| 丁香激情久久| 婷婷五月丁香亚洲| 国产avapp 网| 日韩五月天婷婷| 婷婷五月综合啪| 91狠狠综合久久久| 国产综合网在线| 9久久精品| 超碰免费观看| 操99| 色国产五月| 色色综合激情| 99精品无码| www.天天干| 五月婷婷激情四季| 婷婷中文字幕在线| 色婷婷久久| 激情六月日韩| 操操操www.com| 一区操| 狠狠色色| 九九这里有精品| 婷婷六月综合在线| 大香蕉人人人| 禁欲电影完整版在线播放| 人妻视频在线| 五月婷婷免费| 五月天婷婷影院| 亚洲久久天堂| 五月天成人综合| 五月亭亭性| 淫视馆aV二区一区| 午夜免费高清AV片| 色综合久| 免费AV在线| 国产精品久久久60086| 综合网色| 九色porny在线观看激情四射| 97色碰| 丁香五月成人婷婷| 另类国产综合| 99综合色色色| 在线观看亚洲AV| 老司机视频lsj爱就色| 狠狠色综合网| 99在线视频精品| 婷婷五月天亚洲综合| 色综合九九色综合88| 日日操夜夜操中国无码| 日本99热| 超碰人人干| 婷婷深爱五月丁香| 五月丁香六月婷婷玖玖| 五月开心婷婷极品激情| 激情文学第四色婷婷丁香五月| 99超碰欧美| 最近中文字幕2019视频1|