免费国产精品自在自线-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
返回資訊列表
婷婷九月激情网| 婷婷五月六月| 天天色天天日天天舔| 思思热久热| 激情九月综合| 国产高潮白浆一区二区| 色天天综合色| 成人片在线播放| 日本婷婷色| 天天综合网色欲香| 国内一级精品| 日日夜夜天天综合| 97色射| 亚洲成人免费在线| 色五月丁香婷婷| www.99热在线| 日本色99| 99久久久99久久91熟女| 色久丁香五| 五月天激情网站| 色色色地址| av中文网站| 中文字幕乱码亚洲精品一区| av中文网| 97人人操| 国产9色在线/日韩| 99视频精品| 特黄三级片| 五月婷婷色播| 久久婷五月| 色婷婷影视| 超碰人妻在线| 色五月综合激情| 天天肏视频| 色五月婷婷中文字幕在线观看| 亚洲五月婷婷| Se.婷婷五月天| 国外亚洲成AV人片在线观看| www.色色色色| 超碰三级片| 美女五月天| 五月激情婷婷图片基地| 操逼五月婷婷| 亚洲网站999| www色五月| 亚洲啪视频| 激情五月,色五月| 久久久99精品免费观看| 碰97久久| 天天噜噜| 五月丁香激情婷婷综合| 成人午夜无码视频| 999九九九久久久99HD| 婷婷丁香五月激情| 久久伊人日日夜夜| 91色色色| 超碰在线精品| ...婷婷五月综合不卡,国产在线手机| 99久久五月婷婷| 九九大香视频| 精品香蕉99久久久久网站| 日本婷婷丁香五月| 久久五月视频| 1024手机在线观看看片_日韩精品| 五月丁香在线| 精品一二三区久久AAA片| 亚洲性爱电影| 久久五月天婷婷| 婷婷五月天在线综合导航| 色操综合| 果冻传媒A片一二三区| 久久99视频| 狠狠爱五月婷婷| 色婷婷亚洲精品天天综| 婷婷丁香五月亚洲| 婷婷香五月| 99热免费精品| 色五月天丁香婷婷| av在线免费播放| 538午夜激情| 日韩成人中文字幕| 婷婷九月| site:hcxsz888.com| 亚洲色综合| site:xmssd.com| 色五月xxx| 日韩人妻无码专区| 丁香六月婷月91婷月| 九九视频网| 五月婷婷六月丁香综合视频在线| 五月天国产成人| 婷婷99中文字幕| 五月天大香蕉| 中文字幕色色色| 天天干com| 狠狠人妻久久久久久综合丁香| 五月天成人在线播放丁香| 国产精品视频久久99| 99思思热只有在这里看| 色五月激情网| 婷婷福利影院| 综合久久五月| 久久久com| 国产,欧美,学生妹,视频| 九九九九这里只有精品| 99精日本久久| 九九综合精品| 日日做天天操夜夜爽| 天天色天天| 碰碰91| 中文字幕免费高清电视剧| 激情超碰网| 久热黄色| 久久99婷婷| 丁香五月天天久久综合小说| 色色色99| 亚洲精品大片| 久久久婷婷色五月资源网| 日韩狠狠色| 六月婷婷私欲| 99色在线观看| 大香蕉五月丁香| 五月青青草综合| 狠狠香蕉| 色9月| 久热A| 五月丁香婷婷成人网| 人人操女人| 四五月婷婷| 亚洲啪视频| 丁香五月婷综合| 五月天婷婷开心| 激情五月天婷婷五月天| 96丁香六月婷婷蜜桃综合久久| 六月婷婷在线| 日本久久9| 天天色宗合| 综合超碰熟| 欧美日韩成人高清在线| 激情性爱网站| 久久与婷婷| 91热久| 色色色色色网站| 色综色网| 综合图片色色| 超碰在线国产| 男人先锋久久| 5月丁香六月婷婷| 久久五月天激情| 亚洲精品五月| www.91.com黄| 五月丁香影视| 精品国产va久久久| 久久性刺激| 91Chinese在线| 亚洲精| 日韩中出视频| 超碰久热| 九九在线这里只有精品视频 | 久久久中文| 亚洲婷婷五月天综合| 无码人妻丰满熟妇奶水区码| 激情综合色婷婷啪啪六月天| 六月婷五月丁香| se婷97| 成人版视频在线观看| 无码一区二区日韩| 青996青| A片女女女女女女BBBB| 色婷婷五月天在线观看| 欧美成人五月天| 日日天天天| 另类丁香综合| 婷婷大香焦| 五月丁香亚洲综合| 99九九视频| 天天射影视综合网| 激情五月婷黄版| Av狠狠色丁香婷| 亚洲五月天激情| 超碰在线人人| 婷婷九月狠狠色| 亚洲色色色色色| 成 人 色 色| 丝袜激情网| 97欧美在线| 九九热最新| 久久538| 五月丁香亭亭| 色五月婷婷av| 欧美日韩99| 五月天成人综合| 色婷婷久久久| 999热在线视频| 色色五月天丁香婷婷| 五月丁香激情欧洲啪啪| 色丁香久久久| 五月丁香激情在线| 亚洲丁香五月| 欧美超级视频97| 色人久久| 日韩黄在免| 国内精品免费一区二区2009| 久草五月婷| 99久在线精品99re8热| 538午夜激情| 亚洲看av的网站| 免费视频99| 日本片日本片祼观看网站在线看中文版网页在线看| 五月天成人小说| 天天色中文字幕女优AV| 五月丁香婷婷久久| 99热这里只有在线| 中文字幕在线日亚洲9| 91在线观看九区| 欧美日综合| 日韩一区二区A片免费观看| 婷婷成人av| 五月天激情国产综合婷婷婷就去爱 | 久婷| 免费观看的婷婷五月视频在线| 婷婷丁香五月天在线视频| 99自拍网| 六月色激情| 色五月偷偷| 丁香五月婷婷综合激情哟哟哟| 丁香六月婷婷综合啪啪| 色婷婷最爱五月| 无码AV免费精品一区二区三区| 99超碰在线观看| 久久久婷丁香五月| 夜夜爱爱亚洲| 伊人婷婷综合| 偷偷操99| 五月丁香色| 免费观看高清无码| 婷婷丁香基地在线| 九九碰九九爱97超碰| 超碰免费大香蕉| 思思热AV| 干一干xxxx| 丁香五月激情在线| ZpRSw| 色色色色色色色色五月先| 日本在线观看aaa 99| 精品女人九九九| 777.色色| 欧洲不卡视频| 色色射| 人色五月天婷婷| 97热九九| 婷色综合| 99热精品免费| 怡春院久操| 久久草中文日韩欧美| 丁香六月婷婷久久高清| 99精品综合| 天天舔夜夜操www com| 日韩色色色色| 丁香六月激情| 婷婷啪啪| 99热在线观看| 九九re精品视频在线观看| 91日韩美女被插视频| 99ER热精品视频| 91丨九色丨丰满人妖| 伊人久久大香网| 婷婷久久色| 91超级碰在线视频| 97人妻碰碰碰久久香蕉| 久久久婷婷| 国产午夜精品一区二区三区四区| 免费播放99性爱视频| 久操激情| 大香蕉九九| 5月丁香综合图区| 天天色粽合合合合合合合| 丁香五月综合高清在线| 五月婷婷六月丁香免费| 五月伊人91| 五月丁香婷中文| 亚洲五月停停| 婷婷免费精品视频| 婷婷激情五月天天天开心| 77777亚洲午夜久久| 亚洲一区二区 成人网站戴套| 99在线精品免费视频| 激情综合五月婷婷丁香| 亚洲性爱干干| 夜夜爱伊人| 久久草大香蕉| 亚洲精品性色| 激情五月天啪啪视频| 色婷婷视频| 超碰超碰在线| www婷婷| 久久久www| 国产成人高清| 色五月婷婷AV| 亚洲久久视频| 丁香蜜臀黄色婷婷五月天| 丁香六月天AV| 婷婷色激情网| 中文在线视频久1| pom538精品视频| 色播五月丁香| 狠狠色噜噜色狠狠狠综合色 | 亚洲小视频| 色五月在线播放| 丁香久久| 91制片厂久久久国产电影| 丁香五月最新网址| 狠狠色噜噜狠狠色噜噜噜999| 天天干天天干天天干天天干天天干天天| 91蜜桃婷婷狠狠久久综合9色| 久热一区| 国产色色色色色| 影音先锋五月婷婷| 99久久久| 色五月色图| 天天爱天天操| 欧美槡BBBB槡BBB少妇| http:色情日本com| 激情久久网 | 狠狠干狠狠色| 伍月婷婷免费视频| 欧美爆乳一区二区三区| 大香蕉久久伊人婷婷五月丁香| 思思热久热| 婷婷激情五月色综合| 婷婷五月草| 人碰人人人玩91| 人人操Av| 五月天停婷基地| 五月天色不卡| 91人妻九色大屁股| 久青操| 久久精彩视频| 久久作爱| 国产成人av在线播放| 伊人色五月| 色色色色综合| 欧美韩国日本| 婷婷丁香五月麻豆| 久久人人九| 六月亚洲| 大香伊人婷婷影院| 成人噜噜网| 99热这里只有精品99| 偷拍99在线视频观看| 日韩激情婷婷五月天| 国产 码在线成人网站| peg 2区三区四区的| 日本婷婷| 激情五月伊人婷婷| 国产成人网站在线观看| 色婷婷精品视频在线播放| www激情五月天| 最新亚洲色色网| 99热只有这里有精品| 另类视在线| 六月激情综合| 日本在线视频手机播放五月婷| 色播五月天激情| 久久久久9久无码视频| 情婷婷五月天| 99免费综合网| 狼人久草| 五月天婷婷香蕉狠狠超碰综合| 爱婷婷五月| 成人av在线网站| 亚洲人妻AV| 99热老网站| 色偷偷五月天| 丁香五月激情天AV无码| www婷婷| 噜噜噜精品欧美成人在线观看| 久久五月情| 色噜噜狠噜噜视频| 欧美英丁香开心快乐六月天网| www狠狠爱com| 在线18av | 噜噜噜噜在线| 26uuu国产色| 极品少妇高潮啪啪AV无码| 一本色道久久综合狠狠躁小说| 另类视屏| 天天综合精品| 99re这里只有精品在线观看| 丁香深五月婷婷| 九九色欲网| 99精品在这里| 五月婷婷色情| 丁香九月婷婷综合| 五月天色五月| 国产无套精品一区二区| 婷婷六月视频| 9久国产| 啪啪日本欧美| 丁香五月天黄色片| 久热黄色| 这里只有精品在线观看视频| 欧美交换配乱吟粗大25P| 午夜激情久久| 欧美色欲色欲天天天www| 色婷婷激情五月天| se婷97| 9|人妻人人操| 亚洲无码性爱| 91操女| 97在线视频 欧美| 91免费啪视频| 久久人妻伦理| 日婷婷久久开心| 色情五月婷婷| 天天色99| 色色五月婷婷| 99热超碰| 1级欧美日韩| 综合激情九月婷婷,激情综合婷婷中文字| 色99久草在线| 热久69| 婷婷午夜精品久久久| 淫视馆aV二区一区| 五月久久噜噜| 久久久精品色色色| 婷婷操超碰| 国产67194| 五月综合人妻| 精品九九网| 五月婷在线| 色高清无码视频| 五月天婷婷爱| 久久久www| 久久人妻超碰一区| 日韩日比视频| 婷婷五月丁香成人| 久久婷婷成人| 丁香五月天AV在线| 婷婷精品| 亚洲色网址| 人妻激情久久| 婷婷五月色| 51国精产品自偷自偷综合| 97超美国视频在线观看| 99噜噜噜| 开心五月婷| 天天色播| 99久在线观看| 狠狠xx| 97在线精品| 五月丁香激情综合啪啪| 天天干天天 亚洲| 五月丁香香蕉| 五月婷六月丁香| 99热啪啪| AV成人在线播放| 五月天久久网站| 风流少妇A片一区二区蜜桃| 婷婷内射视频在线| 五月天色丁香| 97婷婷五月| 这里只有精品视频看看| 婷婷丁香熟妇综合网| 久久久99日本大片| 综合久久99| 婷婷五月天渟渟| 九九热这里只有国产精品| 狠狠干综合| www.色婷婷| 97人人操人人干| 亚欧州精品视频| 丁香五月六月婷婷综合| 欧美精品狠狠色丁香婷婷| 99热综合在线观看| 日产精品久久久久久久蜜臀| 色五月丁香激情视频| 大香蕉婷婷| 激情合网婷婷| 国洲夜色亚热在线久久| 丁香五月婷婷天| 996热re视频在线观看视频| 能直接看的av网站| 97色欧美| 亚洲视频五区| 色色吧综合| 丁香色六月婷婷| 琪琪色影音先锋| 色五月天丁香婷婷| 丁香五月婷婷亚洲激情四射| 26uuu四色| 九九热av| 色婷婷五月天亚洲| 五月天激情四射| 97丁香花五月天激情小说| 99这里都是精品6| 91精品久久久久久77777| 色综合久久天天综合网| 婷婷五月激情综合| 91干| 99爱视频在线| 秋霞影音91人妻久久| 亚洲Av成人在线观看| 天天肏屄夜夜爽| 久久五月丁香综合| 色婷婷av在线观看| 狠狠操狠狠做| 丁香五月激情宗合| 激情五月天第四色| 激情小说五月天| 天天插综合| 婷婷 久综合| 久久久精品99亚洲综合| www.久热| WWW.开心五月天.COM| 九九婷婷激情综合网| 中文字幕乱码亚洲精品一区| 亚洲第一综合| 婷婷激情久久| 99久在线精品99re5热视频| 久大香蕉| 九九九九九无码| 婷婷综合五月色播| 婷婷色爱| 久久久精品AV| 亚洲婷婷丁香五月天激情小说| 色色色欧美| 97久久人人| 日韩成人中文| 天天搞夜夜六| 国产99精品免费视频| 91丨九色丨熟女丰满| 久热91| 丁香五月婷婷高清| 婷婷五月天亚洲天堂| www99在线观看视频| 九月丁香久久网| 五月婷婷色| 欧美黄色韩日网| 成人做爰A片免费看视频| 大香蕉九九热| 日日操夜夜骑| 九九九干精品| 五月天婷婷丁香视频| 色综合色色| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 中文精品在| 99er精品视频| 99A片| 嫩草综合网| 大香蕉av在线| 激情床戏| 丁香五月色激情| 天天日日人| 97综合在线| 六月婷基地| 99视频网| 久久99网| 天天狠狠夜夜狠狠2023| AⅤ在线播放网| 99热只有国产在线精品| 少妇水多A片太爽了| 激情宗合哪里能看| 五月婷婷激情综合| 蜜臀av无码久久久久久久久 | 成人va在线| 色综合综合网| 色婷婷AV在线观看| 伊人啪啪网| 天堂va久久久噜噜噜久久Va| 丁香五月婷婷骚视屏| 久久九久久| 婷婷亚洲在线| 九月婷婷综合在线| 另类小说色婷婷| 99五月婷| 亚州操人在线视频| 精品国产人人爱人人| 久久xx| 综合狠狠干| 激情婷婷丁香五月| 欧美一级操逼视频| 久超超碰| 久99| 巴基斯坦粉嫩无码视频| 成人片在线免费看| 久久9精品| 久久大香蕉| 久久久久9999| 欧美激情凹凸丁香网| 亚洲影院婷婷色| 久热精彩视频98| 99热无码首页| 亚洲网视屏| 激情五月丁香五月| 五月婷婷我| 少妇婷婷五月天| 51XX午夜影福利| eeuss人妻| 人妻丰满精品一区二区A片| 日本五月视频| 色婷婷亚洲| 乱精品一区字幕二区| 五月综合缴情网| 欧美VA视频| 五月天色丁香| 五月丁香六月香综合激情| 久99精品视频| 大香蕉手机视频| 大地资源色婷婷视频在线| 99玖玖人人| 99热只有这里有精品| 狠狠操.COM| 午夜婷婷久久 | 狠狠狠婷婷五月综合| 我淫我色婷婷五月天激情四射| 激情五月久久| 丁香五月天在线直播观看| 人人草碰| 亚洲综合五月天婷婷丁香| 日日舔夜夜操| 六月婷婷之青青草| 丁香五月综合首页| 99re思思热在线视频| 丁香五月婷婷图片综合| 色婷婷香蕉| 五月丁香激情婷婷综合| 婷婷99| 日笨久久网| 99精品无码| 国精产品一区一区三区有限公司杨 | 欧洲婷婷五月天| 五月天AV大香蕉| 免费观看的av| 久久性操| 丁香六月婷婷综合欧美| 五月婷免费视频久久久| 日本久热| 久操人| 综合色色五月| 久久99视频| 婷婷五月激情的图片| 九九热视频免费的| 天天免费成年人视频| 激情四射婷婷| 五月丁香婷婷啪啪综合| 五月天啪啪网| 亚洲精品无码99热| 九九碰九九爱97超碰| 激情五月天啪啪| 久久视频这里99| 襙比视频| 婷五月丁香| 五月婷婷色| 五月天国产婷婷精品视频在线| 开心久久爱五月天| 国庆精品久久| 无码地址| 人人草成人视频| 亚洲综合成人网| 骚五月婷婷| 综合日本婷婷| 五月婷久久综合| 色婷丁香91| 亚洲精品久久久久久久久久飞鱼 | 婷婷九月狠狠色| 秋霞少妇毛片| 婷婷久久婷婷| www.com.色色| 日熟女| 五月天婷综合| 狠狠爱婷婷| 99啪99| 91九色熟女| 日韩超碰在线| 五月婷网| 婷婷丁香人妻天久久| 97干在线视频| 五月综合亚洲色| 丁香六月天AV| 五月社区丁香| 五月婷婷六月基地| 丁香五月综合AV在线| 天天爽天天爽视频| 亚洲无码99| 日韩精品一品二区三区的使用体验| 久久久久人妻精品| 9视频1在线| 久久sp免费视频| …亚洲黄色在线播放日韩、av中文a…| 九九色院| 午夜色色色极品视频| 思思99精品视频在线观看| 丁香六月视频| 日本操逼九九九九58日本操逼| 亚洲热久久| www.yw色| 操操碰| 日韩丁香涩| 亲子乱av一区二区三区的| 金品在线视频99| 九九黄色网| 色情五月天首页| 五月丁香六月婷婷亚洲综合| 色欲婷婷五月天丁香| 日本五月婷婷| 激情综合色婷婷啪啪五月天| 大香AV| 99婷婷五月天| 天天干com| 青青草轻轻操| 精品久久久久成人码免费动漫| 色综合网页| 99超级碰碰| 可以免费看av网站| 婷婷久久亚洲| 亚洲操B| 69久久久| 久久婷婷成人视频| 九九九九这里只有精品| 曰曰久久| 97色色色色色色色色色色色色色| 婷婷久久色| 久久性爱视频| 亚州激情九月| 婷婷六月丁香激情综合| 99热免费| 2018夜夜草| 中美日韩成人在线| 99热亚洲精品66| 中文字幕成人| 久热9热| 高清激情av在线观看| 婷婷久久色| 成人做爰A片免费看视频| 亚州综合色| 九九成人精品| 婷婷五月天色色| 色婷大香蕉| 国产五月丁香在线| AV网站免费在线| 91男人资源站| 激情婷婷人妻| 超碰免费在线| 色在线99| 日日夜夜婷婷| 五月婷A V在线| 人妻久久久久久久久妻久久久久久久久 | 婷婷丁香社区网| 激情综合激情综合| 69天堂99| 另类丁香五月天区图| 色情婷| 欧美综合五月丁香五月天| 久久丁香五月| 超碰97人人操| 久re热视频| 六月丁香开心婷婷欧美| 操丝袜视频影院导航| 色香蕉影院| 五月婷婷色色| 无码啪啪| 国产97色在线 | 日韩| 成人性爱无码| 香蕉影院色| 色情丁香五月天| 99热| 日韩色色小视频| 日日夜夜婷婷| 国产99久久久| 中文字幕成人| 操97| 俺去也五月| 亚洲精品亚洲人成人网| 色色色色色色色色五月先| 久9久成人精品视频| 99久在线精品99re8热| 狠狠色综合久久久久| www.minyis.com【JT】币址百万U预算可预付QQ2101460746 | 天天肏天天肏天天肏| 日韩五月婷婷| 色色色99| 色玖玖导航| 色私五月婷婷| 99婷婷国产最新视频| 1区2区视频| 五月色色激情网| 激情国产五月| 丁香五月综合在线观看| 99啪视频在线观看| 中文av网站| 国产成人AV在线播放| 日韩欧美成人片| 五月丁香精品| 亚洲九区| 天天摸天天高潮天天爽| 久热精品9999| 六月丁丁香| 五月婷婷狠狠干| 久久激情网| 亚洲综合丁香五月| 99re资源在线视频导航| 99久在线精品99re8热| 色婷六月| 国产成人网站在线观看| 色久五月| 国产伊人大香蕉| 91人人操人人爱| 亚洲色色色色色| 丁香狠狠干| 这里只有精品视频免费在线观看| 精品久久久999| 婷婷久久五月天| 五月婷婷丁香色播网| 五月天婷婷丁香花| 26UUU欧美| 啪啪激情网站| 啪色综合| 国产成人精品一区二区三区视频| 99爱无码| 色色吧综合| 亚洲精品a成人在线播放| 婷婷深爱五月| 丁香婷婷激情综合五月激情 | 丁香五月中文字幕久色| 人妻激情网| 丁香桃色网| 久久深爱激情网| 9久久婷婷国产综合精品性色| 91丨九色丨大屁股| 婷婷五月天偷拍| 亚洲最大在线| 老师高潮流白浆喷水的A片| 国产精品电影网| 五月丁六月香av| 波多野结衣AV无码Porn| 一本道在线电影| 五月丁香色婷婷色| 天天橾日日橾夜夜橾17| 丁香五月激情啪| 亚洲综合网在线| 久色网址| 日日综合网| 婷婷美女精品视频| 伊人久久大香蕉网| 婷婷五月天 丁香五月天 裸体| av色婷婷| 久久九九热视频| 啪啪婷婷五月天激情| 日韩操逼大片| 久草 tingting| 欧美色色色| 亚洲激情综| 久狠日av| 四五月婷婷| 亚洲高清在线| 无码动漫av| 婷婷亚洲在线| 青青青在线视频国产| 日韩色五月| 人妻自慰高清合集| www.sd-xiangsu.cpm| 97香蕉久久超级碰碰高清版 | 蜜桃成语时李时珍 免费| 在线网黄| 日本高清综合网五月丁香| 草婷婷在线| 91丨九色丨国产打屁股| 亚洲va国产va天堂va综合va| 操熟女成人网| 成人AV在线网站| sS丁香五月婷婷| 狠狠色综合网| 久久电影4399| 久久精品99久久久久久久久| 丁香五月停停av| 丁香网五月天| 国产精品久久久久久久久久免费| 99激情视频| 久久久久婷婷| 9久久久久久久久久久| 26uuu成人网| 婷婷播5月| 草逼大片| 五月丁香六月综合基地| 99热成人在线| 999热成人在线综合网| 五月天婷爱综合| 欧美噜一噜| 久久99热 这里有精品| 色婷婷激情小说网| 婷婷久久国产视频| 五月激情网五月综合网| 婷婷另类开心| 丁香五月天婷婷久久| 丁香月五月天婷婷久久| 九月婷婷综合八月丁香在线观看| 色情五月丁香婷婷网| wwW天天干| 亚洲久久视频| 六月婷婷网站| 夜夜操天天爽| 久久99热这里只有精品| 另类小说五月天| 91色逼| 97人人干| 99精品在线| 五月天小说激情| www.日本久久videos| 韩国真做片在线观看| 激情五月天色色| 久久刺激网| 色玖玖玖| 久久99视频| 丁香亭亭久久| 丁香亚洲婷婷五月| 五月天艹天天| 天天天干夜夜夜操| 久99综合婷婷| 色色色综合网| 日韩av变天就操逼不卡区| 激情 久久 婷婷| 日本99婷婷| 人人干99| 99热在线99| 开心五月天激情| 激情五月天婷婷在线网址发给我| 99热亚洲| 任你草| 九九热9| 五月天久久网站| 人妻中文在线| 伊人婷婷色激情丁香| www,天天干| 99色在线| 丁香五月天堂婷婷| 久久久久激情网| 五月丁香爱婷婷深深| 99免费视频精品| 九九热在线视频| 激情小说婷婷| 草榴视频黄色网| 九九九日本熟女| 婷婷五月精品在线| 五月丁香啪| 五月天社区| 五月丁香六月婷婷综合| 天天色天天搡| 六月丁香影院| 色五月丁香网| 91九九热| 久久五月六月| 婷五月天| 99精品国产乱码久久久人妻| 中文在线成人| 丁香婷婷人妻综合网| 久久538| 亚洲综合99| 丁香9月婷婷| 色婷婷婷av| 色欲色香综合网| 亚洲色五月| 99热久| 狠狠狠狠狠狠| 色玖玖玖| 色性日本| 99在线精品视频| 操久久精| 人人做天天爱| 另类图片五月天| 色九月国产| 六月狠狠综合| 91碰碰| 超碰人人艹| 五月天色社区| 亚洲色无码A片一区二区麻豆| 四虎成人精品永久免费AV九九| 夜夜撸日日骑| 国产亚洲精品久久久久久郑州 | 久久视频这里都是精品| 99热精品在线| 热99色| 五月天婷婷青青| 99亚洲精品视频| 国产激情在线| 五月婷婷中文字幕| 丁香五月天天久久综合小说| 久久五月天合网| 成人AV在线网站| av无码电影| 99无码黄色视频| 人人操9| 五月婷婷免费| 国产婷婷色综合AV蜜臀AV| 午夜免费试看| 任你爽精品免费视频6| 久久婷婷五月激情综合| 人人爽亚洲| 任你躁XXXXX麻豆精品| 六月婷婷无码| 五月天综合久久| 7月婷婷六月丁香| 伊人久久五月天| 久久婷婷网| 99久久玖玖| 久久免费丁香| 亚洲乱码w在线观看| 激情五月婷黄版| 99热在线播放| 四月婷婷五月丁香| 超碰99热精品| 久99久精品| 丁香六月啪啪啪| 亚洲综合视频网| 人妻久热| 九九九九国产| 中文激情网| 婷婷开心深爱五月天| 欧美天天搞| 久热 91| www.色综合| 丁香六月欧美| 久热这里只有精品在线观看 | 亚洲综合久| 色99视频| 日本婷婷网| 三级黄色大片视频| 五月色俺婷婷| 亚洲国产色婷婷| 婷婷综合五月| 婷婷天堂综合| 色欲天天综合网| 69婷婷丁香午夜| 情色五月天 网站| 99视频在线| 另类亚洲2| 91狠狠综合久久| 丁香五月天av| 大香蕉人人网| 亚洲综合色婷婷| 开心五月激情| 97超级碰| 991精品在线视频| 开心五月六月婷婷| 9精品久久999| 人人摸人人摸| 中文字幕在线观看视频www| 五月丁香啪啪| 丁香五月开心五月激情| 日韩淑女人妻luan伦激情精品一区二| 综合激情在线| 天天摸天天爽| 密视AV综合在线| 99热都是精品| 夜夜夜夜操| 丁香五月激情月| 婷婷五月在线观看| 天天做天天爱天天玩夜夜爽| 五月婷婷丁香啪啪| 久久久久婷婷| 啄木鸟丝袜美女福利视频| 亚洲综合无码| 少妇人妻人伦A片| 欧美丁香五月夫妻天| 99热免费精品热久久66| 色色色色色日韩午夜激情| 色五月天丁香| 亚洲国产色色| 99热这里在线精品| 亚洲99一级无嗎特制在线| 婷婷色导航| 精品草原久久视频| 亚洲综合在线伊人婷| 五月天婷婷Av| 婷婷五月天激情网| 五月综合激情啪啪啪啪啪| 丁香九月综合激情| 久久这里只有精品无码| 九九干视频| 亚洲网在线观看| 色色五月天激情| 欧美VA在线| 热热久久精品视频| 国产精品美女| 亚洲av另类在线观看| 婷婷五月激情五月激情| 99热这里全是精品| 少妇丁香婷婷| 五月婷激情影院| 亚洲操女| 欧美久热| 99久久婷| 婷婷开心激情| 五月天激情网址| 色情综合| 草草影院爱爱| 两性婷婷丁香五月| 九九久久精品| 高清不卡一区| 婷婷天天日婷婷| 五月花婷婷最新| 激情五月天婷婷激情| 97欧美在线| 97操碰在线97| 99人妻碰碰久久久禁片| 色色日本| 久久精品婷婷| 91se在线观看| 五月婷六月| 九九热精品视频九九| 午夜 外网 精品 在线| 另类在线| 九九色色网| 99精品国产在热久久婷婷| 香蕉99网| 激情五月婷婷综合网| 免费观看18视频网站| 久久丁香五月| 激情四射五月天| 日本九九视频| 99激情| 五月天婷婷社区| 深爱激情六月天| 99九九精品视频| 天天成人综合视频| 六月婷婷私欲| 五月天四色房丁香| 逼逼AV| 天天操九九插| 五月天色婷婷小说| 亚洲欧洲自拍图片专区五月天| 综合在线网| 亚洲成人色五月婷婷综合| 狠狠色丁香久久久婷| 婷婷五月天AV| 久久xx| 色婷婷五月天激情| 丁香五月花婷婷开心| 日日日,com| www.sd-xiangsu.cpm| aaaaaa片| 秋霞电影理论| 天天天日天天天干| 熟惀91九色在线| 欧美日韩精品人妻狠狠躁免费视频| 无码AV免费精品一区二区三区 | 久久3p| 丁香六月色婷婷| 99re热精品在线视频| 激情小说婷婷小说| 五月婷庭丁香在线| 色噜综| 五月天激情小说欧美激情| 欧美性爱五月天| 婷婷射丁香| 99色色网| 日本精品人妻无码77777| 五月天久久婷| 五月丁香婷婷激情四射迷人| 五月婷婷丁香啪啪| 超碰成人免费| 五月丁香999| 亚洲aV写真天天综合网久久| 日韩色色视频| 色色综合网站| 少妇AB又爽又紧无码网站| 九九九激情网| www.99热这里精品 | 9有码中文| 激情六月婷婷| 午夜伊人大香蕉| 五月婷婷六月丁香首页| 亚洲精品视频在线播放| 婷婷丁香五月视频| 丁香五月欧美激情| 丁香九月综合| 无码日本精品XXXXXXXXX| 亚洲免费成人电影AV| 国产激情在线| 激情开心五月婷婷| 天天狠狠干| 欧美日韩99| 色色欧美。| 精品久久婷婷| 日韩狠狠色婷婷| 五月天激情久久| 久色激情| www.com在线操视频免费观看| 97久久草草超级碰碰碰| 韩国婷婷丁香五月| 成人AV中文字幕| 久热这里| 婷婷六月综合基地| 婷婷丁香五| 99视频这里有精品| 六月激情网| 丁香婷婷婷五月综合色情| 激情五月图| 无码色| 婷婷香草网| 中文字幕婷婷| 色五月丁香伊人| 久久五月天婷婷| 五月天激情网图片| 欧美槡BBBB槡BBB少妇| 久久丁香五月| 久草xx性爱视频| www.婷婷五月| 99久在线精品99re5热视频| 亚洲色婷婷网站| 青青草原亚洲天堂| 丁香婷婷久久五月天| ay2区| www.色九月| 婷婷五月丁香色色| 韩国情人在线电视剧免费观看高清版全集| 狠狠色综合网站久久久久| 99性视频| 五月婷婷色播| 伊人热在线大香蕉| 亚洲色精彩| 亚洲情色一区| 婷婷中文字暮| 六月丁香婷婷开心综合基地| 99免费在线| 五月丁香婷草| 婷婷五月丁香六月综合网| 91男女视频在线观看| 亚洲综合在线伊人婷| 五月婷婷六月色| 超碰免费观看| 色综合久久伊伊婷婷五月| 亚洲色五月婷婷| 丁香五月综合激情啪啪| 国产成人99久久亚洲综合精品| 五月天婷婷综合| 午夜丁香婷婷| 色噜噜狠狠色综合网| 九九精品少妇| 欧美精品熟女一区二区| 亚洲国产精品VA在线看黑人| 婷婷丁香社区网| 六月激情婷婷| 97视频.干com| 国产激情在线| 丁香五月婷婷亚洲色图| 伊人五月天在线| 色五月婷婷丁香凹凸| 亚洲99在线视频| 久久99国产综合精品免费| 开心六月丁香五月婷婷| 猫咪伊人久久| 色情丁香五月天| 色五月综合网| 丁香五月综合激情久久潮喷| 婷婷色婷婷| 丁香五月婷婷色| 伊人久久婷婷| 五月婷婷丁香| 丁香五月激情综合| 99操视频| 狠狠干在线| 99在线精品视频观看免费下载| 特级西西4444www无码| 密黄站| 99国产精品久久久久久久久久久 |