色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

VLC 倉庫 checkasm 測試編寫完全指南:從 API 命名到匯編級驗(yàn)證與基準(zhǔn)測試

VLC 倉庫 checkasm 測試編寫完全指南:從 API 命名到匯編級驗(yàn)證與基準(zhǔn)測試 音視頻【免費(fèi)下載鏈接】vlcVLC media player - plays everything, runs anywhere. Code here: https://code.videolan.org/videolan/vlc項(xiàng)目地址https://gitcode.com/gh_mirrors/vl/vlc點(diǎn)擊查看免費(fèi)下載本篇技術(shù)指南以 VLC 倉庫test/checkasm/ext/docs/writing-tests.md為核心系統(tǒng)講解如何為 checkasmVideoLAN 自研的匯編 / SIMD 優(yōu)化實(shí)現(xiàn)測試框架編寫高質(zhì)量測試。checkasm 是 VLC 項(xiàng)目中驗(yàn)證 DSP、編解碼等優(yōu)化函數(shù)正確性與性能的關(guān)鍵基礎(chǔ)設(shè)施其完整源碼、頭文件與自測用例均位于 test/checkasm/ext。讀完本文你將掌握 checkasm 的基本測試工作流、現(xiàn)代/傳統(tǒng)兩套 API 命名、緩沖區(qū)分配與初始化、隨機(jī)參數(shù)生成、多配置循環(huán)測試、浮點(diǎn)容差比較、越界寫檢測、MMX 特例處理以及如何用固定種子、函數(shù)過濾和多種導(dǎo)出格式組織可復(fù)現(xiàn)的基準(zhǔn)測試?;緶y試結(jié)構(gòu)八步工作流checkasm 的核心思想是在同一個(gè)測試進(jìn)程里同時(shí)調(diào)用參考實(shí)現(xiàn)通常是純 C 版本和被測實(shí)現(xiàn)通常是匯編 / SIMD 優(yōu)化版本對比輸出是否一致并可選地對新實(shí)現(xiàn)做基準(zhǔn)計(jì)時(shí)。在深入高級模式之前先熟悉基本測試結(jié)構(gòu)完整可運(yùn)行示例見 getting-started.md 的 Quick Start 章節(jié)。一個(gè)典型測試的工作流包含 8 個(gè)步驟分配對齊的緩沖區(qū)存放測試數(shù)據(jù)用checkasm_declare()聲明被測函數(shù)的函數(shù)簽名用checkasm_check_func()檢查該函數(shù)是否應(yīng)當(dāng)被測試決定要不要跳過初始化測試輸入、清空輸出緩沖區(qū)分別調(diào)用參考實(shí)現(xiàn)checkasm_call_ref()與新實(shí)現(xiàn)checkasm_call_new()用checkasm_check2d()或類似函數(shù)比較兩者輸出用checkasm_bench_new()對新實(shí)現(xiàn)做基準(zhǔn)測試可選用checkasm_report()匯報(bào)結(jié)果可選。其中第 3 步至關(guān)重要checkasm_check_func()會依據(jù)命令行傳入的過濾模式--function/--test、當(dāng)前 CPU 特性集合等條件決定當(dāng)前這個(gè)函數(shù)變體是否值得測試。從 test.h 的宏定義可以看出它會同時(shí)把傳入的函數(shù)指針記錄到全局的checkasm_key_new并把查找到的參考實(shí)現(xiàn)鍵值寫入checkasm_key_ref供后續(xù)的checkasm_call_ref()/checkasm_call_new()使用#define checkasm_check_func(func, ...) \ (checkasm_key_ref \ checkasm_check_key((checkasm_key_new (CheckasmKey) (func)), __VA_ARGS__))checkasm_call_ref()與checkasm_call_new()都是宏前者展開為checkasm_call(checkasm_func_ref, ...)只做信號保護(hù)后者展開為checkasm_call_checked(checkasm_func_new, ...)除信號保護(hù)外還會檢查棧破壞、寄存器被 clobber、寄存器寬度不匹配、ABI 違規(guī)等常見匯編錯(cuò)誤詳見 test.h。API 命名約定現(xiàn)代 API 與傳統(tǒng)短別名checkasm 同時(shí)支持兩套命名風(fēng)格可以在同一個(gè)測試文件中混用?,F(xiàn)代 API推薦所有函數(shù)使用checkasm_前綴checkasm_declare(void, uint8_t *dst, const uint8_t *src, int len); checkasm_check_func(dsp-func, func_name) checkasm_call_ref(dst_c, src, len); checkasm_call_new(dst_a, src, len); checkasm_check1d(uint8_t, dst_c, dst_a, len, dst); checkasm_bench_new(dst_a, src, len); checkasm_report(func_name); checkasm_fail() checkasm_alternate(buf0, buf1) // ...傳統(tǒng)/短別名 API為方便與向后兼容checkasm 提供了更短的別名declare_func(void, uint8_t *dst, const uint8_t *src, int len); check_func(dsp-func, func_name) call_ref(dst_c, src, len); call_new(dst_a, src, len); // checkasm_check1d() 沒有短別名 bench_new(dst_a, src, len); report(func_name); fail() alternate(buf0, buf1)這些別名在 test.h 的 Short-hand Aliases 分組中集中定義例如#define call_ref checkasm_call_ref、#define declare_func checkasm_declare、#define bench_new checkasm_bench_new等。值得注意的是緩沖比較函數(shù)checkasm_check1d()/checkasm_check2d()系列沒有對應(yīng)的短別名只有checkasm_check、checkasm_check_padded這類以checkasm_開頭的別名這是刻意的設(shè)計(jì)。兩種風(fēng)格完全等價(jià)且可混用。但為了文檔與新增代碼的一致性和可讀性推薦統(tǒng)一使用帶checkasm_前綴的現(xiàn)代命名。最佳實(shí)踐緩沖區(qū)分配對齊是硬要求測試優(yōu)化實(shí)現(xiàn)時(shí)緩沖區(qū)必須按平臺要求對齊很多 SIMD 指令要求 16/32/64 字節(jié)對齊。CHECKASM_ALIGN()負(fù)責(zé)聲明帶平臺相關(guān)對齊屬性的變量BUF_RECT()更進(jìn)一步聲明一塊四周帶 padding、自動計(jì)算 stride 的矩形緩沖。// 簡單數(shù)組 CHECKASM_ALIGN(uint8_t buf[1024]); // 2D 緩沖自動加 padding 并計(jì)算 stride // - 定義 dst 為指向 64x32 可用區(qū)域的指針以及 dst_stride字節(jié)為單位 BUF_RECT(uint8_t, dst, 64, 32);重要CHECKASM_ALIGN()必須對每個(gè)緩沖區(qū)單獨(dú)使用// 正確 CHECKASM_ALIGN(uint8_t buf1[32]); CHECKASM_ALIGN(uint8_t buf2[32]); // 錯(cuò)誤 - 只有 buf1 會被對齊 CHECKASM_ALIGN(uint8_t buf1[32], buf2[32]);從 utils.h 的實(shí)現(xiàn)看CHECKASM_ALIGN(x)在 MSVC 下展開為__declspec(align(CHECKASM_ALIGNMENT)) x在 GCC/Clang 下展開為x __attribute__((aligned(CHECKASM_ALIGNMENT)))——它修飾的是緊跟其后的單個(gè)聲明這正是逐緩沖對齊要求的根源。BUF_RECT()宏會一次性生成一系列變量name_buf含 padding 的完整數(shù)組、name_stride以字節(jié)計(jì)的 stride、name_buf_h含 padding 的總行數(shù)以及指向可用區(qū)域起點(diǎn)的指針name??捎脜^(qū)域四周預(yù)留了足夠 padding為后面的越界寫檢測checkasm_check_rect_padded()打基礎(chǔ)#define BUF_RECT(type, name, w, h) \ DECL_CHECK_FUNC(*checkasm_check_impl_##name##_type, type) \ checkasm_check_impl_##type; \ CHECKASM_ALIGN(type name##_buf[((h) 32) * (CHECKASM_ROUND(w, 64) 64) 64]); \ const int name##_buf_w CHECKASM_ROUND(w, 64) 64; \ const int name##_buf_h (h) 32; \ ptrdiff_t name##_stride sizeof(type) * name##_buf_w; \ ... type *name name##_buf name##_buf_w * 16 64緩沖區(qū)初始化隨機(jī)、病態(tài)與常量三種策略checkasm 提供三類緩沖區(qū)填充函數(shù)完整清單見 utils.h 的 memory 分組// 隨機(jī)數(shù)據(jù)均勻分布 RANDOMIZE_BUF(buf); checkasm_randomize(buf, sizeof(buf)); // 等價(jià)于上面的宏 checkasm_randomize_mask8 (buf8, width, 0x0F); // 把取值范圍約束到掩碼內(nèi) checkasm_randomize_mask16(buf16, width, 1023); // 隨機(jī) 10-bit 值 // 病態(tài)測試模式邊界值、交替位、隨機(jī)字節(jié)的混合 INITIALIZE_BUF(buf); checkasm_init(buf, sizeof(buf)); // 等價(jià)于上面的宏 checkasm_init_mask16(buf16, width, (1 12) - 1); // 約束到 12-bit 范圍 // 清空為常量值 CLEAR_BUF(buf); checkasm_clear(buf, sizeof(buf)); // 等價(jià)于上面的宏 checkasm_clear16(buf16, width, 0x1234);checkasm_init()以及宏INITIALIZE_BUF()填充的是病態(tài)測試模式混合了極小值、極大值、交替位模式與隨機(jī)字節(jié)專門用于觸發(fā)潛在 bugcheckasm_clear()目前填充常量0xAA讓測試失敗時(shí)能從 hexdump 中一眼看出差異區(qū)域。對于BUF_RECT()創(chuàng)建的 2D 緩沖有對應(yīng)的矩形版本宏它們作用于含 padding 的整塊數(shù)組name_buf從而保證 padding 區(qū)域也有確定內(nèi)容可供比對BUF_RECT(uint8_t, src, 64, 32); INITIALIZE_BUF_RECT(src); // 用病態(tài)測試字節(jié)初始化 RANDOMIZE_BUF_RECT(tmp); // 填充隨機(jī)數(shù)據(jù) CLEAR_BUF_RECT(dst); // 清空為常量數(shù)據(jù)當(dāng)前為 0xAA多配置循環(huán)測試很多 DSP 函數(shù)按塊尺寸block size分派不同實(shí)現(xiàn)。應(yīng)當(dāng)在多個(gè)配置例如各種 2 的冪塊尺寸下循環(huán)測試保證覆蓋全面BUF_RECT(uint8_t, src, 128, 128); BUF_RECT(uint8_t, dst_c, 128, 128); BUF_RECT(uint8_t, dst_a, 128, 128); checkasm_declare(void, uint8_t *dst, ptrdiff_t dst_stride, const uint8_t *src, ptrdiff_t src_stride, int w, int h); // 測試各種 2 的冪塊尺寸從 4x4 到 128x128 for (int h 4; h 128; h 1) { for (int w 4; w 128; w 1) { if (checkasm_check_func(get_func(w), func_%dx%d, w, h)) { // 初始化測試數(shù)據(jù) - 放在循環(huán)內(nèi)部為每個(gè)測試選擇不同的數(shù)據(jù)模式 INITIALIZE_BUF(src); CLEAR_BUF(dst_c); CLEAR_BUF(dst_a); // 測試該配置 checkasm_call_ref(dst_c, dst_c_stride, src, src_stride, w, h); checkasm_call_new(dst_a, dst_a_stride, src, src_stride, w, h); checkasm_check_rect_padded(dst_c, dst_c_stride, dst_a, dst_a_stride, w, h, dst); // 基準(zhǔn)測試該配置 checkasm_bench_new(checkasm_alternate(dst_a, dst_c), dst_a_stride, src, src_stride, w, h); } } } checkasm_report(func);這里的checkasm_check_func()名稱支持 printf 風(fēng)格格式化如func_%dx%d會在報(bào)告中形成func_4x4、func_8x8這樣清晰的命名。使用隨機(jī)參數(shù)用checkasm_rand()及相關(guān)函數(shù)生成多樣化的測試輸入實(shí)現(xiàn)見 utils.h 的 rng 分組// 隨機(jī)整數(shù) int byte checkasm_rand() 0xFF; uint32_t flags checkasm_rand_uint32(); // 隨機(jī)浮點(diǎn) double d checkasm_randf(); // [0.0, 1.0) float f (float) checkasm_randf() * 100.0f; // [0.0, 100.0) // 正態(tài)分布 double normal checkasm_rand_norm(); // mean0, stddev1 checkasm_randomize_normf(buf, len); // 用 N(0,1) 填充緩沖區(qū)rng 分組還提供checkasm_rand_int32()、checkasm_rand_dist()、checkasm_randomize_dist/distf/range/rangef等變體它們都基于CheckasmConfig中指定的種子未指定時(shí)按當(dāng)前時(shí)間取種因此可復(fù)現(xiàn)——這正是后面確定性測試一節(jié)的基礎(chǔ)。組織報(bào)告用checkasm_report()把相關(guān)的函數(shù)分組匯報(bào)。推薦的模式是一個(gè)函數(shù)組一個(gè) check_ 函數(shù) 一次 reportstatic void check_add_functions(const DSPContext *dsp) { // 測試多個(gè)相關(guān)函數(shù) for (int bpc 8; bpc 12; bpc 2) { if (checkasm_check_func(get_add8(bpc), add8_%dbpc, bpc)) { // Test add8 } if (checkasm_check_func(get_add16(bpc), add16_%dbpc, bpc)) { // Test add16 } } // 對整個(gè)組匯報(bào)一次 checkasm_report(add); }對于只有少數(shù)幾個(gè)函數(shù)、沒有邏輯分組、或?qū)儆陔s項(xiàng)函數(shù)的非常簡單的測試checkasm_report()可以省略。任何其后沒有checkasm_report()調(diào)用的函數(shù)將隱式地以測試本身的名字被匯報(bào)。注意這只有在這些函數(shù)是某個(gè)測試中最后被測試的函數(shù)時(shí)才有意義因?yàn)橹笕魏蝐heckasm_report()調(diào)用都會把之前所有函數(shù)納入其中該行為自 v1.0.1 起見 test.h。常見測試模式模式一2D 緩沖區(qū)處理處理帶 stride 的 2D 緩沖區(qū)如濾波、運(yùn)動補(bǔ)償?shù)暮瘮?shù)是 checkasm 最典型的應(yīng)用場景static void check_filter(const DSPContext *dsp) { // 定義帶 padding 的 64x64 緩沖區(qū) BUF_RECT(uint8_t, src, 64, 64); BUF_RECT(uint8_t, dst_c, 64, 64); BUF_RECT(uint8_t, dst_a, 64, 64); checkasm_declare(void, uint8_t *dst, ptrdiff_t dst_stride, const uint8_t *src, ptrdiff_t src_stride, int w, int h); for (int w 4; w 64; w 1) { if (checkasm_check_func(dsp-filter, filter_w%d, w)) { // 測試多個(gè)高度 for (int h 4; h 64; h 1) { INITIALIZE_BUF_RECT(src); CLEAR_BUF_RECT(dst_c); CLEAR_BUF_RECT(dst_a); checkasm_call_ref(dst_c, dst_c_stride, src, src_stride, w, h); checkasm_call_new(dst_a, dst_a_stride, src, src_stride, w, h); // 連 padding 一起檢查 checkasm_check_rect_padded(dst_c, dst_c_stride, dst_a, dst_a_stride, w, h, dst); } // 只對全高度配置做基準(zhǔn) checkasm_bench_new(checkasm_alternate(dst_a, dst_c), dst_a_stride, src, src_stride, w, 64); } } checkasm_report(filter); }模式二有內(nèi)部狀態(tài)的函數(shù)對會修改內(nèi)部狀態(tài)或有副作用的函數(shù)關(guān)鍵在于讓參考實(shí)現(xiàn)與被測實(shí)現(xiàn)從完全相同的初始狀態(tài)出發(fā)static void check_decoder(const DecoderContext *dec) { DecoderState state_c, state_a; uint8_t bitstream[128]; // 用隨機(jī)數(shù)據(jù)初始化比特流 RANDOMIZE_BUF(bitstream); checkasm_declare(int, DecoderState *state, const uint8_t *data, int len); if (checkasm_check_func(dec-decode, decode)) { // 把兩個(gè)狀態(tài)初始化為相同 init_decoder_state(state_c, bitstream, 128); init_decoder_state(state_a, bitstream, 128); // 解碼并比較 int result_c checkasm_call_ref(state_c, bitstream, 128); int result_a checkasm_call_new(state_a, bitstream, 128); // 比較返回值 if (result_c ! result_a) { if (checkasm_fail()) { fprintf(stderr, return value mismatch: %d vs %d\n, result_c, result_a); } } // 比較最終狀態(tài)可選 // // 該檢查是否成立取決于 DecoderState 是否含 padding 字節(jié) // 或不確定的內(nèi)部狀態(tài) checkasm_check1d(uint8_t, state_c, state_a, sizeof(DecoderState), decoder state); checkasm_bench_new(state_a, bitstream, 128); } checkasm_report(decode); }注意checkasm_fail()的用法它記錄失敗并返回 1 僅當(dāng)用戶請求了詳細(xì)診斷輸出如--verbose時(shí)因此把fprintf包在if (checkasm_fail())分支里即可實(shí)現(xiàn)靜默失敗、按需診斷。模式三多輸出函數(shù)對產(chǎn)生多個(gè)輸出值的函數(shù)例如同時(shí)算方差與和需要逐一比較每個(gè)輸出static void check_stats(const DSPContext *dsp) { CHECKASM_ALIGN(uint8_t buf[64 * 64]); checkasm_declare(int, const uint8_t *buf, int len, unsigned *variance, unsigned *sum); if (checkasm_check_func(dsp-compute_stats, compute_stats)) { unsigned var_c, var_a, sum_c, sum_a; INITIALIZE_BUF(buf); int result_c checkasm_call_ref(buf, 64*64, var_c, sum_c); int result_a checkasm_call_new(buf, 64*64, var_a, sum_a); // 比較所有輸出 if (result_c ! result_a || var_c ! var_a || sum_c ! sum_a) { if (checkasm_fail()) { fprintf(stderr, result: %d vs %d, var: %u vs %u, sum: %u vs %u\n, result_c, result_a, var_c, var_a, sum_c, sum_a); } } checkasm_bench_new(buf, 64*64, var_a, sum_a); } checkasm_report(compute_stats); }模式四自定義輸入生成對于需要特定測試模式的函數(shù)例如變換類函數(shù)可以自行構(gòu)造最壞情況輸入// 生成最壞情況輸入來壓測實(shí)現(xiàn) static void generate_worst_case(uint16_t *buf, int len, int bitdepth_max) { // 創(chuàng)建倒序排列的輸入值序列 for (int i 0; i len; i) buf[i] (len - 1 - i) bitdepth_max; } static void check_transform(const DSPContext *dsp) { #define WIDTH 64 CHECKASM_ALIGN(int16_t src [WIDTH]); CHECKASM_ALIGN(int16_t dst_c[WIDTH]); CHECKASM_ALIGN(int16_t dst_a[WIDTH]); checkasm_declare(void, int16_t *dst, const int16_t *src, int width); if (checkasm_check_func(dsp-transform, transform)) { // 同時(shí)測試隨機(jī)輸入與最壞情況輸入 for (int pattern 0; pattern 2; pattern) { if (pattern 0) { INITIALIZE_BUF(src); // 隨機(jī)輸入 } else { generate_worst_case(src, WIDTH, 32767); // 最壞情況模式 } CLEAR_BUF(dst_c); CLEAR_BUF(dst_a); checkasm_call_ref(dst_c, src, WIDTH); checkasm_call_new(dst_a, src, WIDTH); checkasm_check1d(int16_t, dst_c, dst_a, WIDTH, dst); } checkasm_bench_new(checkasm_alternate(dst_a, dst_c), src, WIDTH); } checkasm_report(transform); }高級主題浮點(diǎn)結(jié)果比較ULP 與絕對容差匯編實(shí)現(xiàn)與 C 參考實(shí)現(xiàn)因計(jì)算順序不同浮點(diǎn)結(jié)果不可能逐位一致必須用容差比較。checkasm 提供兩套方案ULPUnits in Last Place末位單位容差與絕對 epsilon 容差完整 API 見 utils.h 的 floatcmp 分組static void check_float_func(const DSPContext *dsp) { #define WIDTH 128 CHECKASM_ALIGN(float src [WIDTH]); CHECKASM_ALIGN(float dst_c[WIDTH]); CHECKASM_ALIGN(float dst_a[WIDTH]); checkasm_declare(void, float *dst, const float *src, int len); if (checkasm_check_func(dsp-process_float, process_float)) { checkasm_randomize_normf(src, WIDTH); checkasm_call_ref(dst_c, src, WIDTH); checkasm_call_new(dst_a, src, WIDTH); // 用 ULP 容差比較 // 注意這里不能用 checkasm_check1d() const int max_ulp 1; checkasm_check2d(float_ulp, dst_c, 0, dst_a, 0, WIDTH, 1, dst, max_ulp); // 或用絕對 epsilon 容差 // if (!checkasm_float_near_abs_eps_array(dst_c, dst_a, 1e-6f, WIDTH)) { // checkasm_fail(); // } checkasm_bench_new(checkasm_alternate(dst_a, dst_c), src, WIDTH); } checkasm_report(process_float); }float_ulp是checkasm_check2d()支持的特殊類型名會路由到checkasm_check_impl_float_ulp()聲明見 utils.h其最后一個(gè)可變參數(shù)即為max_ulp。浮點(diǎn)工具集還包含checkasm_float_near_ulp()、checkasm_float_near_abs_eps_ulp()、checkasm_double_near_abs_eps()及對應(yīng)的數(shù)組版本以及無前綴的短別名float_near_ulp等。padding 與越界寫檢測很多匯編內(nèi)核會順手多寫幾個(gè)元素例如按 SIMD 寬度對齊。checkasm_check_rect_padded()系列能把 padding 區(qū)域也納入比對從而檢測函數(shù)是否寫越界static void check_bounds(const DSPContext *dsp) { BUF_RECT(uint8_t, dst_c, 64, 64); BUF_RECT(uint8_t, dst_a, 64, 64); checkasm_declare(void, uint8_t *dst, ptrdiff_t stride, int w, int h); if (checkasm_check_func(dsp-fill, fill)) { const int w 64, h 64; CLEAR_BUF_RECT(dst_c); CLEAR_BUF_RECT(dst_a); checkasm_call_ref(dst_c, dst_c_stride, w, h); checkasm_call_new(dst_a, dst_a_stride, w, h); // 標(biāo)準(zhǔn)檢查不含 padding checkasm_check2d(uint8_t, dst_c, dst_c_stride, dst_a, dst_a_stride, w, h, dst); // 帶 padding 檢測檢測 w×h 之外的寫入 checkasm_check_rect_padded(dst_c, dst_c_stride, dst_a, dst_a_stride, w, h, dst); // 允許右邊緣最多越寫 16 個(gè)元素對齊導(dǎo)致的越寫 checkasm_check_rect_padded_align(dst_c, dst_c_stride, dst_a, dst_a_stride, w, h, dst, 16, 1); checkasm_bench_new(checkasm_alternate(dst_a, dst_c), dst_a_stride, w, h); } checkasm_report(fill); }從 utils.h 的宏定義看checkasm_check_rect_padded()展開為checkasm_check2d_padded(type, ..., align_w1, align_h1, padding8)——即默認(rèn)允許 1 個(gè)元素的對齊越寫、檢查 8 個(gè)元素的 padding 帶checkasm_check_rect_padded_align()則允許你自定義align_w/align_h文檔中的16, 1表示只允許右邊緣最多越寫 16 個(gè)元素。更底層的checkasm_check2d_padded()接受align_w、align_h、padding三個(gè)額外參數(shù)align_h0可關(guān)閉上下邊緣的越寫檢查。與之配套的一維版本是checkasm_check1d_padded()但它因?qū)崿F(xiàn)原因不接受變參如需float_ulp檢查請改用align_h0的checkasm_check2d_padded()。多配置基準(zhǔn)測試與幾何平均checkasm_bench_new()可以在同一個(gè)checkasm_check_func()塊內(nèi)多次調(diào)用框架會把所有計(jì)時(shí)結(jié)果累積并以幾何平均匯報(bào)這非常適合多個(gè)尺寸合并成一個(gè)綜合數(shù)字的場景if (checkasm_check_func(dsp-filter, filter_w%d, w)) { for (int h 4; h 64; h 1) { // 對所有高度做正確性測試 checkasm_call_ref(dst_c, dst_c_stride, src, src_stride, w, h); checkasm_call_new(dst_a, dst_a_stride, src, src_stride, w, h); checkasm_check2d(uint8_t, dst_c, dst_c_stride, dst_a, dst_a_stride, w, h, dst); // 對每個(gè)配置做基準(zhǔn) checkasm_bench_new(checkasm_alternate(dst_a, dst_c), dst_a_stride, src, src_stride, w, h); } // 框架對同一 checkasm_check_func() 的所有基準(zhǔn)運(yùn)行匯報(bào)幾何平均 } checkasm_report(filter_w%d, w);除此之外還有兩種策略對每個(gè)配置單獨(dú)調(diào)用checkasm_check_func()以獲得每個(gè)尺寸獨(dú)立的基準(zhǔn)報(bào)告或者只對最大的輸入尺寸調(diào)用checkasm_bench_new()以考察極限行為具體取舍討論見 benchmarking.md 的 Choosing Configurations 一節(jié)。多 Bitdepth 測試對支持多種位深bitdepth的編解碼函數(shù)一種做法是在循環(huán)內(nèi)按位深重建 DSP 上下文并約束隨機(jī)數(shù)據(jù)范圍static void check_pixfunc(void) { DSPContext dsp; #define WIDTH 64 CHECKASM_ALIGN(uint16_t src [WIDTH]); CHECKASM_ALIGN(uint16_t dst_c[WIDTH]); CHECKASM_ALIGN(uint16_t dst_a[WIDTH]); checkasm_declare(void, uint16_t *dst, const uint16_t *src, int len); for (int bpc 10; bpc 12; bpc 2) { const int bitdepth_max (1 bpc) - 1; dsp_context_init(dsp, checkasm_get_cpu_flags(), bpc); if (checkasm_check_func(dsp-process, process_%dbpc, bpc)) { // 在合法位深范圍內(nèi)隨機(jī)化 checkasm_randomize_mask16(src, WIDTH, bitdepth_max); checkasm_call_ref(dst_c, src, WIDTH); checkasm_call_new(dst_a, src, WIDTH); checkasm_check1d(uint16_t, dst_c, dst_a, WIDTH, dst); checkasm_bench_new(checkasm_alternate(dst_a, dst_c), src, WIDTH); } } checkasm_report(process); }這里checkasm_randomize_mask16(src, WIDTH, bitdepth_max)保證輸入始終落在合法位深范圍如 10-bit 時(shí)不超過 1023避免無意義的比較。另一種思路是把測試文件本身編譯多次用預(yù)處理器宏如-DBITDEPTH10區(qū)分位深。自定義失敗報(bào)告當(dāng)返回值或內(nèi)部狀態(tài)需要更細(xì)粒度的診斷時(shí)可以在checkasm_fail()分支內(nèi)打印自定義信息static void check_complex(const DSPContext *dsp) { // ... if (checkasm_check_func(dsp-complex, complex)) { for (int param 0; param 16; param) { int result_c checkasm_call_ref(param); int result_a checkasm_call_new(param); // 檢查返回值 if (result_c ! result_a) { if (checkasm_fail()) { // 僅當(dāng)用戶請求詳細(xì)錯(cuò)誤診斷時(shí)才執(zhí)行此分支 fprintf(stderr, return mismatch for param%d: %d vs %d\n, param, result_c, result_a); } } } } checkasm_report(complex); }checkasm_fail()的返回值語義在 test.h 中有明確文檔1 表示失敗詳情應(yīng)當(dāng)被詳細(xì)打印0 表示靜默。它展開為checkasm_fail_func(%s:%d, __FILE__, __LINE__)自動附帶失敗位置。通過 wrapper 間接調(diào)用函數(shù)當(dāng)被測函數(shù)必須通過一個(gè) wrapper 間接調(diào)用時(shí)使用checkasm_call()和checkasm_call_checked()調(diào)用任意輔助函數(shù)。此時(shí)checkasm_declare()聲明的函數(shù)類型必須是 wrapper 的類型而不是傳給checkasm_check_func()的內(nèi)部函數(shù)類型內(nèi)部函數(shù)的指針可以通過無類型的checkasm_key_ref/checkasm_key_new取得typedef int (my_func)(int); // 調(diào)用實(shí)際函數(shù)的 wrapper static int sum_upto_n(my_func *func, int count) { int sum 0; for (int i 0; i count; i) sum func(i); return sum; } static void check_wrapper(void) { // 聲明 wrapper 的簽名而非內(nèi)部函數(shù)的簽名 checkasm_declare(int, my_func *, int); if (checkasm_check_func(get_my_func(), my_wrapped_func)) { const int count checkasm_rand() % 100; // 把 checkasm_key_new 轉(zhuǎn)型為合適的類型并傳給 wrapper const my_func *my_ref (my_func *) checkasm_key_ref; const my_func *my_new (my_func *) checkasm_key_new; int sum_c checkasm_call(sum_upto_n, my_ref, count); int sum_a checkasm_call_checked(sum_upto_n, my_new, count); if (sum_c ! sum_a) checkasm_fail(); } }注意在這種模式下傳給checkasm_check_func()的值甚至不必是函數(shù)指針——它可以是任意指針或指針大小的整數(shù)如配置結(jié)構(gòu)體、分發(fā)表索引只要它能唯一標(biāo)識被測的底層實(shí)現(xiàn)即可。checkasm_call()只提供信號處理用于調(diào)用參考實(shí)現(xiàn)等名義上安全的代碼checkasm_call_checked()才做完整校驗(yàn)棧保護(hù)、寄存器 clobber 檢測等見 test.h因此被測的優(yōu)化實(shí)現(xiàn)應(yīng)當(dāng)用checkasm_call_checked()。MMX 函數(shù)的特殊處理x86x86 上的 MMX 函數(shù)常常在返回前省略emms指令期望調(diào)用方在循環(huán)結(jié)束后手動執(zhí)行。emms用于在任何浮點(diǎn)代碼執(zhí)行前清空 MMX 狀態(tài)但它非常慢所以優(yōu)化過的循環(huán)通常在循環(huán)末尾才執(zhí)行一次以最小化開銷。對這種不合 ABI 的函數(shù)使用checkasm_declare_emms()static void check_sad_mmx(const DSPContext *dsp) { #define SIZE 16 CHECKASM_ALIGN(uint8_t src [SIZE * SIZE]); CHECKASM_ALIGN(uint8_t ref [SIZE * SIZE]); // 聲明 CPU_FLAG_MMX 后每當(dāng)該標(biāo)志激活時(shí)會在調(diào)用本函數(shù)后自動執(zhí)行 emms checkasm_declare_emms(CPU_FLAG_MMX, int, const uint8_t *src, const uint8_t *ref, ptrdiff_t stride); if (checkasm_check_func(dsp-sad_16x16, sad_16x16)) { INITIALIZE_BUF(src); INITIALIZE_BUF(ref); // checkasm 會在 checkasm_call_new() 之后自動調(diào)用 emms int result_c checkasm_call_ref(src, ref, SIZE); int result_a checkasm_call_new(src, ref, SIZE); if (result_c ! result_a) { if (checkasm_fail()) { fprintf(stderr, sad mismatch: %d vs %d\n, result_c, result_a); } } // 基準(zhǔn)迭代之后 checkasm 同樣會調(diào)用 emms checkasm_bench_new(src, ref, SIZE); } checkasm_report(sad); }第一個(gè)參數(shù)是 CPU 標(biāo)志掩碼如CPU_FLAG_MMX | CPU_FLAG_MMXEXT當(dāng)掩碼中的任一 CPU 標(biāo)志激活時(shí)checkasm 會在每次checkasm_call_new()和基準(zhǔn)運(yùn)行之后調(diào)用emms。在非 x86 平臺上checkasm_declare_emms()等價(jià)于checkasm_declare()見 test.h 的條件宏定義?,F(xiàn)代 SIMD 指令集SSE 及以后不使用 MMX 寄存器因此不需要emms。只對純 MMX 代碼或顯式使用 MMX 寄存器的 MMXEXT 函數(shù)使用checkasm_declare_emms()。提示與技巧確定性測試固定種子checkasm 使用帶種子的 PRNG 保證測試可復(fù)現(xiàn)。傳入一個(gè)位置參數(shù)即可使用指定種子./checkasm 12345 # 使用種子 12345失敗時(shí)會打印實(shí)際使用的種子便于復(fù)現(xiàn)checkasm: using random seed 987654321 ... sad_16x16: FAILED (ref:1234 new:1235)從 checkasm.h 的CheckasmConfig看種子相關(guān)的字段是seed與seed_setseed非零或seed_set非零時(shí)使用給定種子否則按當(dāng)前時(shí)間取種repeat字段還可以讓測試用連續(xù)多個(gè)種子重復(fù)運(yùn)行設(shè)為 -1 時(shí)幾乎窮舉所有種子用于窮盡式測試。選擇性測試只測試匹配特定模式的函數(shù)或測試模塊# 只測試匹配模式的函數(shù) ./checkasm --functionadd_* # 只測試特定的測試模塊 ./checkasm --testmath # 兩者組合 ./checkasm --testdsp --functionblend_*--test/--function對應(yīng)CheckasmConfig中的test_pattern/function_pattern字段shell 風(fēng)格通配符NULL 表示運(yùn)行全部。還可使用--list-tests、--list-functions、--list-cpu-flags查看可用的測試、函數(shù)與 CPU 特性清單getting-started.md 中的--help輸出列出了全部選項(xiàng)。詳細(xì)輸出啟用 verbose 模式以獲取詳細(xì)的失敗信息./checkasm --verbose當(dāng)使用內(nèi)置的checkasm_check*()系列緩沖比較助手時(shí)verbose 模式會自動對被差異區(qū)域輸出 hexdump該行為在 utils.h 的checkasm_check2d()文檔中有明確說明?;鶞?zhǔn)測試用適當(dāng)?shù)臅r(shí)長運(yùn)行基準(zhǔn)# 快速基準(zhǔn)默認(rèn)時(shí)長 ./checkasm --bench # 更長時(shí)間的基準(zhǔn)以獲得更精確結(jié)果每個(gè)函數(shù) 10ms ./checkasm --bench --duration10000 # 以不同格式導(dǎo)出結(jié)果 ./checkasm --bench --csv results.csv ./checkasm --bench --json results.json ./checkasm --bench --html results.html--duration以微秒為單位控制每個(gè)函數(shù)的基準(zhǔn)時(shí)長--csv/--json/--html對應(yīng)CheckasmConfig.format的CHECKASM_FORMAT_*枚舉值。checkasm 的統(tǒng)計(jì)方法對數(shù)正態(tài)分布建模、log 空間線性回歸、幾何平均、no-op 開銷校正與結(jié)果解讀cycles、時(shí)間、相對加速比(vs ref)列詳見 benchmarking.md。輔助宏用輔助宏減少重復(fù)代碼#define TEST_FILTER(name, w, h) \ if (checkasm_check_func(dsp-name, #name _%dx%d, w, h)) { \ test_filter_##name(dsp, w, h); \ checkasm_bench_new(dst, dst_stride, src, src_stride, w, h); \ } // 用法 TEST_FILTER(blur, 16, 16); TEST_FILTER(blur, 32, 32); TEST_FILTER(sharpen, 16, 16);與框架配置銜接從測試到完整程序writing-tests.md聚焦于測試函數(shù)內(nèi)部的寫法而一個(gè)可運(yùn)行的 checkasm 程序還需要在main()中注冊測試與 CPU 特性。這部分的完整示例見 getting-started.md 的 Quick Start核心模式是填充CheckasmConfig定義于 checkasm.h后交給checkasm_main()int main(int argc, const char *argv[]) { CheckasmConfig config { .tests tests, // CheckasmTest 數(shù)組{0} 結(jié)尾 .cpu_flags cpu_flags, // CheckasmCpuInfo 數(shù)組{0} 結(jié)尾 .cpu detect_cpu_flags(), }; return checkasm_main(config, argc, argv); }checkasm 會按cpu_flags數(shù)組中聲明的順序增量式遍歷 CPU 特性集合每個(gè)后續(xù)特性繼承之前已激活的標(biāo)志set_cpu_flags回調(diào)負(fù)責(zé)更新你的全局函數(shù)分發(fā)表測試函數(shù)內(nèi)可用checkasm_get_cpu_flags()查詢當(dāng)前激活標(biāo)志以選擇對應(yīng)實(shí)現(xiàn)。框架內(nèi)部還提供了一系列校驗(yàn)?zāi)芰π盘柼幚韈heckasm_set_signal_handler_state()、棧破壞檢測checkasm_push_stack_guard()/checkasm_pop_stack_guard()、x86 上 MMX 狀態(tài)清理checkasm_clear_cpu_state()這些在 test.h 的 internal 分組中均有定義。checkasm 自身的自測用例如 tests/x86/tests.c就通過故意 clobber 寄存器DEF_NOOP_FUNC(clobber_r0)等與故意寫壞棧corrupt_stack_x86來驗(yàn)證這些檢測機(jī)制確實(shí)生效。下一步掌握測試編寫之后可以繼續(xù)閱讀 benchmarking.md學(xué)習(xí)如何利用 checkasm 的基準(zhǔn)測試能力精確度量并比較優(yōu)化實(shí)現(xiàn)的性能——包括對數(shù)正態(tài)分布統(tǒng)計(jì)建模、log 空間線性回歸、幾何平均匯總、no-op 開銷校正以及關(guān)閉 CPU 頻率縮放、禁用 turbo boost 等系統(tǒng)級最佳實(shí)踐。贊分享音視頻【免費(fèi)下載鏈接】vlcVLC media player - plays everything, runs anywhere. Code here: https://code.videolan.org/videolan/vlc項(xiàng)目地址https://gitcode.com/gh_mirrors/vl/vlc點(diǎn)擊查看免費(fèi)下載相關(guān)推薦如何用 XPipe 統(tǒng)一管理所有服務(wù)器一份完整上手指南如何用 XPipe 統(tǒng)一管理所有服務(wù)器一份完整上手指南 XPipe 是一款開源的本地連接中樞加遠(yuǎn)程文件管理器讓你在桌面上用統(tǒng)一界面管理 SSH、Docker音視頻3步掌握WanVideo_comfyComfyUI視頻生成模型終極整合指南3步掌握WanVideo_comfyComfyUI視頻生成模型終極整合指南 WanVideo_comfy是一個(gè)專為ComfyUI設(shè)計(jì)的視頻生成模型整合工具它音視頻Snapshot report for test.jsSnapshot report for test.js The actual snapshot is saved in test.js.snap . Gener測試上一篇【親測免費(fèi)】 jOOQ - 更優(yōu)雅地處理 Java SQL 編程下一篇【親測免費(fèi)】 Crawler4J - Web爬蟲框架創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
91人人| 操逼日批| 久久视网78| 丝袜熟女一区二区三区| 日韩性爱1级片视频| 男女国产精品| 久久精品无码不卡| 舔舔啊| 欧美熟妇人体| 亚洲 图片 综合91| 啊啊啊啊嗯嗯嗯用力好爽| 中文字幕一区二区三区高清| 污色区网站| 99热99re6国产在线播放| 国产怡红院| 亚洲无码?第一页| 成人av在线播放| 97se亚洲综合自| 丝袜高跟澳门91视频| 蜜桃精品一区二区三区ww| 亚洲少妇综合在线播放| 欧美丰满少妇xx高潮| 亚洲色人阁| 婷婷久草| 丝袜色综合| 美骚妇av高清在线| 国产久久久久影院老熟女| 欧美一二三区四五区| 天天天天操| 乱伦3P视频| 1级午夜影院费免区| 久久夜夜| 不卡啪啪视频| 91精品啪在线观看国产城中村| 97超碰人人模人人拍人人| 97碰碰色| 婷婷爽人人婷婷爽视频| 国产三级在线现体验区| 5278欧美一区二区三区| 日本在线不卡一二区| 911粉嫩人妻| 岛国黄色短视频| 无码最新| 日亚韩精品视频二区三| 国产日本久久免费精品| 欧苏综合色综合| 久久草草欧美精品| 成人久久久精品| 超碰久久综合| 野狼福利社区| 午夜视频好爽啊| 岛国大片在线观看网站入口| 黑人精品成人一区二区三区| 激情五月天视频| 色99视频| 久久最新视频免费观看| 欧美—性—交—色| 久久97| 被窝影院午夜看片无码| 亚洲免费成人在线高清无码视频 | 牛黄色久午久| 九九热免费国产视频婷婷伊人五月 | 日韩人妻少妇 一区二区三区| 婷婷丁香熟妇综合网| 国产日韩欧美三级片| 伊人色综合超碰| 亚洲天天影视综合网| 9久久美女首页| 成年人免费观看网站| 久热伊人| 人人操人人操人人操人人操人人操人人人11.CM | 大香蕉丝袜一级片| 东北老女人的激情视频| 96超碰网| 三级AV入口| 亚洲中文字幕网| 暖暖精品二区三区观看| 中文字幕在线免费观看| 日韩操p| 欧美视频在线视频免费va| 91neishe| 久久久性少妇| 成人精品久久久午夜福利| 9999免费精彩视频| 九草九九九| 国产操逼网站亚洲一级黄色| 色狠狠综合| 色五月第四色| 懂色aV一区二区天美传媒| 26uuu性物| 亚洲av无码成人精品国产| 亚洲色图a| 欧美在线|亚洲| 久久受www免费人成| 国产亚洲禁久一区二区| 亚洲天堂,男人| 欧美性爱免费短视频| 久久国内| 欧美亚洲宗合色性图| 九久久九九久视频| 婷婷中文网| 超碰1024久久| 日本人妻中文字幕| 亚洲熟妇丝袜在线观看| 国产精品免费久久久久久久久久| www.激情| 天天欧美| 亚洲激情综合| 欧美日韩一二三| 93人人操人人| 2026国产精品视频| 国产91乱伦| 激情四射婷婷四五月天| 青娱乐淫乱1314| 色色99| 久久日韩肥臀| 六月丁香啪啪啪| 欧美日韩精品青青| 婷婷丁香六月天| 一二区在线观看视频| 欧美日韩黄片精品在线| 超碰97资源中文字幕| 综合夜夜| 日本不卡高清免v欧美日韩在线观看| 玖玖大干人妻| 综合色色网| 九99久久| 九九热免费国产视频婷婷伊人五月 | 日本三级中国三级99人妇网站| 久草精品一区| 丁香激情网| 在线洲亚线| 色婷五月| 亚洲欧洲中文日韩女优乱码| 人人操超碰在线| 国产精品自产拍在线观看社区| 少妇丝袜在线观看AV| 国产亚洲精品农村妇女| 欧美第二页午夜| 热99这里只有精品| 91欧美少妇| 999岛国大片| 中文字幕精品码亚洲| 婷婷五月天伊人| 亚洲天堂男人天堂网| 久久天天摸| 2023天天操夜夜操| 东北操逼| 91人妻爽爽人人做人人澡| 静品嫩模一区二区| 91岛国动作片| 国产精品亚洲四五区在线观看| 天天弄天天操| 久草看看看| 欧美熟女激情| 激情色色| 久久成年片色大黄全免费网站| 亚洲限制级| 自拍大香蕉乱插| 屁股久久久久久| 大香蕉在线86| 97久久视频| 美女裸体无遮挡永久免费观看网站| 久久e6只有精品| 欧美操逼熟女| 四虎精品一区二区| 91欧美综合在线| 91操人视频| 青娱乐休闲视频在线观看| 中文字幕97色| 九九亚洲| 少妇高潮特黄A片| 偷偷人人精品女女久久| 久久人妻一区二区三区高清| 国内黄色精品| 色色激情五月天| 黄色激情电影在线观看| 天天综合中文字幕 91| 97一区二区三区视频| 爱做久久久久久| 操一操摸一摸| 精品福利| 久久久日本电影| 国产地址二三| 一区| 中美日韩毛片| 东北女人av| 717影院理论午夜伦八戒| 亚洲最大成人a毛毛片| 国产精品香蕉| 麻豆国产精品午夜视频| 日韩人妻一区二区| 超碰美女97| 久久久精品一区二区| 大香蕉在线视频重口味毛片在线| 久久综合日韩亚洲欧美| 美国美女AV在线| 亚洲AV无码国产成人| 人人操人人操人人人操| 一区二区免费电影久久| 婷婷伊人五月| 亚洲一区二区三区四区视频| 曰本人妻人人澡人人夹| 日韩三A大片在线观看| 偷拍盗拍亚洲色图图片| 天天综合官网| 天天拍夜夜| 极品美女嘿咻| 91人妻在线视频| 色五月av| 国产品精品自在在线午夜免费| 九九九不卡| 黄色一区三区| 亚洲天堂另类| juliaann丝袜| 丝袜色综合| 超碰综合97在线| 中国黄色特级精品一区二区三区片| 蜜桃中文字日产乱幕4区| 国产av高清版| 屌妞视频久久久久久久| 走光一区92下载| 日本精品性生活久久久| 国产欧美后入| 全国男人天堂网| 亚洲人精品久久久| 亚洲国产精品无石码久久| 亚洲欧美97| 97碰碰色| 一本色道无码DVD中文字幕| 天天综合网日韩| 天天噜| 99色网| 综合久久久久久久久91| 三级特黄60分钟播放| 国产日韩精品无码去免费专区国产| 国产精品原创巨作?v网站| av网站国产主播在线| 澳门黄片一香蕉视频| 国产精品久久天天干| 裸模AV女优| 另类图片综合| 东方亚洲在线操逼天堂| 欧美天天影院| 超碰97亚洲| 一区操逼| 91GD.COM| 97超碰热线| 在线一区| 午夜欧美精品久久久| 91日韩国产欧美亚洲另类精盘州至城都| 中文字幕乱码在线观看| av在线一区二区三区| 欧洲熟妇xxXx欧美老妇裸体| 国产专区路线| 97久久久久久久久久| 97中文综合| 欧美色图20p| 国产中出内射一区二区| 婷婷色中文字幕| 五月婷婷六月丁香| 国产少妇高潮| 国产乱子伦一区二区三区在线观看| 伊人网青青| 噜噜吧,噜噜色,噜噜| 久久的网站啊啊啊啊啊| 日韩欧美中文字幕搭讪巨乳美人妻视频| 1区2区3区视频| se01国产在线视频| 一区| 青青在线视频日韩欧美| 国产福利影视| 99www.bibizy香蕉资源国产一区二区三区高清 | 久久久91| 最新日产中文在线麻豆| 国产传媒1234区| 亚洲欧美综合网| 亚洲天天做日日做天天谢日日 | 青青草依人大香蕉| 乱伦av.com| 久久婷婷色综合一区二区三区| 日韩精品一区,二区 九九...老司机| 9Ⅰ超碰| 搡老人老9丨女老熟人| 久久99操天天日| 一区,二区,三区视频| 97干在线视频| 欧洲无码一区二区| 久久日韩肥臀| 久久高清欧美国产| 欧美天天在线| 欧美大香蕉同搞| 日本加勒比无码专区| 日韩一级成人毛片免费观看| 超碰地址97| 国产福利一区二| 天天躁日日躁AAAXX| 美女干逼2| 日韩一级欧美一级国产一级台湾| 成人日本视频人妻在线| 亚洲色图片区| 91丨九色丨大屁股| 亚洲色图 91| 户外裸露刺激视频第一区| 日本精品性生活久久久| 黄色大香焦1级‘′‘| 久草新免费| 超碰97人妻免费在线| 国产原创精品| 家庭乱伦国产| 60秒免费视频| 色五月婷婷久久| 亚洲女优有码无码高清| 超碰日本97美女人妻人人玩人人爱| 97日韩欧美亚洲| 强免费黄色网址| 一区二区三区一亚洲中文字幕、综合区灬| www色色com| 欧美日韩另类激情图片| 大香蕉碰| 超碰人人操97碰| 久热久| av爱爱爱| 999熟女精品| 亚洲精品美女久久久久久久久| 国产精品白丝AV| 色情五月丁香| 亚洲在线网站| 色超碰综合| 国产精品老师| 欧美18 在线观看| 天堂射| 八人操人人摸人人看| 综合性视频99| 污到发麻的视频 国产| 中文字幕一区二区三区字幕| 蜜臀久久99精品久久久久久成人小说 | 先锋精品av色鲁| a片 xxxx受爽视频| #NAME?| 婷婷伊人綜合中文字幕| 丰满人妻一区二区三区色-百度| 色一情一乱一乱一区91Av| 国产成人久久精品蜜臀| 4tube欧美女厕所| 色呦呦、国产精品| 国产精品久久久久久片| 欧美性xxxxx狂欢| 久久综合久色欧美综合狠狠 | 99色热| 人人贴人人摸| 国产亚洲色停停久久99精品91| 麻豆一区在线| 九九九九久久久| 久久五月份| 亚洲欧美色图小说| 久久久久国色αv免费观看| 动漫片子网站3黄| 国产精品久久久久久久毛片1| JuliaAnnXXX888| 精品亚洲俞拍视频一区| 成人丁香五月| 国产精品69人妻无码久久久| 一级性爱视频免费观看| 亚洲a色| Aa东京男人的天堂| 91国产大片| 69精品少妇一区二区三区蜜桃| 超碰成人公开| 搡老女人老妇女AAA一VU麻豆| 东北毛片| 欧美天天射| 欧美第一页| 躁躁日曰躁2020| 五月丁香大香蕉| 亚洲天堂一区二区久久| 欧美性爱日韩高清| 亚洲一区二区三区春色| 国产精品ww久久| 97爱亚洲| 96久久久久| 精品国产乱码久久久久久久久久毛片| 九九九精品一区二区无码| 狠狠久久亚洲欧美专区| 天天干天天爽| 丁香激情网| 中文字幕在线日亚洲9| 亚洲成熟国产精品美女| 91社操逼| 久久一级无码精品毛片6| 探花一区二区三| 日韩欧洲操屄视频| 视频黄色国产一级| 特级毛片特黄久久免费看| 精品人妻一区二区视频| 日韩 欧美 视频 在线 一区| 操日韩第| 久久免费精品视频免一| 99久久网站| 亚洲夜夜欢无码一区二区| 天天干天天狼在线视频| 最新国产亚洲精品精品国产亚洲综合 | 国产三级中文有码在线视频| 午夜福利免费福利视频| 九九色图| 91在线色综合| 强上我不卡卡| 欧美成不卡网| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 欧美熟女丝袜| 怡红院亚洲怡春院av| 亚洲中文字幕av| 日本女人久久久| 日日爱99| 啪啪视频亚洲第一| 久久精品国产96精品亚洲拳交| 午夜丁香| oumeisetu综合| 久久爱97| 精品无吗m| 中日韩一区二区三区欧美| 青娱乐福利99| 久久亚洲欧美中文字幕国语| 伊人久久大香大香线蕉中文| 久久天天性久久伊人| 四虎免费看黄| 90后后入| 亚洲影院无码在线| 成片免费播放| 成人日本精品九区| 日韩综合第八区国产精品| 91搡老女人老妇女老熟女歌词翻译| 91国产操逼视频| 婷婷丁香五月天综合东京热| 欧美激情综合| 青青草久久| 国产400孕妇孕交群| 性久久久| 日韩乱码Av| 九九九九九九九九九九精品视频| 久久久无码视频| 国产成年免费大片黄在线观看| 色婷网| 东北女人的毛片| 亚洲天堂男| 日韩性爱小视频在线观看| 色性荡荡荡荡视频| 少好三P| 日韩黄片视频试看| 日韩精品.久久精品.AV女优.天美传媒| 嫩草影院永久在线制服丝袜| 看全色黄大色大片免费视频| 91Chinese在线| 91天美传媒在线观看| 懂色av一区二区三区天美传媒| 福利伊人玖玖国产| 中 文字幕一区二区三四 五 区日 日 骚| 国产精品一二三| 国产精品国产自产高清AV| 精品精品精品| 熟妇一区二区| 色色综合网站| 亚洲天堂少妇| 欧美视频一区二区在线| 中文字幕综合人妻| 欧美日韩国产成人高清| 欧美亚洲国内自拍| 99av| 男人天堂2012| 国产精品人妻无码久久久互動交流| 欧美性爱五月天| 天美传媒av一区二区| 国产精品国产自产高清AV| 亚洲少妇色| 国内一级精品| 不卡在线一区,精品一区二区三区中| 久久久91福利姬| 在线国产福利网址导航| 超碰这里有精品| 色欲日韩欧美在线一区| 91热色| 久久久久国产精品喷潮免费观看臀| 久久e6只有精品| 亚洲日本激情| 操逼999| 日韩性爱人人爱人人操| 懂色av中文字幕一区二区三区天美| 伊人激情五月天一区二区| 天美传媒Av在线| 欧美一级久久久丰满| 青青11操操操操操操操操| 人妻精品一区二区| 亚洲综合色男人网| 18+91网站| 青青欧美在线| 国产大陆天天艹| 风骚少妇视频中文字幕| 午夜精品视频777| 久操免费在线| 熟女自慰久久久| 99热99在线播放激情| 男人天堂久久精品不卡| 99在线无码精品秘 入口黑人| 国产AV天美传媒一区二区三区| 97摸视频| 青青在线视频日韩欧美| 欧美性战999| 日本性爱少妇| 免费视频一二三区| 97国产天堂岛| 五月丁香综合激情| 校园激情狠狠四射| 天天看特黄的免费网站| 色婷婷视频| 亚洲色婷婷综合久久一区二区三区| 99热在线观看| 韩国成人精品久久久免费看| 97久久超碰国产精品| 丰满少妇一区二区三区专区| 亚洲天堂AV在线播放| 国产精品一区二区三区在线| 亚洲丝袜色图| 日韩精品一区的| 日韩欧美性吧婷婷乱伦大香蕉 | 日本高清免费一本视频在线观看| 69久久久久久久久久久久久| 麻豆国产尤物AV| 色官网色综合| 国产精品懂色tv影视免费观看| 人妻天天爽| 91亚洲精品青草| 日本午夜精品理论片A级APP发布| 在线中文字幕| 天堂亚洲欧美| 欧美天天在线| 久久精品99久久久久久| 91精品国产综合久久久蜜臀| 大地资源在线观看中文第二页| 欧洲性爱无码区| 亚洲色婷婷综合久久久久中文| 影音先锋一区二区在线资源| 人妻激情偷乱视频一区二区三区 | 大香蕉中文| 九九九九一级| 91丝袜美女视频| 蜜桃午夜视频一区二区| 国产盗摄美女如厕大神作品在线观看 | 一及黄久一点| 亚洲国产一区二区三区在线| 五月天久久久| 国产男女无套视频免费观看| 中国少妇XXXX做受| 粉嫩av久久一区二区三区| 香蕉视频欧美一卡二卡| 中文字幕乱码在线观看| 国产精品午夜福利| 少妇的嫩逼图片| 日本精品一区二区三| 97一区二区三区视频| 免费人人搞97| surenchaopeng| 天天日日本| 91撸色网 玖玖网 欧美| 国产13区| 美女毛片999| 青青国产在线拍揄自揄拍| 三级片大波波| 天天天乱色综合全| 少妇专区一二三四五| 超碰这里只有精品| 粉嫩AV输入| 蘋果手機免費看成人Av| 激情四射五月天| 一区二区三区四区久久视1| 国产精品久久久久久久久久久久久久久久久久 | 成年人黄色| 色哟哟av| 欧洲精品一级二级精品综合视频综合 | 久久免费99精品久久久久久| 亚洲码在线中文在线观看| 人妻一区二区三区四区视频| 日韩成人高清一区二区| 欧美十八禁视频| 亚洲天堂在线怕怕视频| 亚洲第一黄色av网站 | 大香网伊人久久综合网eew| 日日日骚女人精品| 一区二区播放| 干超碰碰熟女| 亚洲 日本 国产 综合| 色综合av男人天堂| 巨爆乳肉感一区二区三区竹菊影视| 99∨VTV| 性色中出| 久操影视| 91美女在线| 中文字幕乱码人妻二区三区| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 中文字幕一区日韩精| 草草影院在线视频| 国产精品高潮久久AV| 国产性刺激| 性交一区二区在线播放| 怡红院成人视频| 天天做天天爱夜夜爽毛片试看| 国产高清成人mv在线观看| 丁香五月激情网| 久久av网| 麻豆天天躁天天揉揉AV| 精品日韩人妻精品一二三区| 免费综合亚洲中文| 久九干| 欧美日韩一干二干| 2017亚洲天堂| 亚洲欧美在线观看2021| 国产天天骚| 夜夜高潮夜夜爽国产伦精品| 日本淫乱女一区二区三区视频| 黑人操一区二区| 天堂精品在线| 377p欧洲日本亚洲大胆| 欧美性生活综合| 97se综合网| 一区二区三区一亚洲中文字幕、综合区灬| 久久久久亚洲三级电影| 欧美成人都市人妻| 男人把坤坤插入女人的下体| 91精品国产91综合久久蜜臀| 国产黄色av大片网站| 亚洲有码 视频一区| 大香蕉日亚洲日本亚大| 欧在线一二区| 超碰九色| 美女天天干| 国产日韩欧美中文在线播放| 熟女日韩| 97欧美精品| 免费A V在线| 亚洲精品 欧美精品| 人妻一区二区三区四区视频 | 久久久精品,3| 99久国产精品午夜性色福利| 国产视频一区二区在线| 夜夜欢天天干| av九九| 日本不卡中文| 探花激情视频| 国产91丝袜在线播放蜜月| 一线黄色免费性爱片| 偷拍亚洲高清图片| 人人操欧美风骚| 日本一区三级韩国| 中文乱码字幕观看视频| 99色在线| 欧美性高潮在线| 免费观看的av| 亚洲不雅视频1区二区| 婷婷导航| 78久久| 国产熟女少妇一区| 黄色视频高清无码网站| 九九九网页| 女人天堂av在线播放| 啊啊啊 在线观看| 97爱爱爱| 丁香婷婷激情五月天无毒不卡| 午夜福利国产欧美日韩夜夜| 蜜桃久久综合视频| 日本不卡二区| 欧美在线视频播放| 狠狠色噜噜狠狠狠狠狠色综合久久 | 97人人爱人人做人人乐| 人人操人人插 - 百度 - 百度| 黄色乱论网站| 亚洲97在线| 国产性感在线观看| 18啪啪手机免费性爱| 91欧美性| 久久免费精彩视频| 东北毛片| 久久人妻无码毛片A片麻豆| 99久久久er直播网址| 国产综合久| 97亚洲国产影视| 亚洲日韩视频二区| 骚逼自拍99| 九九热在线视频| 日韩欧美性爱电影在线观看| 天天看高清麻豆| 九九激情网| 精品熟女呻吟久久91| 久久久久亚洲精品| 久久精品国产72国产精品福利 | 在线观看无码三级少妇| 乱伦熟女论坛| 无码 有码 国产18p| 蜜桃久久综合视频| 家庭乱伦国产| 九九热av| 久久久久久久久久黄色网| 欧美强奸乱| 少妇综合| 免费观看性欧美一级| 人妻免费观看| 国产精品情侣啪啪| av网页一区二区三区| 男人的天堂免费| 91久久久视| 日本人体九九九九九九| 老熟女乱子伦中文字幕一区二区| 天堂亚洲欧美| 中文字幕欧美日本乱码一线二线| 色综合一区二区三巨| 中文字幕交换人妻| 97超碰磁| 91情色在线| 黄色十八禁| 国产熟女一区二区丰满| 免费看日本操逼视频| A级毛片在线看免费| 久久大香蕉97| 精品久久艹| 成人精品电影| 六月婷婷五月丁香| 人妻aa| 桃花色综合影院| 欧美一级二级三级| 中文字幕免费在线观看| 国产小炒后入式| 久久侵犯人妻爽爽爽| 手机在线播放国产福利| 26uuu成人影片| 国产97亚洲| 日韩BBN| 精品欧美日韩在线观看| 国产AV天美| 天天干天天日天天射黄色| 桃色五月天| 大香蕉一线视频| 欧美成人四级在线播放| 巨爆乳一区二区爆乳区| 操逼A∨| 野狼福利社区| 九九九色| 99中文字幕| 亚洲Av诱惑| 国产成人五月天丁香花| 97久久综合网| 大香蕉2017| 91总综合网| 日韩美女高潮喷水视频| 亚洲 欧美 另类 日韩 人妻一区| 亚洲熟妇丝袜在线观看| 久久国产视频专区一二三| 麻豆视频test| 男人的天堂.com| 91色综合激情| 久久亚洲熟妇在线视频| 96爱综合| 免费97视频| 超碰视97中文| 久草综合网| 综合夜夜| 久久精品 六十路 熟女 欧美| 伊人影院日本| 人人做天天爱| 日韩A优精品在线观看| 天天色综亚洲91污| 亚洲精品视频在线| 久久久久精| 69综合网| 超碰在线综合97| 97亚洲在线| 襙一襙| 国产高清26uuu| 亚洲偷拍自拍在线视频| 夜色五月天| 97超碰热线| 久久人人爽av亚洲精品天堂桃色| 国内外激情在线| 免费操逼91| 高清无码在线播放网站| 蜜乳性色无码专日粉嫩骚逼AV| 九九色精品| 又黑又大又粗| 久久久专区| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 少妇大屁屁| 久久人妻| 国产高清免费不卡av| 91|九色|国产熟女| 青青草吊丝| 骚鸭AV| 婷婷av在线中文字幕| 欧亚乱色熟女一区二区| 国产精品老熟女一区二区| 亚洲吊色| 久久精品电影在线| 人人操人人操人人操人人操人人操人人人11.CM | 欧洲亚洲人妻无码中字久久三区四区 | 精品国产Av无码久久久伦古装| 在线色导航| 激情婷婷五月天| 亚洲综合九| 国产400孕妇孕交群| 欧美另类精品xxxx| 99成人| 国产无遮挡| 欧美九九九| 6080YYY午夜理论片在线观看| 亚洲老熟妇xxx| 婷婷久草| 成人无遮挡毛片免费看| 69人妻人人揉人人躁人人精品| 伊人视频| 色翁荡息又大又硬又粗又爽| 97蜜桃综合| 风间由美日韩欧美久久| 无码精品久久久天天影视| 精品久久久av| 日韩欧视频| 极品尤物自安慰| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 亚洲美女 晚间男人天堂 | 亚洲久久天堂| 日韩国产在线观看av| 国产农村妇女精品一| 国语精品av| 中文字幕精品资源在线| 亚洲日韩XXX| 国模无码人体一区二区三| 九色 人妻 大香蕉| 久热这里只有精品9| 中文字幕AV乱伦| 超碰97资源大奶| 国产成年女黄特黄| 江都AV在线| 天天综合~91| 日韩欧美女优电影| 少妇综合网| 日本特黄f c2| 久久久久夜夜夜夜| 91丨国产丨白浆| 四方色播| 亚洲综合97中文网| 99久久无码| 日本裸体久久色噜噜| 亚洲色图欧美| 久久精品欧美一区蜜桃| 夜夜爽夜夜操| 神马久久久久眼| 精品人妻中文字幕高清| 91逼逼女人91| 精品国产乱码| 日韩视频小说在线观看| 无码人妻精品一区二区三区99不卡| 亚洲影院小综合| 久久精品 六十路 熟女 欧美| 欧美性天天影视| 中英熟女操女| 99啪啪| 亚洲国产麻豆一区二区三区| 国产精品乱码久久久久久久| 日本性爱少妇| 夜夜爽夜夜操| 91人妻超碰| 综合av社区| 狠狠操狠狠燥| 青青草日韩无码| 欧美性爱精品七区| 久久色一区二区| 另类 日韩 熟女| 97在线公开视频| 啪啪视频mP4| 国产最火爆久久国产网站网站| 亚洲 欧美 综合 91| 久久久久婷婷| 国际精品久久久| 91女在线观看| 国产精品视频麻豆入口| 99少妇| 人妻精品4K4K4K4K4| 久久黄色性爱视频| 黄页| 91欧美性| 成人夜夜爽| 日逼视频日本| 欧美亚洲系列| 金典av| 99精品网| 欧美裸体美女日麻屄| 劲爆欧美人妖三区91| 五月婷婷影院| 亚洲va有码在线天堂| 亚洲男人天堂2017| 人人澡综合涩| 五月天婷婷成人网| 亚洲国产精品无码AV在线| 99re超碰| 9997se| 97se综合网| 色婷网| 日韩在线一区高清在线| 成人无码欧美一级A片狼牙直播| 观看视频图片一区二区三区| 日本理论在线| 麻花传媒免费网站在线观看| 97操| 97美日韩视频| 锕锕好爽 死我在线观看| 国产在线不卡导航| 99re视频在线观看这里只有精品| 国产精品久久久久久久AV大片| 一区二区三区不卡视频| 一区二区三区男人的天堂| 国产久久一区二区三区野外在线| 五月丁香大香蕉| 无码国产精品久久久久| 精品三级在线专区| 久久久青青草| 色69大色97香蕉| 九九av| 天堂精品小草| 中文字日本乱码| 91男女啊啊啊| 婷婷五月影院| 天天躁日日躁AAAXX| 国产综合网站在线播放| 中国一级操逼视频| 久久在线观看免费视频| 青青草毛片| 97亚洲中文| 亚洲色图日韩丝袜制服一区二区五月在线| 美女黑人91神马| 日本天天人人狠狠在线日美女| 久久五月丁香| 一区二区三区激情在线观看| 粉嫩av久久一区二区三区| 国产精品久久久久无码Av网曝门| 91青青草| 天天噜| 免费国产视频| 少妇精品久久| 久久精品人妻一区| 亚洲天堂男人天堂网| 欧美性暴力| 9999久久久| 天堂亚洲精品| 友优传媒精品在线一区二区| 麻豆色99999| 78超碰| 97爱综合| 国产福利视频精品视频| 国产成人 综合亚洲 天堂| 五月天婷婷在线看| www熟女乱伦com| 青青免费在线视频一区| 日韩中文字幕视频| 黑人猛交| 亚洲国产美女久久久久 | 操逼www.| 中文字幕精品一区欧美| 夜夜操美女| 欧美亚洲尤物久久| 国产做?爰片久久毛片?片美国| 在线视频免费播放一区| 成人精品在线| 超碰三级秋霞| 国产精品青青草| 精品久久久久久久久久久久| 亚洲欲| 欧美性爱超碰97| 久久六六| 色呦呦呦在线观看视频| 国模少妇一区二区三区| 天天综合网国产| 欧美老妇综合网| 中文一区二区| 999精品女人| 天天影视色香欲综合网小说| 国产一级特黄大片处女| 欧美综合区| 久久久久9久久久久| 99色日| 91性网| 亚洲AV成人无码一二三久久| 尤物国产一区在线观看| 五月天婷婷综合网| 国产精品欧美激在线| 熟妇一区,二区,三区。| 综合97| 国产精品岛国片在线观看| 日产狠狠干| 欧美天堂超碰97| 97视频免费播放| 狼狼色丁香久久婷婷综合五月| 久久老子无码午夜伦不卡| 日韩97超碰中文字幕| 久久一区二区加油站| 伊人久久AV诱惑悠悠| 久干9操| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 最近2019中文字幕国语免费版| 五月婷婷色| 久久99精品九九久久久婷婷| 色欧洲| 欧美久久人人网| 国产精品2020| 日本免费二区三区| 在线一道啪| 一区二区久久天天干狠狠| 久草电影网| 性暴力欧美猛交在线直播| 亚州宗合另类| 中文字幕av一区二区三区人妻少妇| 本道综合精品| 丰满高潮18xxxx| 96AV久久久| 久夜视频| 婷婷综合五月| 国产日韩中文字幕欧美| se吧提供91精品国产91久久久久久 | 日欧美色| 青草成人免费视频一COm| 亚欧日韩成人| 久久97资源 网| 久久黄人人爽视频| 大香蕉之青青草原| 国产91亚洲精品一区二区三区| 九九香蕉网| www.成人无码| 色噜噜精品一区二区三| 嗯嗯啊啊好疼| www.久久制服糖| 一区二区精品更新提醒| 国产精品久久久| 在线观看AV不卡| 欧美成人精品一区| 99久久综合| 亚州五月| 操逼视频亚洲| 欧美大干日韩| 加勒比久久综合网高清| 好舒服视频| aa片毛片| 曰韩欧美国产传媒麻豆第一区| 男同专区一区二区三区在线| 精品超碰国产| yazhouzaixian| 亚洲aV无码成人在线观看| 人妻黑丝袜电影| 一级黄色性爱A级片| 亚洲欧美setu| 一区二区三区黄色片a| av东京热男人的天堂| 亚洲图片激情综合另类| 九九九九免费高| 亚洲少妇综合在线播放| 九九久久国产精品怡红院| 久久男女激情视频网站| 欧综合网| 国产熟女少妇一区| 熟女激情综合网| 蜜臀久久久国产| av日韩在线观看电影| 91男人综合| 国产原创精品| av一区二区三区不卡| 国产欧洲精品亚洲午夜拍精品| 亚洲砖码砖专无区2023| 男人综合网| 宅男午夜在线视频| 狠狠色狠狠色狠狠五月| 偷拍新久久| 情侣开房子拍 日韩无码 女的很漂亮| 97亚洲综合影院| 色娱乐色呦呦夜夜夜夜av| 中国一区二区亚洲人妻| 亚洲图片91| 亚91亚洲网| 1769精品一区二区三区| 精品久久97观看在线视频| 免费看污网站| 免费公开人人操| 97久久超碰日韩精品| 久久色一区| 日韩性爱小视频在线观看| 熟女熟妇一区二区三四区| 欧美熟女激情| 色爱三区| 精品蜜乳AV免费观看| 骚女高跟AV在线| 五月天色图影视| 婷婷色综合欧美日韩| 欧洲精品欧洲精品| 国产辣妈在线视频福利| av凤凰久久久| 欧洲与亚洲欧美精品中文字幕| 2020国产精品| 免费精品中文字幕| 亚洲av强奸乱伦| 久久99热这里只频精品6学生| 国产精品一二三在线看| 亚欧高清在线| 97爱免费插| 中文乱码99| wwe 天天干.com| 久九九九九九九九热| 美女诱惑爱爱| 亚洲国产91精品一区二区久久| 欧美综合中文| 熟女欧美日韩综合婷婷| 天天添天天干电影| 黄色av片三级三级三级免费看| 肉动漫无遮挡h在线观看| 欧美与日韩97| 色 婷97| 欧美性爱五月天| 国产亚洲禁久一区二区| 九九精品网| 91日日夜夜| 91真人天天在线| 亚洲不卡不卡中文字幕不卡| 九九久久精品| 亚洲黄色a级片| 色操逼网| 亚洲欧美999| 欧美成人精品欧美一级乱黄一区二…| 大香网伊人久久综合网eew| 伊人青青一区成人视频在线观看区| 嗯啊不要啊在线| 亚洲欧美第一页| 另类欧美综合| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 国产92麻豆天美精品色欲5| 三级激情网站| 视频一区二区免费在线| 日本精品一区二区三区四区的功能| 久久人妻一区二区三区高清| 91综合国产精品| 97操97色| 美女诱惑爱爱| 美国美女AV在线| 男人亚洲91首页在线| 午夜精品99久久久久传媒| 激情第四色| 操狠狠| 黄色视频特级毛片| 国产激情在线| 午夜色婷婷| 亚洲av无码成人精品国产| 九九精品热| 这里只有精品视频在线| 私色综合网| 亚洲日本韩国在线| 色色无码| 九九久久久久久爱| 欧美最婬乱婬爆婬性视频 | 国产中出内射一区二区| 精品人妻久久久久一区二区三区|