欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,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
返回資訊列表
色婷婷五月在线| 五月天丁香成人| 九九精品在线网| 五月婷婷五月| 精品成人a v无码内射| 在线天堂9| 婷婷五月成人| 天天爽人人综合免费7799| 欧美天天五月丁香免费观看| 婷婷五月丁香花综合| 丁香五月性| 蜜桃五月天色| 色99在线视频| 色爱综合五月| 91九色白丝| 激情九色| 综合婷婷五月天| 伊人99热| 久久九九网| 男女啪啪视频久 9| 婷婷情色开心五月天99| 天天综合精品| 久久草大香蕉| 天天操天天操天天操天天操天天操| 99热这里只有精品官网| 天堂婷婷丁香六月网| 色婷婷97| 激情综合网激情五月天| 深爱五月天天| 婷婷激情综合网| 亚洲婷婷丁香| 国产激情av| 亚洲色五月| 婷婷丁香五月亚洲17cao| 五月婷成人| 91久久精品视频| 狠狠精品干练久久久无码中文字幕 | 色五月婷婷777| 人人爱操| 日本一级黄色电影| 久久色婷婷| 五月天 另类图片| 狠狠操天天操天天操| 99操碰| 丁香五月综合网亚洲综合欧美狠狠| 99热免费精品热久久66| xxxx五月激情| 五月婷婷熟女| 综合伊人狠狠| 五月天网站免费欧美| 台湾佬天天日丁香婷婷五月天| 无码色色色色色| 99九九99九九九视频精彩| 丁香花五月天社区| 99在线热视频| 婷婷开心深爱五月天| 亚洲AV无码一区二| 色播婷婷五月天| 午夜成人综合| 久久这里只有国产| 五月欧美色色五月| 天天狠天天叉| 天天色综网| 另类激情综合| 亚洲第一综合| 91久久网站| 激情五月婷婷老师| 色综合久久综合| 极品少妇婷婷五月| 伊人久久大香网| 狠狠色噜噜狠狠| 伊人久久大香线蕉AV最新午夜| YW无码| 影音先锋一区二区资源站| 人人色人人弄人人操| 激情婷婷五月丁香啪啪啪| 一级黄在线| 婷婷五月激情基地| 97九色视频| 一区视频网站| 先锋资源 996| 久久久久婷| 五月天天综合| 97碰碰碰免费公开在线视频| 色婷成人狠干| 丁香五月亚洲激情婷婷射| 888精品福利地址| 婷婷亚洲激情在线观看视频| 亚洲精品久久久久久久久久吃药| 丁香五月天婷婷激情| www,色婷婷| 黄网在线播放| 九九99视频精品| 中文字幕,综合,91| 日本老女人黄页在线播放| 另类五月婷婷| 另类小说色婷婷| 久久久中文| CHINESE熟女老女人HD视频| 情欲禁地| 久久五月激情综合| 这里只精品热在线18| 色综合另类| 激情婷婷五月天| 欧美性生交XXXXX无码小说| 色欲色欲久久宗合网| 91猫咪国产在线播放| 五月激情网站| 在热视频精品| 丰满少妇猛烈A片免费看观看| 黄色aa观看aaguochan| 婷婷激情人妻| 日本成人噜噜噜| 丁香五月欧美| 五月丁香婷婷色色色| 操碰91| 99热这里有精品2| 久久人妻精品| 热99热久| 激情婷婷五月基地| 精品人妻伦九区久久AAA片| 懂色av粉嫩AV蜜臀AV| 伊人色综合影院视频| 激情五月天之六月婷婷| 欧洲色| 色黄啪啪| 亚洲aV写真天天综合网久久| 中文字幕按摩做爰| 五月天·www·com| 26UUU精品一区二区| 绿色小导航AV| 色五月激情五月天| 色综合婷婷99| A色色| 综合AV在线| 一本到不卡高清DVD| 激情五月婷| 欧美另类五月激情| 色135综合网| 99er6免费视频热播| 色婷婷五月天久久| 久久 中文 日本| 夜夜躁狠狠| 久久久8| www.玖玖婷婷在线| 岛国AV网站| 婷婷色综合| 亚洲人妻AV| 亚洲碰碰碰| 中文字幕久久婷九女同| 日韩在线婷婷五月天综合| 亚洲色综合| 五月天天综合| www.99久| 99久热在线精品| 情色婷婷五月天| 婷婷丁香五月天大香蕉| 另类小说五月天| Av在线资源| 少妇人妻凹凸视频| 最新婷婷五月丁香| 五月天社区狠狠| 99丁香婷婷综合网| 五月草视频| 97超级啪啪在线观看| 丁香花五月天| 99热伊人综合| 六月婷婷激情| AV色五月婷婷| 草草女人亚洲| 五月激情综| 大香婷婷| 99久热| 久久东京热婷婷五月| 色色五月天丁香婷婷| 色域五月婷婷丁香| 婷婷成人五月天| 丁香五月婷婷亚洲色图| 精品一二三区久久AAA片| 欧美日本综合网| 国产在线aaa片一区二区99| 综合久久99| 天天插天天日| 欧美婷婷五月| 久久大香蕉同僚| 色碰碰| 欧美在线视频99| 黄网在线播放| 这里精品| 狠狠做五月| 丁香五月天激情| 亚洲1区| 五月天激情综合| 色色丁香五月婷婷| 亚洲狠狠婷婷| 少妇2做爰HD韩国电影| 久久色五月天综合网| 伊人久久大香线蕉综合网站| 丁香色婷婷| 人妻操在线看| 成人午夜无码视频| 色色色色色日韩午夜激情 | 99色在线观看| 婷婷丁香小说| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | 丁香六月天堂| 亚洲AV人人操| 熟女激情五月天| 色婷婷五月天天天天天| 热99视频精品在线| 综合激情在线视频| 五月在在观看| www.91.com黄| 色色色视频免费无码| 丰满少妇乱A片无码| 五月丁香在线国产| 超碰无码318604| 丁香五月欧美成人| 欧美综合丁香网| 大香蕉伊然在亚洲90| 爱婷婷都市激情| 7超碰自拍| www.99视频| 色偷偷狠狠| 视频久久9| 人妻中文在线| 婷婷五月天电影区小说区| 玖玖婷婷色| 久久久久这里只有精品| 天天激情视频| 婷婷欧美综合| 五月婷婷久久内射| 99热老司机| 天天爽天天操| 五月天激情网站| 亚洲性天天| 日本91在线播放| 狠狠色综合网| 亚洲无码成人性爰网| 九九www| 五月激情啪啪| 婷婷五月天伊人网在线观看视频| 97碰超级人人看| www久久久久久久久久久| 欧美色色色色色| 欧美精品99久久久| 成人AV网站在线| 婷婷激情在线| 新精品99| 日日色五月天| 六月色色| 亚洲婷婷基地| 色欧美日| www.99操.com| 夜夜操狠狠操| 操91| 久碰婷婷视频| 噜噜精品| 五月丁香久久丝袜啪啪| 欧美熟女99| 欧美在线ee日韩| 色色五月天婷婷| 亚洲人人操| 激情五月深爱五月观看| 98色花堂98t.R| 九久久九精品视频| 五月天婷婷丁香| 五月天婷婷在线AN| 天天色综合网吨吧| 五月丁香欧美综合免费视频| 激情婷婷综合| 色综合色婷婷色伊人| 超碰国产AV| 激情图片亚洲| 五月花免费视频| www.狠狠狠狠| 五月情婷婷五月| 丁香五月激情棕合| 久久久.COM| 怡红院成人AV| 色偷偷人人| 亚洲网综合在线| 五月丁香综合激情| 亚洲人妻Av| 丁香六月婷婷激情| 亚洲色无码| 久久成人综合五月天| 丁香六月综合激情| 天天插天天插天天日| 啪啪综合| 成人网址在线观看| 久碰视频| 蜜乳9188| 五月婷婷久久开心网| 亚洲成人高清在线| 中文字幕不卡+婷婷五月| 不卡成人免费| 丁香五月激情啪啪啪| 99色人| 8050一级网| 香蕉人妻AV久久久久天天| 99在线精品观看99| 欧美顶级少妇做爰HD| 精品久久99| 狠狠色婷婷777| 色五月成人| 亚洲欧美婷婷五月色综合| 婷婷玖玖五月天| 欧美婷婷成人| 九九热10| 婷婷99视频精品| 偷拍91九色| 久久性爱视频| 99这里只有精品|v| 五月婷婷六月色| 国产毛片精品一区二区色欲黄A片 极品人妻VIDEOSSS人妻 | 99久久www| 婷婷色五月天色| 五月婷天堂视频| 91pornav在线| 婷婷色女| 狠狠干五码| 五月天婷婷网站| 99爱最新免费视频在线观看| 久色婷婷200| 精品人妻一区二区| 九九99久久| 国产又粗又大又爽又黄| 久久日婷婷| 成人网页在线观看| 婷婷五月天成人在线视频| 超碰在线91| www.天天干.com| 五月丁香六月婷婷不卡免费无码| 婷婷婷婷色| 欧美超级视频97| 五月色色色| 99久re热视频精品98| 国产又色又爽又黄又免费| 综合久久五| 中文字幕无码成人电影| 久久久色婷婷五月天| 丁香激情婷婷网| 九九99热| 婷婷综合仓库中文| 深夜男女福利刺激影院一区| 天天操天天日天天操| aaa久久| 五月天综合在线| 99热亚洲只有色| www.91在线看| 五月天无码视屏播放| 日韩操逼小电影| 欧美中文五月天| 99热精品中文字幕| 久99久视频精选| 激情五月综合网| 热99re| 超碰在线看| 青青草深爱激情网| 午夜天堂啪啪| 丁香婷婷老司机久操| 九九热av| 99热视精品| 99久久6| 99热日本| 久久大香免费| 色情激情五月| 五月婷婷色五月| 久久九九激情五月天| 九九热10| 色 色 色综合com| 婷婷丁香人妻天天爽| 久久综合最新网址| 五月天激情小说电影| 色丁香五月婷婷| 欧美性猛交99久久久久99按摩| 国产1区2区| 国产Va视频| 六月婷婷啪啪| 婷婷综合伊人| 婷婷六月天激情影院| 97干在线| 停停五月色宗合| 99.色| 婷婷五月色| 亚洲最大在线| 五月婷婷丁香综合| xx久久| 激情丁香六月| 日本三级99人妇网站| 久久五月天婷婷视频| 91成人电影| 国内9l视频自拍老熟女九色| 色人妻五月| 色久综合| 久久五月网| 天天操综合网| 婷色人人狠| 激情五月丁香五月| 精品思思久久| 亚洲综合五月天婷婷| 九色 在线| 99热66| se.久久视频在线观看| 丁香五月天激情网| 精品五月花| 婷婷五月天视频小说| 99热超碰| 森林影视大全,最好看的2019年视频 | 久久人妻伦理| 久久9热综合| 丁香五月综合在线观看| 1囯产午夜仑鲁鲁| 色婷婷色婷婷五月| 91精品丝袜久久久久久久久粉嫩| 日本一道久久| 99re思思热久久| 色婷婷六月天| 五月天婷婷激情小说电影| 另类激情五月| 99爱在线免费视频| 丁香五月婷婷成人色区| 狠狠爱成人综合网| 久久激情五月婷婷| 久久草中文日韩欧美| 婷婷中文无码| 久久网站免费亚洲| 99久久九九视频| 天天综合天天玩夜夜玩天天玩夜夜玩 | 婷婷五月情| 一起草av| 丁香色播五月天| 五月综合激情啪啪啪啪啪| 亚洲色综久久五月| 铁牛TV人妻| 五月婷网| 五月婷婷久久内射| 性色综合网| 激情五月天天狠狠久久| 五月丁香日本一抹本| 婷婷五月花| 91人妻视频| 在线超碰91| 日韩成人AV在线| 九月丁香婷婷综合激情| 1024欧美看片| 久久人人九九| 天天做天天爱天天爽在| 91传媒无码人妻精| 天天综合网、天天综合色| 最近中文字幕大全免费版在线| 久久婷婷在线| 激情婷婷在线中文字幕| 69精品人人人人| 亚洲第一第二网站| 激情五月开心五月在线视频| 激情婷婷五月社区| 99re思思热久久| 色婷婷五月综合在线| sewuyuetingtingiii| 99久热这里只有精品| 五月天婷婷伊人| bukadeavzaixian| 九九色热| 色五月女| 色婷婷在线综合色播网| 婷婷丁香五月91| 五月天综合在线| 99热这里有精力| 性爱综合网| 日本性视频| 色婷婷网| 色噜噜五月天| 色青青视频| 超碰猛烈的性猛交| 97操碰98| 夜夜操狠狠操| www.maotanji.com| 九九热视频免费的| 亚洲日韩国产黑丝黑丝AVAV一区二区三区 | 影音先锋女人AA鲁色资源| 狠狠操狠狠操| 99亚洲色| 久久99这里| 国产成人AV在线播放| 成人无码精品1区2区3区免费看| 五月欧美丁香在线观看| 激情五月天免费视频| 99热精品观看| 久久99日本精品视频免费观看| 五月天色色网站| 深爱激情五月网| 五月激情久久综合| 激情综合女人网五月播播| 在线伦子99热| 日逼影音先锋男人资源站| 丁香五月天之婷婷影院| 性欧美日本| www,婷婷| 丁香六月激情蜜桃| 先锋男人99资源| 99无码视频| 玖玖爱导航| 色五月,com| 午夜天堂啪啪| 婷婷婷婷婷婷婷五月丁香| 色五月天综合网| 天天成人综合视频| 久久五月婷综合网| 国内裸舞二区| 激情五月图| 精品婷婷| 玖玖爱综合网| 26UUU欧美激情一区二区| 草久私拍| www狠狠爱com| Www.久久| 国产高潮白浆一区二区| 狠狠狠狠狠狠草| 狠狠精品干练久久久无码中文字幕| 大香蕉五月天婷婷| 婷婷五月天久久久| 男女99免费视频| 中文久久婷婷| 九九综合伊人| 色啪影院| 色色色色网| 五月婷在线| 婷婷伊人网| 成人网站在线观看视频| 丁香色婷婷| 97碰碰人人| 五月婷婷AV| 精品久久久999| 激情六月天| 五月天亚洲综合网| 免费黄色AV| 色色色婷婷五月| www.99日本| 五月丁香色| 久久婷婷综合网| 大香蕉综合| 九九热最新地址| 97色色色| 欧美五月停| www,99视频| 久久久全国免费视频| 91碰人人| 狠狠色丁香久久婷婷综合五月| 婷婷综合偷拍| 97在线/亚洲| 色情综合| 五月天婷婷激情小说| 婷婷播播五月天| 婷婷五月天欧美图片在线播放电驴| 人人草人人视| 干一干xxxx| 九热视频| 少妇AB又爽又紧无码网站| 亚洲五月六月婷婷| 久久99看免费| 婷婷香香五月| 9久热这里只有精品视频| 色宗合久久五月婷婷| 婷婷六月激情综合| 久久婷五月婷| av在线播放网站| 天堂网色婷婷| 开心婷婷五月天综合| 情情五月天色| 天天操婷婷| 午夜五月天| 风流少妇A片一区二区蜜桃| www.婷婷激情网.com| 亚洲在线视频321| 久久婷婷六月综合| 天天干天天爽天天操| 婷婷在线视频| 亚洲爆乳无码精品AAA片蜜桃| 久久综合图片| 日本色色色| 2w在线视频| WWW免费视频碰碰碰碰| 丁香五月天电影| 亚洲无码 图片区| 欧美性爱中文字幕| 色情播放| 91九色国产在线| 婷婷五月影院| 九九精彩久久| 婷婷玉月丁香五月在线视频| 久久狼人天堂| 日韩五月婷婷久久| 亚洲网站在线鸭子av| 天天插插天天| 99色视频| 婷婷丁香九月| 狠狠狠夜夜夜| 五月天色综合| 婷婷欧美综合| 婷婷六月五月天综合| 综合五月婷婷| 91啪啪啪啪| 激情五月天之五月婷婷| 亚洲激情视频在线观看| 激情婷婷护士激情| 无码网| 久久视频婷婷| 男人的天堂在线婷婷| 五月天日日操夜夜操 | 人人操av| 9有码中文| 婷婷五月天资源| 99免费在线视频| 亚洲色色五月天| 狠狠狠狠操| 丁香色五月 97干| 狠狠色大香蕉| 午夜丁香五月天综合| 国产成人网址| 在线播放中文字幕| 久碰婷婷视频| 六月丁香啪| 另类图片 五月激情| 九九99久久| 天天操天天曰天天射| 骚货艹网站视频| 五月天综合网| 高清无码.com| 99久久婷婷| 激情综合色婷婷啪啪六月天| 99亚洲日韩| 色色色九九九五月婷婷| 99热99热在线观看| 五月丁香啪啪网| 五月婷婷久久大香蕉| 六月综合在线| 综合激情四射一theav| 热99久久这里只有精品| 亚洲精品V天堂中文字幕| 91精品久久久久| 色九亚洲| 亚洲性爱电影| 性生活视频98791| 激情淫乱男女| 五月丁香婷婷AV| 91fuliwang| 久久九九蜜| 性爱网五月婷婷| 九九亚洲小视频| 色婷婷成人做爰A片免费看网站| 青青草原中文字幕| 99热最新| 狠狠五月天婷婷| 99国产精品久久久久久久久久久| 蜜臀A∨在线水帘洞| 日本色婷婷| 九九热视频网站| 开心五月婷婷激情| 狠狠狠人妻| 丰满少妇猛烈A片免费看观看| 亚洲激情电影五月天色婷婷丁香一起草| 激情小说婷婷| 六月婷婷无码观看| 五月丁香婷婷钟和色图| 婷婷五月伦理网站| 国产4P视频精品五区| 久久婷婷六月综合综合| 91男同| 天天日天天爽| 丁香六月婷婷综合麻豆| 六月婷欧美丁香综合| 综合五月网| 丁香婷婷色情| 思思精品久久艹| 99热草草| 夜夜躁爽日日| 丁香六月婷婷| 粉嫩AV久久一区二区三区| 激情综合丁| 伊人久久大香线蕉AV最新午夜| 五月婷婷六月激情| 九九热a| 日本狠狠干| 五月情涩综合婷婷| 91porn一起草| 五月天色不卡| www.热99热| 综合五月丁香六月婷婷| 天天操人人干| 久久这里99| 91亚洲天堂| 九九色色| 狠狠色狠狠色综合日日91| 亚洲在线播放| 婷婷五月天av| 色婷婷社区| 久草五月婷婷| 一起草AV入口| 天天综合色丁香| 五月天天天综合| 激情6月| 91大神操美女| sewuyue第四色| 五月丁香九九| 嫩BBB槡BBBB搡BBBB| 99热.com| 包操45分钟网站| av人人操| 亚洲天堂有码| 丁香五月老师| 久一网站| 一级片操逼视频| 亚洲色夜| 色丁香久综合在线久综合在线观看| av在线免费网站| 免费看欧美成人A片无码| 丁香五月激情婷婷婷婷在线观看| 婷婷五月天最新综合你懂的 | 97爱综合| 少妇2做爰HD韩国电影| av在线免费网站| 蜜桃婷婷丁香五月天狠狠久久综合| 超91在线视频| 成人精品视频99在线观看免费| 色香久久| 99久久久国产精品免费蜜乳tv| 激情综合啪啪| 六月婷婷AV| 黄桃AV无码免费一区二区三区| 97色色网| 色五月丁香伊人| 亚洲小视频免费看| 久久婷婷内射| 日本一区二区三区精品视频| 色色色网站| 99色中文| 狠狠操狠狠操| 婷婷色情小说| 停停色综合伊人| 婷婷五月天激情网| 香蕉网久久| 人五月天婷婷喷水| 国产乱妇无乱码大黄AA片| 丁香五月手机在线| 99久视频| 这里只有精品免费观看网占| 色亚洲色宗合| 婷婷欧美偷拍综合| 久久婷婷综| 国内久久亭亭| 婷婷五月激情视频网| 日本色色影片| 亚洲乱码日产精品BD| 五月激情六月丁香| 九九久久综合| 网色99| 久久婷婷五月综合色丁香| 丁香五月激情综合啪啪| 天天爽天天爽夜夜爽| 国产婷婷综合| 久久五月丁香伊人青草| www,五月天com| 九九青青草成人| 91黄操| 日本人人干| 成人色图情色成人网 www.5b5b5bcom 五月天 | 丁香五月花| 欧美成人精品A片免费一区99| 人人干av| 五月婷婷激情网| 五月综合无码| 天天色天天操天天射| 99色免费观看全部| 天干夜夜操| 狠狠色婷婷| 99综合| 亚州操人在线视频| 成片免费观看视频大全| 另类婷婷丁香| 狠狠色综合网站久久久久| 97干欧美| 天天干天天操天天爽| 91人妻色色网| 99久久综合| 激情小说五月天中文字幕| 伊人在线视频| 丁香婷婷色五月天| 激情五月狠狠喔| 九九这里有精品| 97亚洲婷婷| 五月丁香成人| 亚洲五月天综合色| 免费无码毛片一区二区A片 | 五月婷婷色五月| 色综合久久综合| 大香蕉久久久| 怡红院 久久| 无码少妇高潮喷水A片免费| 很很干在线视频| 开心五月婷婷伊人| 五月狠狠| 婷婷五月花免费视频在线| 99精品国产在热久久| 亚洲五月天婷婷在线| 丁香五月电影院在线观看| 丁香五月91| 日日操夜夜操狠狠操| 狠狠干五月| 色无码| 99热九九这里只有精品| 国产婷婷色综合AV蜜臀AV | 激情综合五| 国产成人+综合亚洲+天堂| 免费观看的av| 99热精品在线免费观看| ww久久| 国产精品久久久久久喷浆| 五月丁查人人| 色欲久久综合| 日比视频91| 99热播放| www.五月天。com| 婷婷五月网图片区| 婷婷五月天激情四射| 五月天婷婷无码视频| 久久99视频| 国产干逼片| 五月丁香婷婷色色| 狠狠狠狠狠操| 欧美内射AA| 综合久久十| 五月激情偷拍| 激情VA视频| 日日夜夜狠狠婷婷色| 96色婷婷| 香蕉久久国产AV一区二区| 日韩aaa| 欧美激情xxxXX| 久七香蕉| 乱乱av| 婷婷色网站| 亚洲最大五月天成人网| 亚洲精品va| 婷婷终合色图| 五月婷护士| 综合网色| 美女丁香五婷婷| 色色色热| 日韩高清成人| 特级片神马电影| 亚洲操b| 青青草原爱爱网| 成人超碰AV| 亚洲无码yw| 九九色婷婷五月天| 成人噜噜网| 99热首页| 久久大大香| 色久播播| 六月色播| 极品少妇婷婷五月| 婷婷开心青青草| 五月丁香婷婷久久| 日本大逼91| 色综合久久88色综合中文字幕| www色婷婷| 欧美激情伊人| 婷婷色欧美激情| 国产伦亲子伦亲子视频观看| 九九热中文| 亚洲综合激情五月久久| 欧州婷婷五月天综合| 婷色人人狠| 国产成人av在线播放| 成人 九九九九| 亚洲综合婷婷| 99激情视频| 日韩成人网址| 色吧婷婷| 91 原创 在线 九色| www.深爱激情| 久久色大香蕉| 五月人妻婷婷| www.五月天| 色噜噜狠狠色综合无码久久欧美| 丁香五月色网| 亚洲色图在线视频| 91精品综合久久久久久五月丁香 | 中文字幕无码成人电影| 亚洲国产精品综合色区| 久久久99精品免费观看| 丁香激惜男女| 激情六月婷婷| 超碰久热| 尔尔AV一区| 亚洲操逼网| 乱码操操| 免费亚洲婷婷中文字幕| 五月丁香五月激情综合色综合| 91啪啪视频| 黄色大片又大粗又爽| 婷婷五月成人色综合| 五月天激日本色情在线| 夜夜天天久久婷婷| 久久思思热视频| 五月天婷婷在线播放| 色婷婷日本| 婷婷久久网| 久久激情网| 亚洲无AV在线中文字幕| 五月婷婷操操| 五月开心啪啪| 99热9999| 色综合xx| Www,五月天| 激情爱爱网站超大免费| 九九热在线视频观看| 免费视频WWW在线观看网站| 九九色婷婷五月天| 欧美激情伊人| 99天堂网| 色婷婷香蕉丁丁网| www.婷婷五月天| 婷婷永久在线| 婷婷在线观看五月天在线视频| 91久久久久久久| 天天操天天操综合| 碰超亚洲| 五月天综合在线观看视频| 国产精品人妻在线网址| 久草A片| 女人露出p毛视频www网站| 99久久婷婷| RenRenSe在线视频网站| 九九爱激情| 无码区婷婷五月花开| 色婷婷狠| 97人妻碰碰中文无码久热丝袜| 五月婷婷亚洲综合网| 婷婷五月激情欧美大胆视频| 99久久6| 婷婷丁香色情| 91操人| 深爱五月最新网址| 98永久精品| 天天操天天操天天操天天操天天操| 狠狠干天天内射| 人碰人人人玩91| 丁香婷婷性久久| 日本三级大片| 九久久婷婷| 久久久久网站| 日韩好吊操| 久操香蕉| 99日本在线| 综合激情网| 成人 九九九九| 丁香五月天堂| 东北婷婷五月天| 最新日韩久热免费视频看看| 精品久久久人妻| 久久人人人人妻| 日91高清无玛| 91碰碰碰| www.99热这里精品| site:xiongshengzz.com| 99热综合在线观看| 91日本在线观看| 人人干AV| 国产成人av在线播放| 91操人人操| 久久大香蕉同僚| 亚洲另类婷婷五月综合| 婷婷丁香亚洲色综合91| 香蕉AV777XXX色综合一区| 另类激情五月在线视频欧美| 99热思思在线观看| 婷婷五月色惰| 蜜臀AV在线观看| 色色综合激情| 亚洲综合婷婷五月| 亚洲第一黄网| 色综啪啪| 五月丁香综合网| 青草五月天| 亚洲色婷婷99一9|| 色天堂A| 五月婷婷丁香成人网| 99热综合| 丁香五月天堂网AV| 久热视频这里只有精品| 日韩成人中文| 99热在线中文字幕| 国产真人做爰视频免费| 亚洲综合在线伊人婷| 91美女被操| 99精品在线观看视频| 五月婷婷草| 六月婷婷九月丁香| 亚洲综合另类| 久久伦乱| 日本色99| 婷色五月天| 色播婷婷五月天| 狠狠香蕉| www.婷婷六月天| 丁香色情五月综合激情| 婷婷五月成人| 婷婷伊人无码| 国产成人精品亚洲线观看| 99在线观看视频蜜臀| www.狠狠| 五月激情五月丁香| 殴美97色| 9视频在线成人网站| 91丨九色丨大屁股| 9色在线| 久久亚洲天堂| 狠狠草在线观看| 精品久久久久久久久久久久人妻| 视频综合网| 九九久久五月天综合伊人| 综合激情在线观看| 九九99偷拍视频| 超PEN精品在线| 99热精品在线| 色色国产| 79精品视频在线观看,| 激情av在线| 丁香五月香蕉| 婷婷丁香在线播放| site:ornaments52.com| 五月丁香WWW| www.夜夜操.con| 久婷婷五月丁香在线观看| 欧美一级色| 九九色欲网| 天天射天天干天插色综合| 婷婷色操| 伊人9在线| 婷婷欧美激情| 欧美WW在线网| 久久人五月| 成人AV网站在线| 久久久久久久久久久久63| 怡春院天天干| 在线亚洲综合网| .肏屄视频一区二区| 香蕉99网| 欧美久久久久久久久中文字幕| Caoub青青超碰| 红桃91人妻爽人妻爽| 亚洲色频| 亚洲AV成人无码电影| 婷婷六月综合基地| 99干99| 久久色五月| 超碰人人超碰| 五月天激情综合网俺也去| 另类激情五月天。| 色五月天天在线观看资源站| av在线超清中文| 久久看九九90| 91九九九色在| 欧美日韩国产成人在线| 日韩成人电影Av| 久久超视频| 日韩影院三级| eeuus五月婷| 丁香激情合作五月| 天天操夜夜肏| 婷婷王月天影院| 九九成人| 日本99久久| 91丨九色丨熟女高潮| 婷婷五月花| 色99xx| 九九热在线99| www.超碰| 岛国av网| 日本人人xxx| 五月婷啪啪| 婷婷成人五月天| 精品香蕉99久久久久网站| 91怕怕网| 97婷婷狠狠| 婷婷色五月婷婷姐妹| 无码婷婷五月天| 激情婷婷五月| 亚洲操逼网| 亚洲精品久久久无码| 97色一二三| 另类精品视频在线观看| peg 2区三区四区的| 影音先锋人妻出差| 久婷五月| 99小精品| 亚洲综合色色色| 久久99久久久久久| 国产精品激情AV久久久青桔| www.久操| 免费黄色视频网址| 逼逼AV| 桃色五月天| 99热自拍| 六月丁香开心婷婷欧美| 婷婷五月天av| 婷婷五月天激情影片| 一区视频网站| 日本不卡一区二区三区| 色噜久| 国产夫妻操逼内射视频| 精a品a| 激情五月天婷婷| 五月丁香激情综合网官网| 综合网色| 婷婷五月色花丁香社区| 婷婷五月丁香综合亚洲 | 天天综合久久| av亚洲国产小电影| 91精产一区三区免费观看| 99精品这里只有免费视频| 五月色综合网| 亚洲成人免费电影| 噜噜狠狠色综合久| 影音先锋激情网| 操人久久| 久久婷婷五月综合色丁香花| 婷婷五月天堂| 日韩在线五月天婷婷| 五月天成人综合| CAOBIBI| www婷婷亚洲| 久久五月激情| 日本色色视频| 天天搞夜夜叫| 狼人婷婷综合| 色99久草在线| WWW色综合| 97丁香五月| 91人妻九色大屁股| 亚洲综合网区| 婷婷成人AV| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 色五月美女| 伊人五月婷婷| 久久永久视频| 久草婷婷视频| 日韩欧美四五区| 丁香五月天啪啪| 97婷婷在线视频| 婷婷激情五月综合丁| 丁香五月综合| 性生活视频98791| 黄色AAAAA| 99热99艹在线观看| 婷婷香香五月| 五月婷婷亚洲| 久久精彩视频99| 开心五月综合激情综合五月| 激情五月天影院| 庭庭久久内射| 综合色色色| 99福利视频导航| 五月激激网w'w'w| 婷婷激情综合| 色婷婷五月色| 六月激情婷婷| 激情五月综合| 中文字幕高清av| 艾小青av| 香蕉久久av一区二区三区| 婷婷丁香色五月亚洲| 欧洲亚洲免费视频9| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 亚洲综合丁香五月天| 综合色图婷婷| 亚洲爱爱无码婷婷色五月| 激情小说五月天| 天天插天天狠| 婷婷五月天伊人网| 亚洲综合久| 亚洲国产成人在线| 五月天操逼网| 婷婷色五月激情强奸四射| 啪啪色区| 久久色9| 久久天堂婷婷五月| 久久久久久久人妻| 97婷婷五月激情六月丁香伊人| 九九精品在线观看视频6| 西西4r午夜剧场| 五月婷婷亞洲中文| 婷婷热色| 天天日日综合| 丁香五月WWW| 五月丁香六月激情在线| 九九人人看| 9l视频自拍九色9l视频在线观看| 人人妻人人澡人人爽| 丁香五月激情五月| 婷婷精品综合| 九九热自拍| 91啪啪视频| 五月天另类激情在线| 狠狠操之狠狠操| 激情文学五月丁香六月婷婷| 五月丁香六月色婷婷| 日本熟妇乱妇熟色A片蜜桃| 综合在线丁香五月| 人妻无码视频网| 深爱五月最新网址| 一级黄色操B| 久久99激情| 久婷| 成人va在线播放| 激情五月综合六月丁香婷婷狠狠干| 天天日天天操心| 中出内射的人妻视频| 亚洲国产网址| 婷婷五月天av| 亚洲午夜av| 99啪啪| 激情综合网 激情五月天| 日韩AV在线免费| AV成人在线播放| 深爱婷婷基地| 亚洲中文字幕在线观看| 婷婷色狠狠| 97人妻碰碰碰久久香蕉| 天天插天天插天天插天天插| 天天做天天爱天天爽在| 操逼电影免费看| 超碰国产AV| 99免费热在线精品| 婷婷五月天综合亚洲| 五月天色五月| 人妻操逼视频。| www免费在线视频| 另类综合色| 五月丁香婷婷色| 国产精品久久久久久喷浆| 五月丁香777| 日本色色网| 五月伊人91| 97人人做| 丁香婷婷射| Caop在线| 99这里有精品视频| www激情com| 国产亚洲色婷婷久久99精品91| 色色三级视频| 五月婷婷日| 狠狠久久婷五月综合色| 大香蕉啪啪啪啪啪啪| 日韩aaa| 国产成人99久久亚洲综合精品| 婷婷五月天堂| 五月丁香久久久| 丁香五月天黄色片| 久久这里只有精品16| 婷婷五月天激情电影| 欧美色图片88| 久99视频在线观看|