欧美成人午夜精品久久久,国产?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
返回資訊列表
97色天堂| wwwss在线观看| 超碰色综合| 中文无码婷婷| 亚洲情综合五月天| 91九色超碰正在播放| 久久九九re热| 在线网黄| 狠狠操.com| 婷婷五月天777| 天天操天天日天天爽| 99热无码| 丁香五月激情天AV无码| 婷婷综合色播网| 五月丁香操亭亭网| 97色干| 五月婷婷基地| 综合婷| 九月婷婷久久久| 色婷婷五月天激情久久| 久久怡红院| 中文字幕永久免费| 七月丁香五月婷婷在线| 伊久久婷婷| 武则天精品久久| 激情涩涩网| 丁香婷婷婷五月综合色情| 啪啪黄页网| 丁香五月天天| 九九无码| .青娱乐天天操B| 亚洲色色五月| 好吊丝aV| 欧美婷婷日本| 丁香婷婷浪潮AV久久综合| 久久婷婷人人| 麻豆五月丁香婷婷| 天天干夜晚夜操| 亚洲成人丁香花| 激情综合网址| 色五月综合激情| 天天噜| 久久99网| 91在线看免费 九九九九| 日本精品在线噜噜噜| 欧美激情xxxXX| www色中色综合| 色哟哟精品| 精品亚洲国产成AV人片传媒| 日本一级黄色电影| 99热在线观看免费精品| 性做爰A片免费视频A片直播| 91啪啪视频| 狠狠色狠狠鲁| 五月丁香婷婷基地| www.五月丁香| 五月亭亭六月天| 色婷婷激情| 综合激情肏逼网| 五月婷无码| 五月婷婷五月天| 五月四色婷婷| 天天天天干| 国产午夜精品一区二区三区四区| 日本久久性| 日本人妻丁香婷婷久久寝取熟女五月| 常久最新免费的色吊丝| 色婷婷丁香A片区毛片区女人区| 九9九9无码| 激情播丁香| 久久综合影院 | 婷婷亚洲色| 中文字幕综合色| 97色色色视屏| 无码任你操| 超碰99成人在线| 五月激情丁香六月狠狠干| 99精品无码| 成人无码精品1区2区3区免费看| 精品99在线| 久热精品视频| 99婷五月| 色情激情五月| 国产成人精品一区二三区熟女在线| 日韩在线观看亚洲| 伊人深爱综合| 亚洲成人AV高清字幕| 操日视频| 日韩黄色电影| 91精品视频男人的天堂| 女高怪谈在线观看| 色色综合五月| 丁香五月婷婷色播艳门照| 操碰97| 91成人看片| 天天操天天操天天操天天操天天操天天操| 久久44| 五月婷婷就去色| 色色婷婷五月天| 五月天婷婷社区久久综合| 亚洲人妻五月丁香婷婷| 九九色婷婷Av| 六月丁香社区| 国产亚洲成AV人片在线| 直接看的AV| 五月婷婷六月丁香| 热这里只有精| 人与禽A片啪啪| 99热偷拍| 激情五月天婷婷| 97精品在线| 99热资源在线| 丁香婷婷五月激情| 久久伊人五月天| 操B五月天| 日91高清无玛| 婷婷激情六月综合| 日本99视频| www.99婷婷| 97碰碰视频在线观看免费| 超碰A V在线| 国产片色| xxxx五月天色色| 日本久久爱| 99资源人人| 亚洲五月花| 九九热99精品| 在线成人网址| site:xmssd.com| 五月开心网| 亚洲中文字幕网| 丁香伊人网| 成人丁香色| 9久热在线视频精品| www91在线| 丁香九月婷婷色| 婷久久久| 丰满人妻一区二区三区| 亚洲操B视频| 色婷久| 色播播婷婷| 天天做天天爱天天爽| 婷婷五月天丁香社区| 丁香婷婷色| 丁香色情五月综合激情| 久热91精品| 久久9视频欧美| 91超级碰| 九九爱看亚洲| 欧美乱码国产一级A片| 美女精品一级不卡视频| 日日噜人人人做人| www.婷婷五月天| 夜夜操夜夜姧| 大香蕉视频婷婷| 99思思| 五月丁香久久网| 国产成人av在线播放| 亚洲综合成人网| 久久亚洲婷婷| 性欧美大战久久久久久久83| 丁香婷婷视频一区二区| 国产精品操| 色五月丁香五月| 激情丁香淫荡婷婷| 亚洲综合成人网站| 亚洲激情久久| 天天拍夜夜爽| 国产婷婷综合| 亚洲欧洲中文日韩久久AV乱码| 婷婷九月丁香久久| 日本乱论99| 成人av免费观看| 婷婷综合网| 极品少妇高潮啪啪AV无码| 人人操人av| 激情伊人网| 九九碰九九爱97| 亚洲五月婷天天操| 99日本视频在线观看专区| www.天天干| 夜夜躁婷婷AV| 在线理论片| 人人人操97| 亚洲超碰在线| 婷婷五月六月丁香| 婷婷丁香色五月天久久88| 五月丁香六月片| 开心五月网| 99re热在线视频| 九色婷婷| 99热这里只有免费精品| 黄色99视频| 五月久久综合| 亚洲激情AV| 99在线视频在线观看| 成人在线高清| 人妻丰满精品一区二区A片| 色色网站| xx综合网| 玖玖五月丁香| 欧美怡红院黄站| 狠狠爱婷婷丁香| 狠狠久久婷五月综合色| 人人摸人人操人人爽| 婷婷色在线观看| 狠狠色噜噜狠狠狠888了| 九九色大香蕉| 波多婷婷久久| 专区无日本视频高清8| 色五月丁香五月婷婷五月成人网| 激情com| 91日综合欧美| 中国女人内射6XXXXX| 九九性爱网| 狠狠肏综合网| 丁香婷婷性爱| 成人资源在线| 丁香五月婷婷国产av| 亚洲中文字幕av| 婷婷开心久久| 九九操综合网| 欧美群妇大交乱婬网| 久久人视频| 深爱五月激情| 99爱视频| 99热这里全是精品| 手机看片日日做夜夜| 91婷婷色| 五月综合激情网| 婷婷丁香十月| 五月丁香六月香香蕉| 骚。com| 26uuu.| 五月婷中文字幕| 大鸡巴伊人网| 伊人久久婷婷五月综合97色| 五月丁香六月激情| 色五月AV| 久久综合性| 五月天婷婷亚洲| 欧美va亚洲va| 色色婷| 一区二区乱码视频| 丁香五月成人丝袜| 特黄三级又爽又粗又大| 97色五月婷婷在线| 国产69久久久欧美黑人A片| 日日噜噜夜夜狠狠久久丁香六月| 深爱激情五月天| 狠狠色性| 人妻系列久久久久久久久久久 | 久久成人人妻| 国产性色蜜乳| 五月天色婷婷图片| 色婷婷五月天天天天天天天天天| 婷婷,五月天,丁香,第一| 欧美色色干| 99在线看视频| 猫咪伊人AV| 思思热在线观看| 午夜成人天堂久久无码日韩久久| 天天综合网91| 涩综合网| 五月婷婷啪啪网| 色色AV色色色东莞| 婷婷激情丁香六月| 色色色色色爱| 青草激情在线| 狠狠操狠狠干综合| 久久综合激情婷婷激情| 日日狠狠久久偷偷四色综合免费| 26uuu欧美激情另类| 开心四月婷婷在线色播播| 欧美狠狠草| 玖玖国产视频一区| 夜夜骑操AV| 丁香五月天啪啪| 日本啪啪网| 久久精品五月天| 婷婷色五月开心五月| 超碰国产在线观看| 丁香九月综合激情| 日韩不卡DvD| 另类A片| 国产熟女大叫受不了| www.婷婷,com| www.天天色综合| 国产欧美日韩性爱| 天天在线天天综合网色| 色高清无码视频| 五月天性色| 99秘 在线| 丁香激激情网| 天天久| 五月丁香色综合| 玖玖五月丁香| 99热亚洲精品| 五月丁香综合| 日韩欧美成人网| 免费色婷婷| 97超碰在线观看免费| 丁香五月婷婷激情蜜桃| 五月婷婷婷综合网| 色综合夜夜| 再綫Av免费視品| 欧美激情xxxXX| 色婷婷先锋| 欧美另类五月激情| 国产精品VA在线| 9九色首页| 色色五月婷| 99ri视频| 影音先锋男人AV资源站| 97五月天婷婷综合激情网| 国内一级精品| 亚洲综合在线伊人婷| 99久热这里有精品| 新伍月婷婷| 激情噜噜噜| 日韩人妻无码精品| 久久九九网| 六月丁花香啪啪激情欧美| 久久大大香| 亚洲另类AV| 日本在线视频播放91| www.久久久久| 色色热| 五月婷婷操操| 日本3级片一区2区| 熟女激情网| 婷婷天天综合| 国产激情av| 91色色色| 狠狠色丁香久久综合婷婷亚洲成人福利| 91九色视频在线观看| 9l视频自拍九色9l视频自拍九色9l社区| 97丁香花五月天激情小说| 激情综合婷婷| 9久久婷婷国产综合精品性色| 免费亚洲婷婷| 色原狠狠综合| 开心五月天私房婷婷| 青草热视频这里只有精品| 色综合色色| 超碰av在线| 精品少妇人妻AV无码专区偷人 | 色欲色香伊人| 99在线观看精品视频| 国产精品久久久久9999小说| 天天综合色丁香| 夜夜涩涩涩| 婷婷五月丁香伊人| www.99色| 99视频35精品视频在线观看| 婷婷深爱网| 人人摸人人澡人人| 九九九九精品精| www.刺激色网站www.| 91操人视频| 五月天另类小说久久小说网| 久热大香蕉| 影音先锋日本三级资源| 热久久91| 亚洲色情在线| 天天爱天天做天天操| 婷婷五月天涩涩| 五月色综合网欧美网| 丁香五月五月婷婷五月天激情四射| 国产成人av在线播放| 丁香五月婷婷国产av| 在线网黄| 综合网视频| 俺也去色| 色狠狠色| 五月丁香激情综合网| 无码少妇高潮喷水A片免费| 欧美、日韩、中文、制服、人妻| 激情小说之五月| 国产成人99久久亚洲综合精品| 六月色 亚洲| 天天天操天天天爰| 欧美色五月| 五月天色小说| 六月激情婷婷色| 99视频在线播放大全| 五月天丁香色色| 五月丁香A片| 婷婷丁香五月婷婷| 在线亚洲综合网| 婷婷在线操| 九九大香蕉黄色影院| 狠狠色丁香乆乆| 丁香五月天天| 国产成人亚洲综合A∨婷婷| 超碰国产一区| 婷婷播播五月天| 五月婷婷综合视频| 91精品婷婷国产综合久久| 可以免费看的AV网站| 欧美电影在线观看| www色婷婷久久综合久色 | 色久五月| 五月天色丁香| 大香蕉婷婷色| 色婷婷9| www,99色| 99国产这里只有精品| 婷婷丁香五月激情| 天堂A∨在线| 五月丁香六月婷婷啪啪| 婷婷五月丁香综合桃花色网| 久久机热/这里只有精品| 九九aV| 日本无va视频| 亚洲欧美国产高清vA在线播放| 久久亚洲婷婷| 午夜国产精品AV在线播放| 亚洲色综合| 超碰资源在线| 午夜成人综合| 热99精品视频五月| 亚洲不卡| 91seav| 琪琪色五月天| 五月天丁香综合在线| 天天夜夜爽| 久久婷婷七月丁香| 五月婷婷啪啪网| 五月开心播播网| 国产欧美婷婷五月| 亚洲熟妇AV乱码在线观看| 伦乱美欧| 国产精品日本一区二区在线播放| 天天干,噜噜色,狠狠色| 激情五月丁香五月| 思思99精品视频在线观看| 99综合网| 夜夜爽日日躁| 免费碰碰视频久| 丁香五月婷婷俺也要去| 婷婷色色婷婷| 亚洲啪啪精品| 丁香五月天婷婷中文字幕| 久久一品区| 类似婷婷激情综合网站| 丁香五月在线自慰| 天天干电影| 99热热九九| 国外亚洲成AV人片在线观看| 婷婷成人小说综合| 色综啪啪| 99热日| 9操在线| 亚洲操操| 色婷婷丁香五月高清在线| 可以看的av| 国产日韩欧美性生活| 97精品人人A片免费看| 六月香五月婷| 1024欧美看片| 操逼六区| 亚洲婷婷丁香五月在线| 无码少妇高潮喷水A片免费| 狠狠操性爱av| 婷婷久久性爱| 天天操天天插| 久久人妻系列| 丁香六月| 日韩啪啪视频| 日日操,夜夜爽| 丁香花五月天婷婷成人社区| 蜜乳中文字| 99久久久久久久| 婷婷伊人中文字幕| 另类小说五月天综合| 亚洲精品一二三| 色久综合| 日本熟女视频一区二区| 婷婷综合中文字幕| 99热这里只有精品22| 99riAV国产精品视频| 色五月丁香五月| 天天更新天天亚洲| 国产亚洲成AV人片在线| 99热这里只有精品3| 好好日激情五月天| 久久青青日本视频| 99精品免费| 天堂草在线观| www.五月婷婷| 日本久久精品| 强伦轩人妻一区二区电影| 91AV婷婷| 五月天操逼激情| 啪色综合| 五月色婷婷AV| 成人性爱无码| 91九色视频| AA片在线观看视频在线播放| 五月丁香婷草| 五月婷婷婷婷婷婷艺术| 中文资源在线a| 99riav 亚洲| 9月色婷婷| 天天日狠狠| 综合亚洲AV| 激情五月综合| 色爱99| 秋霞三级影视资源| 98永久精品| 男男野外做爰全过程69| 婷婷五月综合网| 伊人狠狠狠综合| 色婷婷超碰| 亚洲亚洲人成综合网络| 五月婷啪啪| 亚洲综合五月天综合| 99视频九九热| 亚洲人成播放网站| 色五月丁香五月| 激情婷婷六月天| 亚洲第一色色色色| 日韩狠狠色| 五月色亭丁香| 亚洲高清在线| 色色综合激情| 五月丁香婷婷激情澎湃四射| 亚洲成人色五月婷婷综合| 久久日九九| 亚洲国产精品VA在线看黑人 | 色婷五月天| 日日操日日干| 欧美性爱五月天| 婷婷WWW久久| 99热只有| 激情综合五月婷婷| 热久久视频99| 91热er| 久久婷婷综合网| 丁香五月色色婷| 国产精品久久久久久久久久| 精品久久久人妻| 色色色色色色网| 丁香网五月网| 美女婷婷六月色| 草一草avb| 日笨久久网| 五月天激情国产综合AV| www.粉嫩av.com| 大香蕉久久婷婷精品综合| 伊人五月婷| 激情婷婷五月天| 热五月婷婷| 99久久久国产精品免费蜜乳tv| 可以免费观看的av网址| 九九国产视频| 思思99热这里只有精品| 婷婷99| 新97人人上人人| 久久久婷丁香五月天激情综合| 久久久久久久久久久久63| 久久曰9| 这里有精品| 婷婷丁香熟妇综合网| 久99久99精品免| 婷婷成年人免费视频| 99色免费视频| 五月草影视| 插插插色综合网| 五月天激情偷拍| 热99国产精品| 五月丁香| 99热在线爱| 玖玖在线视频福利| 五月天婷婷激情网| 人人爽天天莫| 久久99这里只有精品| 91chinese在线| 91成人品| 综合久久婷婷五月丁香| 国产视频久色| 久久机只有这里精品| 五月婷婷激清网| 岛国av电影网站| 亚洲五月天婷婷在线| 久久精品亚洲热| 五月第四色| 这里只有精品视频免费在线观看| 99啪啪网| 亚洲1区| 91色久| www.婷婷五月天| 九九综合| 激情精品久久| 99在线视频免费| 人妻精品在线| 99综合视频一体| 亚洲A片成人无码久久精品青桔| 艹B高清无码| 五月婷婷综合成人| 九九人人看| 91操片| 日本色噜| 日韩激情人伦人| 吉澤明步Av一區二區| 爱婷婷都市激情| 亚洲五月婷婷| 亚洲欧美日韩VIP| 色天使色综合| 色五月激情| 日韩99色| 天天色宗合| 五月婷婷丁香综合| 亚洲欧洲中文日韩久久AV乱码| 婷婷五月丁香激情| 中文字幕激情综合| 中文网AV| 婷婷开心六月| 婷婷五月丁香久久| AA片在线观看视频在线播放| 91综合在线观看首页| 国产 亚洲 在线| 天干天天干天天天天天| 99热网站| 五月激情站| 狠狠爱青青草| 色婷婷久久综合久色综| 五月婷婷 六月丁香| 黄色激情五月天| 91久久久久久久| 久久A极片| 日日操夜夜操无码免费| 国语对白性爱视频播放| 色婷婷亚洲六月婷婷中文字幕| 成人av免费观看| 婷婷色色网站| 日本熟妇精品99| 婷婷成人丁香色情基地30| 五月天婷婷色综合| 国产这里只有精品| 色五月婷婷AV| 狠狠擼综合| 六月激情综合| 亚洲日韩乱码一区二区三区四区| 国产精品国产| 色五月天综合| 99热爱爱干干日| 丁香五月天大香蕉啪啪| 久久婷五月婷| 色婷婷色综合激情91| 婷婷五月天改成什么了| 亚洲中文乱字字幕在线永久| 色色色网站| 婷婷六月色情| 99热精品一区| 亚洲激情网| 欧美日韩国产成人在线| 激情的五月婷婷蜜桃| 深爱激情五月网| 六月婷婷综合| 99久久精品色老| 精品草原久久视频| 99热超碰在线| 久9热视频在线观看| 伊人五月网| 久久ab| 九九超日本| 色综合久久伊伊婷婷五月| 成人五月天丁香| 99在线免费视频播放| 九九精品片一| 九九99免费视频| 人操91在线| 亚洲婷婷丁香五月天激情小说| 色色色婷婷五月天| 激情国产综合| 五月婷婷狠狠干| 免费精品99| 91色五月| 丁香五月婷婷综合精品素人| 九月婷婷人人操人人舔人人爱| 夜夜爽天天| 亚欧州精品视频| 亚洲啪啪精品| 日日操,夜夜撸| 婷婷成人五月天| 五月丁香综合啪啪| 五月天久久网站| 四色五月婷婷| 日日噜狠狠色综合久久| 天天爽天天| 色色婷婷丁香| 在线看片av| 色综合久久88| 天天操天天曰| 99久久偷拍视频| 丁香五月在线视频黑人| 97精品人人A片免费看| 久久之人妻| 操操天堂| 丁香婷婷综合激情五月色| 99热在线精品观看| 五月婷婷久久网| 婷婷五月丁香成人| 伊人在线视频| 另类图片激情五月天| 五月丁香六月激情在线| 成人欧美日韩| 人妻精品在线| 久久人人超| www.婷婷,com| 26uuu成人网| 日本人妻操| 拳交大逼| 免费观看2018www黄色操逼网站| 色五月综合激情| 91夫妻网站九色| 狠狠干在线视频| 中文字幕按摩做爰| 天干天天干天天天天天| 国外亚洲成AV人片在线观看| 久久五月人人摸| 99色色| 五月丁香拍拍激情综合| 中文字幕人成乱码在线观看| 夜夜www| 成人国产欧美大片一区| 桃色激情婷婷伊人网| 久久精品99国产精品日本| 五月情婷婷五月| 情欲禁地| 一级二级香港秋霞欧美欧美秋霞| 婷婷9月天| 26uuu亚洲精品国产| 色婷婷影视99| 可以看的av| 日本久久人| √天堂资源在线人妻熟女| 五月婷啪| 九九这里都是精品| 婷婷五月天播| 国产成人AV| 色六月天| 人操91在线| 色色99| 色玖玖综合网| 色丁香五月婷婷| 伊人综合网4| 一本婷婷丁香久久| 99热这里是精品| 999精品乱码77777| 99亚州综合精品成人网| 激情网站综合五月天| 五月婷三级片| 天天日本夜夜谢| 美欧日韩国产成人在战| 可以直接看的AV| 色欲丁香久久| 五月色激情综合网| www999日韩精品| 婷婷日在线观看| 国产黄色在线观看| 五月人妻婷婷视频| 97操在线视频| 久久精品一区二区三区四区| www.丁香五月| 久9热视频在线观看| 五月丁香六月天| 色五月天成人在线| 99热久久日本| 五月大香蕉| 丁香婷婷六月天| 狠狠 久久| 丁香五月综合婷婷| 婷婷六月丁香激情综合| 91主播在线| 午夜免费试看| 夜夜骑日日夜夜| 丁香五月最新网址| 色婷婷六月| 五月丁香色婷婷熟女| 《久久综合九色综合97婷婷| 久久这里只有精品热在99| 狠狠五月天婷婷激情网。| 91热网址| 成人做爰A片免费看网站找不到了| 综合网五月天123| 亚洲无码11| 少妇被躁爽到高潮无码文| 激情五月天小说| 五月婷婷色色| 丁香五月亚洲综合| 九九色99| 丁香五月六月激情| www.91.com黄| 婷婷色影音天| 亚洲精品影视| 激情综合网 激情五月天| 99热99精品| 欧美性猛交99久久久久99按摩| 性色天| 国产精品在线视频| 99五月婷| 少妇人妻丰满做爰XXX| 狠狠操天天干| 狠狠狠狠狠狠狠狠狠狠狠色宗合图片| 热99在线精品| 香蕉AV777XXX色综合一区| 99九九视频精彩在线| 激情的五月| 激情AV在线| 九九成人电影婷婷| 91婷婷| 五月婷婷丁香瑟瑟视频| 涩涩五月天综合| 97干在线看| 国产AV一区二区三区最新精品| 久久看婷婷| 一本伊人色婷| 99在线观看视频免费| 成人在线高清| 国产毛片精品一区二区色欲黄A片| 久久超级碰碰| 五月天精品综合| 色五月婷婷激情综合网| 天堂综合久| 丁香花社区av| 狠狠狠狠狠| 色五月五月天色婷婷色五月| 久久成人精品视频| 天天久久66xxx| 秋霞AV美国| 狠狠色丁香乆乆| 人人草人人爱| 91久久色| 深爱激情六月| 婷婷六月开心网| 高清视频一区| 天色综合网| 婷婷碰碰| 成人免费120分钟啪啪| 成人精品在线| 久色大| 天天综合影院| 丁香久久五月天视频在线观看| 婷婷久久网| 4399在线观看免费毛片| 丁香五月婷婷香| 亚洲欧洲中文日韩久久AV乱码| 激情色色| 玖玖99免费视频| 日本五月天婷婷丁香| 亚洲、热| 午夜美女人啪最红院| 婷婷天堂综合| 色综合丁香婷婷| 色综合久久8| 久久人人添人人爽添人人片αV| 97人妻碰碰中文无码久热丝袜| 久九色| 99亚洲视频| www.minyis.com【JT】实力收量可预付QQ2101460746 | 国产亚洲在线观看| 久久草中文日韩欧美| 五月丁香趴趴| 国产超碰av| 人人肏逼视频在线一区二区| 91人人人人人| 成熟妇人A片免费看网站| 99熟女| 五月天激情国产综合婷婷婷| 操碰91| 99热日韩| 91婷婷丁香| 婷婷久久99| www久久艹| 这里只有精品视频| 色五月欧美| 色五月中文网| 夜夜谢天天干| 丁香五月成人网| 草综合14| 丰满人妻一区二区三区| 综合成人小说婷婷| 色情成人五月天| 婷婷婷婷婷婷婷婷| 综合色色色| 五月婷婷在线视频观看| 天天爽天天干| 五月综合激情| 久久婷婷综合国产| 激情综合在线观看| 亚洲成人av在线| 九九碰九九爱97超| 九九色影视| 五月丁香啪啪| 九九在线视频| 国产亚洲精品久久久久久郑州| 日本欧美成人片AAAA| 亚洲精品久久久无码| 五月婷婷中文| 无套内射极品大美女| 婷婷激情综合| 99热1| 99日韩| 五月丁香六月| 亚洲精品久久久无码| 六月成人网| 1024成人免费看| 丁香五月婷婷久久久| 在线99精品| 国产精品成人AV在线| www狠狠| 五月婷婷激情四季| 激情五月综合色婷婷| 国产高清RV综合aVa| 色丁香影院| 在线观看亚洲AV| 99久久网站| www.久久| 91re色综合视频| 久久久久久久五月| 色综合久久99色| 高清无码.com| 国产美女精品| 丁香五月婷婷色情综合| 无码髙清| 色五月av| 婷色天堂| 九九超日本| 99九九在线| 婷婷五月天va| 999热在线视频| 伊人www22综合色| 狠狠色成人影片| 丁香,开心成人,久久| 大香蕉丁香| 精品婷婷| 色五月天成人在线| 久久久久这里只有精品| 色婷网| 噜噜色噜噜网| 男人天堂99| 色色热| 中文字幕精品推荐免费在线观| 激情五月色婷婷| 久久只有这里精品免费| 久久66精品| 青青草原伊人网| 99热这里| www.cao.com久久| 91色色色18| 在线五月色播| 五月色婷婷综合| 91日韩在线| 色色五月婷婷网| 香蕉久久国产av一区二区| 久久五月天婷婷视频| 国产精品久久7777777精品无码| 五月激情网站| 色五月情| 99狠狠| 六月丁香激情最新更新| 五月婷婷在线视频观看| 久操婷婷| 丁香六月综合激| 欧美五月丁香啪啪响视频| 天天操夜夜爽歪歪| 99热这里只有精品2| 婷婷综合性爱网| 久久婷婷五月丁香网| 婷婷激情区| 婷婷99狠狠躁天天躁中| 国产欧美日韩综合精品一区二区| 大香蕉久久婷婷精品综合| 久久综合网免费视频| 综合网天天| 欧美在线视频99| 超碰国产在线观看| 色婷婷激情小说网| 人人干99| 五月桃花网综合| 99啪啪视频| 婷婷色欧美激情| 99热成人| 久热久操久热久草国产91| 狠狠做五月婷婷| 日韩在线观看亚洲| www五月婷婷88导航| 人妻人人操| 综合一本道| 天天干天天干天天| 91ncm视频| 人人人人人人人草| 五月色亚洲| 大香蕉人人人| 5月丁香六月情| 色欲色香综合网| 操b视频在线观看一区二区| 丁香五月综合久久八| www.夜夜| 五月天婷婷狂暴白浆| 五月总合激情网| 五月天天天天天天天天天天天天天天天婷婷婷 | 五月丁香六月激情| 人人澡天天色天天做| 99热免费| 中文字幕在线视频播放| 丁香五月狠狠在线观看| 五月婷婷深深爱| 日本天堂网站99| 日韩激情婷婷五月天| 91久久1118| 99小视频在线观看| 香蕉色色网| AV天堂淫乩| 中文字幕在线资源| 18久久| 色婷婷先锋| 亚洲色五月| 91一起操| 久久五月天视频| 97操男人的天堂| 五月丁香六月婷婷a v| 99久在线精品99re8| AV动漫不卡无码免费| 国产午夜精品久久久观看| 国外亚洲成AV人片在线观看| aⅤ79成人片| 国产精品美女| 中文在线视频久9| 热这里| 香蕉AV777XXX色综合一区| jiqingtaose五月天| 9l视频自拍9l九色9l成人| 奇米影视777在线_在线观看午夜_h小视频在线观看_岛国大片 | 日本精品久久久久中文字幕| 日本精品在线噜噜噜| 热99精品视频五月| 69综合在线| 亚洲欧美一区二区三区四区爱爱动图| 九九在线热九九在线热99热| 欧美大奶熟女噜噜噜噜| 色综合99| 婷婷五月天堂| www.五月婷婷.com| 偷拍九九五月丁香婷婷| 《蜘蛛女》梁铮1995| 思思热99er| 少妇人妻凹凸视频| AA片在线观看视频在线播放| 婷婷欧美色| 天天拍天天操| 五月丁香六月婷婷亚洲天堂网站| 久久久久9| 天天色天天射天天日| 五月丁香操婷逼| www,色婷婷| 99九九玖玖| 国产熟女大叫受不了| www.婷婷| 色综合久久中文| 9l视频自拍9l九色9l成人| 91视频免费后入强操| 五月丁香六月婷婷姐| 日韩精品99久久| 岛国av网站| 久久思思99| 99综合网| 婷婷欧美激情综合| 色色丁香婷婷综合| 伊人激情综合网| 婷婷五月色| 五月天日日操夜夜操 | 亚洲五月花| 69精品人人人人人人| 五月婷婷丁香五月婷婷丁香| 碰碰操91| 99热综合网| 九九色综合| 久久婷婷六月综合综合| 99热 在线观看| 欧美人与性动交CCOO| 婷婷五月天激情亚洲小说| 99视频免费播放 | 色五月首页| 丁香六月 人妻| 国产黄色在线观看| 99愛国产| 在线成人av播放| 婷婷娌伦网| 亚洲不卡| 天天爱天天爽| 婷婷综合成人五月天| 97日本在线播放| 99乱视频| 97色欧美| 五月天综合色| 狠狠擼综合| 日本性视频| 久久99热免费最新版| 五月丁香六月综合基地| 婷婷啪啪| 婷婷久久国产视频| 亚洲无码影音| 无码区婷婷五月花开| 人妻九九九九| 婷婷久草| 日日操,夜夜撸| 色婷av| 99色综合| 亚洲激情无码久久| 日本色啪| 色五月婷婷老师| 丁香五月婷婷啪啪| 欧美性做爰大片免费看办公室| 色色色色av777| 色欧美日| 五月丁香啪啪综合| 激情久久天天| 中文av在线观看| 99久在线精品99re8热| 激情综合网,五月| 99re久热| 超碰女人天堂| 久久老码第一| 五月做爱| 日韩久久视频| 五月丁香啪啪激情| 久久九九经典| 色色激情五月天| 久热这里只有精品99re,久热这里只有精品7| 奇米色大香蕉| 五月色网| 国产在线另类五月婷婷| 婷丁香五月天| 五月丁香色色网| 99视频网| 操99| 五月成人丁香av91| 久碰婷婷视频| 五月丁香婷色| 在线99精品| 97福利视频| 婷婷六月丁| 久久最新色色色| www91色网站| 色婷婷www| 丁香五月五婷| 大香蕉精品视频| 五月婷婷丁香日韩在线| 婷婷婷久久久| 六月五月久久丁香| 97色天堂| 青青草免费公开视频| 99热这里只有精品8| 五月婷婷色男女| 欧美色色色色色色| 中文字幕丰满孑伦无码专区 | 四色女婷婷| 精品一区久热| 另类激情中文| 久99久在线| 欧美日韩99| 五月四色婷婷| 日本人妻久久| 秋霞成人毛片一级A片| 掩去也综合五月视频| 精品国产乱码久久久久久免费| 五月婷婷激情综合视频| 天天综合91入口| 99婷婷| 久久综合伊人综合在线| 五月天激情亚洲| 色婷婷成人网| 狠狠88综合久久久久噜噜噜| 啪啪日热| 色香久久| 狠狠夜夜五月丁香| 国产精女同一区二区三区久| 激情五月婷婷| 天天操夜夜啊| 天天综合网~91| 五月丁香好婷婷A片网| 六月婷婷之青青草| 五月天婷婷无码| 丁香色六月婷婷| 丁香伊人激情| 婷婷丁香www视频日本韩国| 亚洲激情AV| 激情宗合网激情五月天| 色一情一乱一乱91Av| 超碰成人免费| 99热6色| 国产日产成人亚洲欧美国产VA| 亚洲激情免费视频| 婷婷五月天AV| 激情 婷婷 插| 91精品91久久久中77777久久玖玖九九| 99色在线| 五月婷婷片| 亚洲操操| 久草五月丁香婷婷综合| 日本三级黄色大片| 99热这里只有精品50| 色婷婷久久综| 99在线精品免费视频| 九九热re99re6在线精品| 美女婷婷六月色| 丁香五月婷婷Av| 国产看真人毛片爱做A片| www.婷婷| 色青青视频| 成人一级片| 久久大国产香蕉| 大香蕉九九| 99re这里只有精品视频了| 九九热这里只有精品7| 国产黄色大片| 99久久婷婷国产综合| www.99热视频| 丁香成人综合| 久久新地址| 激情精品久久| 99热精品在线| 人人摸人人干| 激情 婷婷 插| 亚洲成人在线播放| 免费成人中文字幕| 免费无码毛片一区二区A片 | 婷婷五月色惰| 婷婷色色网| 97精品综合久久| 青青色com久久| 欧美精品XXXXBBBB| 久久99久久99精品免观看粉嫩| 亚洲第一视频 久久| 亚洲国产精品成人免费一区久久久在线观看AAAA| 九九久久久综合| 五月天婷婷成人网| 激情四射婷婷| 激情五月,婷婷五月,丁香五月| 立川无码av| 99九九综合久久九九| 成人 AV播放| 丁香五月花| 欧美25p| 狠狠爱婷婷丁香| 亚洲综合丁香五月天| 色婷婷在线视频久| 超碰在线看| 欧洲S级在线观看| 97色综合视频| 国精产品一区一区三区免费视频| 99热这里有精力| 久久久99免费视频| 色 色 色综合com| 天天久久综合| 青青操avbb| 色五月婷婷久久| 色爽九九| 91精品啪| 97碰 在线视频观看| 婷婷色色亚洲| 欧洲第一无人区观看|