国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲AV片高清资源在线观看_国模无码一区二区三区久久_国产成年人未进视频_中文字幕无码精品夜_一区二区三区在线视频免费看_亚洲成AV人片在线观看网址_日本激情视频高清综合久久_亚洲午夜视频福利_国内大量揄拍人妻精品視_久久国产精品福利二区三区

ARTICLE DETAIL

資訊詳情

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

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

VLC 倉庫 checkasm 測試編寫完全指南:從 API 命名到匯編級驗證與基準(zhǔn)測試 音視頻【免費下載鏈接】vlcVLC media player - plays everything, runs anywhere. Code here: https://code.videolan.org/videolan/vlc項目地址https://gitcode.com/gh_mirrors/vl/vlc點擊查看免費下載本篇技術(shù)指南以 VLC 倉庫test/checkasm/ext/docs/writing-tests.md為核心系統(tǒng)講解如何為 checkasmVideoLAN 自研的匯編 / SIMD 優(yōu)化實現(xiàn)測試框架編寫高質(zhì)量測試。checkasm 是 VLC 項目中驗證 DSP、編解碼等優(yōu)化函數(shù)正確性與性能的關(guān)鍵基礎(chǔ)設(shè)施其完整源碼、頭文件與自測用例均位于 test/checkasm/ext。讀完本文你將掌握 checkasm 的基本測試工作流、現(xiàn)代/傳統(tǒng)兩套 API 命名、緩沖區(qū)分配與初始化、隨機參數(shù)生成、多配置循環(huán)測試、浮點容差比較、越界寫檢測、MMX 特例處理以及如何用固定種子、函數(shù)過濾和多種導(dǎo)出格式組織可復(fù)現(xiàn)的基準(zhǔn)測試。基本測試結(jié)構(gòu)八步工作流checkasm 的核心思想是在同一個測試進(jìn)程里同時調(diào)用參考實現(xiàn)通常是純 C 版本和被測實現(xiàn)通常是匯編 / SIMD 優(yōu)化版本對比輸出是否一致并可選地對新實現(xiàn)做基準(zhǔn)計時。在深入高級模式之前先熟悉基本測試結(jié)構(gòu)完整可運行示例見 getting-started.md 的 Quick Start 章節(jié)。一個典型測試的工作流包含 8 個步驟分配對齊的緩沖區(qū)存放測試數(shù)據(jù)用checkasm_declare()聲明被測函數(shù)的函數(shù)簽名用checkasm_check_func()檢查該函數(shù)是否應(yīng)當(dāng)被測試決定要不要跳過初始化測試輸入、清空輸出緩沖區(qū)分別調(diào)用參考實現(xiàn)checkasm_call_ref()與新實現(xiàn)checkasm_call_new()用checkasm_check2d()或類似函數(shù)比較兩者輸出用checkasm_bench_new()對新實現(xiàn)做基準(zhǔn)測試可選用checkasm_report()匯報結(jié)果可選。其中第 3 步至關(guān)重要checkasm_check_func()會依據(jù)命令行傳入的過濾模式--function/--test、當(dāng)前 CPU 特性集合等條件決定當(dāng)前這個函數(shù)變體是否值得測試。從 test.h 的宏定義可以看出它會同時把傳入的函數(shù)指針記錄到全局的checkasm_key_new并把查找到的參考實現(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ī)等常見匯編錯誤詳見 test.h。API 命名約定現(xiàn)代 API 與傳統(tǒng)短別名checkasm 同時支持兩套命名風(fēng)格可以在同一個測試文件中混用?,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è)計。兩種風(fēng)格完全等價且可混用。但為了文檔與新增代碼的一致性和可讀性推薦統(tǒng)一使用帶checkasm_前綴的現(xiàn)代命名。最佳實踐緩沖區(qū)分配對齊是硬要求測試優(yōu)化實現(xiàn)時緩沖區(qū)必須按平臺要求對齊很多 SIMD 指令要求 16/32/64 字節(jié)對齊。CHECKASM_ALIGN()負(fù)責(zé)聲明帶平臺相關(guān)對齊屬性的變量BUF_RECT()更進(jìn)一步聲明一塊四周帶 padding、自動計算 stride 的矩形緩沖。// 簡單數(shù)組 CHECKASM_ALIGN(uint8_t buf[1024]); // 2D 緩沖自動加 padding 并計算 stride // - 定義 dst 為指向 64x32 可用區(qū)域的指針以及 dst_stride字節(jié)為單位 BUF_RECT(uint8_t, dst, 64, 32);重要CHECKASM_ALIGN()必須對每個緩沖區(qū)單獨使用// 正確 CHECKASM_ALIGN(uint8_t buf1[32]); CHECKASM_ALIGN(uint8_t buf2[32]); // 錯誤 - 只有 buf1 會被對齊 CHECKASM_ALIGN(uint8_t buf1[32], buf2[32]);從 utils.h 的實現(xiàn)看CHECKASM_ALIGN(x)在 MSVC 下展開為__declspec(align(CHECKASM_ALIGNMENT)) x在 GCC/Clang 下展開為x __attribute__((aligned(CHECKASM_ALIGNMENT)))——它修飾的是緊跟其后的單個聲明這正是逐緩沖對齊要求的根源。BUF_RECT()宏會一次性生成一系列變量name_buf含 padding 的完整數(shù)組、name_stride以字節(jié)計的 stride、name_buf_h含 padding 的總行數(shù)以及指向可用區(qū)域起點的指針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ū)初始化隨機、病態(tài)與常量三種策略checkasm 提供三類緩沖區(qū)填充函數(shù)完整清單見 utils.h 的 memory 分組// 隨機數(shù)據(jù)均勻分布 RANDOMIZE_BUF(buf); checkasm_randomize(buf, sizeof(buf)); // 等價于上面的宏 checkasm_randomize_mask8 (buf8, width, 0x0F); // 把取值范圍約束到掩碼內(nèi) checkasm_randomize_mask16(buf16, width, 1023); // 隨機 10-bit 值 // 病態(tài)測試模式邊界值、交替位、隨機字節(jié)的混合 INITIALIZE_BUF(buf); checkasm_init(buf, sizeof(buf)); // 等價于上面的宏 checkasm_init_mask16(buf16, width, (1 12) - 1); // 約束到 12-bit 范圍 // 清空為常量值 CLEAR_BUF(buf); checkasm_clear(buf, sizeof(buf)); // 等價于上面的宏 checkasm_clear16(buf16, width, 0x1234);checkasm_init()以及宏INITIALIZE_BUF()填充的是病態(tài)測試模式混合了極小值、極大值、交替位模式與隨機字節(jié)專門用于觸發(fā)潛在 bugcheckasm_clear()目前填充常量0xAA讓測試失敗時能從 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); // 填充隨機數(shù)據(jù) CLEAR_BUF_RECT(dst); // 清空為常量數(shù)據(jù)當(dāng)前為 0xAA多配置循環(huán)測試很多 DSP 函數(shù)按塊尺寸block size分派不同實現(xiàn)。應(yīng)當(dāng)在多個配置例如各種 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)部為每個測試選擇不同的數(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會在報告中形成func_4x4、func_8x8這樣清晰的命名。使用隨機參數(shù)用checkasm_rand()及相關(guān)函數(shù)生成多樣化的測試輸入實現(xiàn)見 utils.h 的 rng 分組// 隨機整數(shù) int byte checkasm_rand() 0xFF; uint32_t flags checkasm_rand_uint32(); // 隨機浮點 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中指定的種子未指定時按當(dāng)前時間取種因此可復(fù)現(xiàn)——這正是后面確定性測試一節(jié)的基礎(chǔ)。組織報告用checkasm_report()把相關(guān)的函數(shù)分組匯報。推薦的模式是一個函數(shù)組一個 check_ 函數(shù) 一次 reportstatic void check_add_functions(const DSPContext *dsp) { // 測試多個相關(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 } } // 對整個組匯報一次 checkasm_report(add); }對于只有少數(shù)幾個函數(shù)、沒有邏輯分組、或?qū)儆陔s項函數(shù)的非常簡單的測試checkasm_report()可以省略。任何其后沒有checkasm_report()調(diào)用的函數(shù)將隱式地以測試本身的名字被匯報。注意這只有在這些函數(shù)是某個測試中最后被測試的函數(shù)時才有意義因為之后任何checkasm_report()調(diào)用都會把之前所有函數(shù)納入其中該行為自 v1.0.1 起見 test.h。常見測試模式模式一2D 緩沖區(qū)處理處理帶 stride 的 2D 緩沖區(qū)如濾波、運動補償?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)) { // 測試多個高度 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)鍵在于讓參考實現(xiàn)與被測實現(xiàn)從完全相同的初始狀態(tài)出發(fā)static void check_decoder(const DecoderContext *dec) { DecoderState state_c, state_a; uint8_t bitstream[128]; // 用隨機數(shù)據(jù)初始化比特流 RANDOMIZE_BUF(bitstream); checkasm_declare(int, DecoderState *state, const uint8_t *data, int len); if (checkasm_check_func(dec-decode, decode)) { // 把兩個狀態(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時因此把fprintf包在if (checkasm_fail())分支里即可實現(xiàn)靜默失敗、按需診斷。模式三多輸出函數(shù)對產(chǎn)生多個輸出值的函數(shù)例如同時算方差與和需要逐一比較每個輸出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)造最壞情況輸入// 生成最壞情況輸入來壓測實現(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)) { // 同時測試隨機輸入與最壞情況輸入 for (int pattern 0; pattern 2; pattern) { if (pattern 0) { INITIALIZE_BUF(src); // 隨機輸入 } 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); }高級主題浮點結(jié)果比較ULP 與絕對容差匯編實現(xiàn)與 C 參考實現(xià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其最后一個可變參數(shù)即為max_ulp。浮點工具集還包含checkasm_float_near_ulp()、checkasm_float_near_abs_eps_ulp()、checkasm_double_near_abs_eps()及對應(yīng)的數(shù)組版本以及無前綴的短別名float_near_ulp等。padding 與越界寫檢測很多匯編內(nèi)核會順手多寫幾個元素例如按 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 個元素對齊導(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 個元素的對齊越寫、檢查 8 個元素的 padding 帶checkasm_check_rect_padded_align()則允許你自定義align_w/align_h文檔中的16, 1表示只允許右邊緣最多越寫 16 個元素。更底層的checkasm_check2d_padded()接受align_w、align_h、padding三個額外參數(shù)align_h0可關(guān)閉上下邊緣的越寫檢查。與之配套的一維版本是checkasm_check1d_padded()但它因?qū)崿F(xiàn)原因不接受變參如需float_ulp檢查請改用align_h0的checkasm_check2d_padded()。多配置基準(zhǔn)測試與幾何平均checkasm_bench_new()可以在同一個checkasm_check_func()塊內(nèi)多次調(diào)用框架會把所有計時結(jié)果累積并以幾何平均匯報這非常適合多個尺寸合并成一個綜合數(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); // 對每個配置做基準(zhǔn) checkasm_bench_new(checkasm_alternate(dst_a, dst_c), dst_a_stride, src, src_stride, w, h); } // 框架對同一 checkasm_check_func() 的所有基準(zhǔn)運行匯報幾何平均 } checkasm_report(filter_w%d, w);除此之外還有兩種策略對每個配置單獨調(diào)用checkasm_check_func()以獲得每個尺寸獨立的基準(zhǔn)報告或者只對最大的輸入尺寸調(diào)用checkasm_bench_new()以考察極限行為具體取舍討論見 benchmarking.md 的 Choosing Configurations 一節(jié)。多 Bitdepth 測試對支持多種位深bitdepth的編解碼函數(shù)一種做法是在循環(huán)內(nèi)按位深重建 DSP 上下文并約束隨機數(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)隨機化 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 時不超過 1023避免無意義的比較。另一種思路是把測試文件本身編譯多次用預(yù)處理器宏如-DBITDEPTH10區(qū)分位深。自定義失敗報告當(dāng)返回值或內(nèi)部狀態(tài)需要更細(xì)粒度的診斷時可以在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ì)錯誤診斷時才執(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ù)必須通過一個 wrapper 間接調(diào)用時使用checkasm_call()和checkasm_call_checked()調(diào)用任意輔助函數(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ù)的 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)識被測的底層實現(xiàn)即可。checkasm_call()只提供信號處理用于調(diào)用參考實現(xiàn)等名義上安全的代碼checkasm_call_checked()才做完整校驗棧保護(hù)、寄存器 clobber 檢測等見 test.h因此被測的優(yōu)化實現(xiàn)應(yīng)當(dāng)用checkasm_call_checked()。MMX 函數(shù)的特殊處理x86x86 上的 MMX 函數(shù)常常在返回前省略emms指令期望調(diào)用方在循環(huán)結(jié)束后手動執(zhí)行。emms用于在任何浮點代碼執(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)志激活時會在調(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); }第一個參數(shù)是 CPU 標(biāo)志掩碼如CPU_FLAG_MMX | CPU_FLAG_MMXEXT當(dāng)掩碼中的任一 CPU 標(biāo)志激活時checkasm 會在每次checkasm_call_new()和基準(zhǔn)運行之后調(diào)用emms。在非 x86 平臺上checkasm_declare_emms()等價于checkasm_declare()見 test.h 的條件宏定義。現(xiàn)代 SIMD 指令集SSE 及以后不使用 MMX 寄存器因此不需要emms。只對純 MMX 代碼或顯式使用 MMX 寄存器的 MMXEXT 函數(shù)使用checkasm_declare_emms()。提示與技巧確定性測試固定種子checkasm 使用帶種子的 PRNG 保證測試可復(fù)現(xiàn)。傳入一個位置參數(shù)即可使用指定種子./checkasm 12345 # 使用種子 12345失敗時會打印實際使用的種子便于復(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非零時使用給定種子否則按當(dāng)前時間取種repeat字段還可以讓測試用連續(xù)多個種子重復(fù)運行設(shè)為 -1 時幾乎窮舉所有種子用于窮盡式測試。選擇性測試只測試匹配特定模式的函數(shù)或測試模塊# 只測試匹配模式的函數(shù) ./checkasm --functionadd_* # 只測試特定的測試模塊 ./checkasm --testmath # 兩者組合 ./checkasm --testdsp --functionblend_*--test/--function對應(yīng)CheckasmConfig中的test_pattern/function_pattern字段shell 風(fēng)格通配符NULL 表示運行全部。還可使用--list-tests、--list-functions、--list-cpu-flags查看可用的測試、函數(shù)與 CPU 特性清單getting-started.md 中的--help輸出列出了全部選項。詳細(xì)輸出啟用 verbose 模式以獲取詳細(xì)的失敗信息./checkasm --verbose當(dāng)使用內(nèi)置的checkasm_check*()系列緩沖比較助手時verbose 模式會自動對被差異區(qū)域輸出 hexdump該行為在 utils.h 的checkasm_check2d()文檔中有明確說明。基準(zhǔn)測試用適當(dāng)?shù)臅r長運行基準(zhǔn)# 快速基準(zhǔn)默認(rèn)時長 ./checkasm --bench # 更長時間的基準(zhǔn)以獲得更精確結(jié)果每個函數(shù) 10ms ./checkasm --bench --duration10000 # 以不同格式導(dǎo)出結(jié)果 ./checkasm --bench --csv results.csv ./checkasm --bench --json results.json ./checkasm --bench --html results.html--duration以微秒為單位控制每個函數(shù)的基準(zhǔn)時長--csv/--json/--html對應(yīng)CheckasmConfig.format的CHECKASM_FORMAT_*枚舉值。checkasm 的統(tǒng)計方法對數(shù)正態(tài)分布建模、log 空間線性回歸、幾何平均、no-op 開銷校正與結(jié)果解讀cycles、時間、相對加速比(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)部的寫法而一個可運行的 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 特性集合每個后續(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)實現(xiàn)??蚣軆?nèi)部還提供了一系列校驗?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來驗證這些檢測機制確實生效。下一步掌握測試編寫之后可以繼續(xù)閱讀 benchmarking.md學(xué)習(xí)如何利用 checkasm 的基準(zhǔn)測試能力精確度量并比較優(yōu)化實現(xiàn)的性能——包括對數(shù)正態(tài)分布統(tǒng)計建模、log 空間線性回歸、幾何平均匯總、no-op 開銷校正以及關(guān)閉 CPU 頻率縮放、禁用 turbo boost 等系統(tǒng)級最佳實踐。贊分享音視頻【免費下載鏈接】vlcVLC media player - plays everything, runs anywhere. Code here: https://code.videolan.org/videolan/vlc項目地址https://gitcode.com/gh_mirrors/vl/vlc點擊查看免費下載相關(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是一個專為ComfyUI設(shè)計的視頻生成模型整合工具它音視頻Snapshot report for test.jsSnapshot report for test.js The actual snapshot is saved in test.js.snap . Gener測試上一篇【親測免費】 jOOQ - 更優(yōu)雅地處理 Java SQL 編程下一篇【親測免費】 Crawler4J - Web爬蟲框架創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
在线性黄高清免费视频| 婷婷激情四射| 国产精品午夜福利| 欧美综合第一| 亚洲欧洲综合视频在线| 自拍视频一区在线观看| 欧美精品宗合| 亚洲伊人青青草| 久久国产视频专区一二三| h4610国产人妻| 久久精品电影在线| 美女露胸露尿口| 国产人妖视频一区在线观看| 日韩9区| 人妻黑丝袜电影| 久久精品欧美一区蜜桃| 中文字幕av乱伦| 日韩精品中文字幕人妻| www.成人无码| 国产AV线| 日本中文字幕熟妇| 91亚·色| 国产剧情一区在线观看| AV电影在线播放| 涩涩这里只有精品视频| 中文字幕日韩专区精品系列| 午夜精品久久99蜜桃的功能章节| 老鸭窝在线视频播放| 欧美黄色图片| 色好看av| 亚洲情色在线| 国产青视频| 嗯嗯啊在线视频| 久久精品国产免费观看99| 91丨国产丨白浆秘 洗澡动漫| 青青国产在线拍揄自揄拍| 色99视频| 艹我哪美一区无码| 在线观看一卡二卡| 极品五月天噜噜| 亚洲欧美一区二区三区一猛片| 少妇一级无码精品| 无套内射人妻在线播放| 天天懆天天日| 成人看片网站| 亚洲欧美日韩精品久久久一区二区 | 午夜天堂网| 久7色| 美中韩AV综合网| www激情| 欧美一级黄片视频在线| 白丝一区| 人人搞人人插人人操| 国产97色在线| 人人摸人人入| 欧美18老人禁| 色综合V| 嗯啊抽插大香蕉网页| 亚洲欧美色图小说| 家庭乱伦国产| 国产Av超碰| 久久精品国产亚洲AV高清演员表| 在线岛| 欧美亚洲尤物久久| 蜜乳av首页| 蜜桃av综合网发布| 亚洲国产剧情少妇激情| 一区中文字幕二区日韩| 欧美高潮| 亚洲丝袜诱惑| 一区三区啪啪| 伊人97色天使| 日本道人妻久久久在线不卡色视频| 99热18这里只有精品| 中文字幕熟女人妻丝袜丝| 97日韩超碰超碰中文字幕| 欧综合网| 欧美亚洲特P| 成人性爱免费播放| 99在线观看| 日本网色| 国产有码一区| 国产精品一区二区三| 97超碰人人操人人操| 国产成人无码a| 在线无码操| 在线 制服丝袜中出 人妻| 嗯啊啊啊轻点视频| 熟女熟妇伦久久影院毛片一区二区 | 国产成人欧美精品在线| 激情久久久| 國產尤物AV尤物在線觀看| 色五月首页| 亚洲色图在线视频| 污污污8888| 欧美在线 亚洲| 激情色图| 人妻夜夜爽天天爽麻豆三区网站| 男人的天堂无码| 综合久久2017| 黄色视频特级毛片| 精品人妻视频一区二区在线播放 | 欧美熟妇视频 | 亚洲国产97在线精品一区| 北京美女一区二区| 亚洲资源站| 国产91av在线播放| 女人天堂AV五区在线| 亚洲国产欧美另类自拍| 精品中文字幕一区二区| 婷婷啪啪| 日韩综合色图| 很很干很很操| 欧美在线91| 国产精品婬乱一级毛片彝族| 色色色网站| 久久久熟妇熟女国产| 亚洲色性| 久久草大香蕉| 激情综合 婷婷五月 红杏| 国产日韩区| 激情在线青青操| 特级毛片特黄久久免费看 | 中字乱伦AV| 后入式视频国产自| 午夜120视频在线观看| 五月丁香综合网| 人人澡人人澡人人| 国内毛片国产专区二| 一区二区三区无卡视频在线观看| 欧美性爽xyxOOOO| 亚洲欧美精品福利在线| 久9爱精品| 成人性爱电影一区二区| 黑人精品XXX一区一二区| 黄色大片免费在线| 亚洲欧洲色情高清| 亚一综合久久久久久久久久| 亚洲日韩肥臀视频在线观看| 丰满人妻aA一区二区三区| 日本欧美成人片AAAA| 久久天堂婷婷网| 97超碰逼| 国产亚洲精品av一区| 天天激色| 亚洲福利中文字幕在线| 天天操人人操骚逼网站| 国产精品成人蜜臀AV在线| 亚洲黄色网址| 色激情五月天| 色综合av综合久久| 久久久久久波多野吉衣高潮| 夜夜影视四色| 免费99精品国产自在在线| 亚洲蜜桃V妇女| 色99久草| 丰满人妻-区二区三区| 久久老子无码午夜伦不卡| 亚洲欧美国产精品久久久久久久| 婷婷综合五月天| 国产区日韩区在线观看| 欧美 综合| 亚洲αv一区二区三区| 91少妇通奸网站| 91GD.COM| 国产女人和拘做爰视频 | 九九九精品| 欧美天天谢综合网| 东京热激情视频一二三区| 男啪女色黄无遮挡免费观看| 亚州色阁| 日韩伦理视频| 成人在线视频网| 亚洲天堂男人的天堂| 国产精品肉丝自拍| 日本性爱少妇| 日本潮催一卡操| 国产美女精品| 久久97| 日本人妻伦在线中文字幕| 欧美天天拍| www.91人妻.com| 极品AV网站在线观看| 丁香婷婷九月| 波多野结衣AV无码一区| 另类av综合久久| 99久久精品无码一区二区毛片免费| 嗯嗯啊啊好疼| 高清不卡视频| 激情小说五月天| 日韩人妻一区二区| 物业黑人 AV一区| 97网址www| 久久性爱精品一区| 欧美综合色图片| 久无码| 日本欧美一区二区三区视频麻豆| 日韩人妻丝袜中文字幕| 精品国产a∨一区天美传媒| 国产极品999| 国产美女高潮叫床视频| 女优大全 - 91n| 狠狠躁天天躁日日躁| 九九视品黄色| 亚洲精品久| 综合网色| av凤凰久久久| 久久精品国产72国产精品福利| 可以免费看黄片的视频| 亚洲天堂男人天堂| 老鸭窝成人免费毛片视频| 99久在线精品99re8| 97玖玖人妻| 国产99久久99热这里只有精品15| 中文AV制服乱伦| 国产精品丝袜在线| 中文字幕丝袜| 夜夜夜爽www精品视频| 国产乱不卡| 老鸭窝黄色视频网站| 欧美无圣光在线| 久久人妻四季| 一区二区精品更新提醒| 粉嫩少妇自慰在线| 狠狠搞 亚洲91| 亚洲 另类 丝袜 自拍 动漫| 99色骚| 久久久久元码视频| 日韩中文字幕宗合在线| 综合视频91| 国桃视频产巨乳精品一区二区在线| 日韩AV色图| 夜夜操av亚洲一区二区| 精品妇女一区二区三区| 国产精品丝袜久久亚洲不卡| 蜜桃久久一区| 超碰97护士| 国产精品播放| 亚洲在线网站| 欧美一区二区福利在线| 99精品久久久久久久婷婷| 97在线视频观看网站| 91国产美女丝袜足交精品视频| 最新国内自拍av免费| 人人弄人人摸| 国产又黄又爽又刺激久久久久久| 精品少妇人妻av久久免费| 一线黄色免费性爱片| 蜜乳AV色欲AVAV无码| 第一高清av中文字幕| 日本在线一二 | 色青青久久影视| 婷婷综合久久| 精品女人999| 91艹| 超碰午夜| 天天天天天天天天天天干美女| 丁香婷婷九月| 校园春色综合色| 91网站在线播放| 少妇激情一区二区三区视频| 日本性感人妻91| 日本成人A片网站| 亚洲色图欧美视频| 97频视在线| 国产精品久久泡妞网站| 亚洲啪AⅤ永久无码| 91九色首页| 久9久9精品| 死我十八禁| 操国产逼| 日本日逼视频网| 欧美97日韩精品| 东京热91| 成年女人18级毛片毛片免费观看| 日韩精品人妻系列无码天堂| 欧美后入式| 日韩av在线精品观看| 人人摸人人摸人人干| 丁香九月激情| 久久r精品| av三级电影在线播放| 国产精品嫩草影院免费| 东北女人的毛片| 久久久久久999| 影音先锋视频在线| 爱干爱射网啊啊啊| 日韩色香| 中文字暮97| 蜜臀网址在线| 天天日天天干天天整| 九九九久千久久激情蜜桃在线看 | 国产视频一区二区在线| 亚洲精品人伦一区二区| 思思热久久成人| 一区二区三区四区五区高清无码永久视频| 日本在线伊人啪啪| 亚洲日本韩国在线| 欧美女同在线| 亚洲一区日韩| 日本五区不卡| 欧美综合骚| 日韩97超碰| 丁香五月综合| 啊啊啊操死我了| 日本三级一区二区 在线| 欧美日韩国产传媒在线精品| 日本成a人v网站在线观看| 狠狠操狠狠| 东京热毛片调教| 97久久精品亚洲| 精品视频久久| 蜜桃视频精品一区二区三区| 肉动漫无遮挡h在线观看| 日韩三级久久久| 美女91AV| 欧美美女啪啪视频| 亚洲国产熟妇综合色专区| 蜜臀少妇一区二区| 日语五十路和六十路亚洲国产精品| 色99视频| 国产成人无码a| 欧美白嫩在线放| 久久久久免费看少妇A片特黄| 操逼内射干逼白丝91| 亚洲1区2区三区高清中文字幕| 亚av顶级裸体一区二区三区四区五区| av日韩手机在线影视| 91国产伊人大香蕉| 五月天社区| 999精品久久久久久久| 欧美三级一级| 操逼片国产| 国产综合久| 国产欧美第五页| 呦呦影院| 天天影视网色欲色香| 久精品无码av一区二免费国产在线观看| 亚洲文学偷乱拍啪啪啪啪| 亚洲一区日韩| 大JI巴好深好爽又大又粗视频| 久久国产精品熟女人妻| 青青操轻轻| 99久久99久久免费精品蜜臀| 久久 亚洲 日韩 人妻| 亚洲无码?第一页| 大茄子熟女AV导航| 午夜欧美J进J出白浆流出久久久| 国产在线视频二区| 欧美97超碰| 国产熟女| 少妇二级| 超碰91在线| 亚洲**2021在线观看| 精彩久久中文| 国产嫩草精品A88AV在线| 成人免费不卡在线视频| 久草精品国产99| 怡红院亚洲怡春院av| 青青草日本无码| 欧美日韩国产高清在线一二三区| 美女黄网| 欧美人妻熟女在线| 亚洲图片 激情小说| 一区二区 韩日AV| 国产精品人人爽人人做可爱福利| 欧洲亚洲人妻无码高清久久三区四区| 蜜桃视频精品一区二区三区| 亚洲va综合va国产va中文| 26uuu成人影片| 欧美日韩一二三| 久久精9| 91久久精品国产| 亚洲成?V人片在线观看福利| 天天日天天干天天色| 久久在肏| 后入式免费视频| 欧亚 另类 久| 性欧美| 锕锕好爽 死我在线观看| 99re这里只有精品中心播放| 亚洲天堂中文字幕无码男同| 在线v中文字幕一区二区三区| 日欧操屄| 成人av毛片在线观看| 青娱乐淫乱1314| 极品销魂美女一区二区| 亚洲情色综合| 78超碰| 欧美日韩中文字幕不卡| 99精品无码| 91视频综合在线| 97在线播放| 99热大香蕉伊在线| 蜜桃香蕉久草精品在线| 九九九九九九综合| 亚洲丝袜少妇在线| 亚洲天天操| 99操逼| 欧美性91| 超碰97人妻| 超碰97网站| 天堂成人网| 女人天堂av在线播放| 丝袜AV一区二区三区| 亚洲天堂资源| 超碰人妻久久| 蜜臀久久99精品久久久电影| 天天上日日上日韩精品| 啊啊啊啊网站| 日本操逼视频不卡直接放| 欧美日韩在线视频网站| 搡老女人老妇女AAA一VU麻豆| 日小BB小视频| 在线观看色视频| 亚洲第一成人影院色播| 国产又粗又又黄又猛| 台湾佬激情综合| 97国伦国色| 亚洲揄拍网| 道久久五香丁月婷婷激情综合| 91日韩网站| 99中文字幕| 丰满人妻被猛烈进入中| 日韩亚洲国产视频| 91neishe| 91欧美另类| 91痴汉| 99久久久久久亚洲精品不卡| 日韩,欧美,中文在线| 91丨九色丨43老版熟女| 日韩二级| 97久久超碰国产精品| 91麻豆天美传媒在线| 欧美一级AAAAAAA| 国产这里只有精品| 亚洲免费97免费| 噜噜噜噜久久久精品免费| 欧美性性性| 午夜视频久久久久一区| 综合激情五月丁香| 欧美激情欧美精品| 欧美色九九| 超碰无码加勒比| 性感女人网页在线观看视频| 99精品无码| 免费成人在线观看91| 国产色精品午夜大片| 蜜臀久久99精品久久久久久久久| 大屁股熟女一区二区三区| 91在线视频国产网站| 人人人人插| 欧插网站| 怡红院久久老司机| av最新免费中文字幕| 久久久久久午夜男人的天堂| 真实高潮91| 大香蕉日韩| 蜜乳AV网址| 操操操操操操| 亚洲影院成人| 色五月婷婷网| 我爱操| 久久亚洲AV无码专区国产精品| 口爆综合网| 综合色久欲| 国产毛片久久久久久久| 人妻一区久久二区三区色播| 亚洲资源站| 这里有精品| 夜夜做夜夜爽精品视频| 性影在线视频| 国产精品天干天干综合网麻豆 | 亚洲91少妇| 一区二区三区一亚洲中文字幕、综合区灬 | 郑州宾馆老熟女露脸啪啪| 五月天婷婷小说| 97资源站国产精品| 性吧在线视频| 色噜噜日韩精品| 蜜乳AV一区二区三区四| 久久宗合亚洲| 日本五十路熟女一区二区| 久久久精品视频欧州站| 免费看A片毛毛片在线播| 麻豆人妻少妇在线免费观看| AⅤ片水多多| 91色图片| 欧美呦呦性爱| 校园春色中文字幕AV| 另类图片欧美激情综合| 1区2区3区中文字幕日韩| 草草草视频在线免费看| 九九九九日本 | 91操熟女| 亚洲欧洲第二视频在线观看色图| 麻花传媒免费网站在线观看| 偷拍片久久| 天天干天天操天天干天天操| 99草精| 懂色AV一区二区三区| 9999久久久| 国产美脚女优尤物在线观看| 色操逼网| 精品二区三四区五电影 | 91影库| 日本孕妇孕交| 久久99综合| 无码区蜜乳| 99re在线精品78| 91free福利| 天天插网| 亚洲自拍欧美色综合| 色999五月色| 丰满人妻一区二区三区色-百度| 艾草av| 日韩一区二区三区四区五区| 69一区二区三区| 在线视频一区二区传媒| av资源在线播放天堂| 欧美色狠| 国产九九九九九九| 天天爽天天爽| 国产91乱伦| 中文字幕激情小说| 97情超碰色| 91丝袜美女| 久久久精品无码亚免费| 亚洲天堂一区| 加勒比久久av| 第四色色综合91| 欧美日韩香蕉| 操逼无码操逼| 久9九综合在线| 久久久久一本一区二区青青蜜月| 亚洲AV免费在线| 亚一综合久久久久久久久久| 久久久久久九| www.男人天堂| 玖色AV| 嫖老熟女A片一二三区| 亚洲第一页第二页激情| 青青草好吊色| 九久久九九久视频| 台湾佬中文娱乐网久久久久久久久久com | 亚洲A色| 九月丁香婷婷| 岛国黄色大片网站| 亚洲中文字幕在现观看| 91精品国产一区三一| 青操影院| 天天操天天谢| 九草在线大香蕉| 久久久久久久久久久久久9999| www色色色com| 欧美在线观看综合国产| 欧美操逼熟女| 青娱乐老司机视频| 97久久超碰| 精品人妻一区二区三区免费视频| 欧美韩日精品99综合| 91少妇通奸网站| 国产精品网站www| 东京太热久久久| 人妻熟女一区在| www.狠狠干.coom| 屌色在线97视频| 人人操AV| 天天添天天干电影| 91在线页| 亚洲日韩青青草色月| 日韩一区二区熟女| 欧美老妇综合网| AND人妻系列| 丰满少妇一区二区三区专区| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 亚春色色| 日韩人妻丝袜中文字幕| 亚洲码在线中文在线观看| 伊人一级免费黄片| 久久精品国产亚洲AV高清演员表| 韩国一级婬片A片无码天美| 91色人妻| 操操吧亚洲乱伦视频| 大香蕉78| 国产精品亚洲天堂网址| 婷婷中文网| 欧美一区二区亚洲天堂| 9久精品| 国产蜜臀在线| 岛国不卡超碰护士AV在线播放| 激情图片伦理国产一区二区日韩| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 囯产操逼片| 亚洲欧洲网站免费观看| 在线观看十八禁| 亚洲色图加勒比| 91精产一区二区三区| 欧美色图在线视频少妇| 91天堂| 国产一级不卡在线观看| 国产小u女在线观看| 五月婷丁香| 97色爱| 久久是精品| 欧美综合在线第一页| 无码人妻一区二区三区免费九色| 丁香五六月啪啪| 人人看欧美性爱| 成人看片网站| 亚码激情| 日日97| 老司机深夜18禁污污网站| 亚洲 国产 精品一区| 67914亚洲精品| 夜夜嗨AV蜜臀av| 日本一线产区和二线产区伦理片| 成人午夜高潮av猛片| 一区二区三区精品视频| 九九久久久久久爱| 麻豆国产成人精品| 精品国模无码| 99日韩| 婷婷五月天无码| 秋霞一级视频在线观看免费| 91网站18在线观看| 校园春色AV天堂| 成全在线观看免费观看| 男人天堂婷婷五月天校园春色| 日韩精品9区| 91精品久久久久久| 啪啪啪东京| 麻豆人妻精品一区二区| 天天综合,91入口| 99老司机精品视频在线观看| 91在线页| 黄色工厂这里只有精品| 国产av激情无码久久天堂| 欧美有码激情视频一区二区三区| 伊人四虎综合| 欧美性爱日韩性爱| 96AV久久久| 一区二区播放| 自慰白浆在线观看| 91美女視頻| 亚洲日韩视频二区| 刺激性视频黄页| 午夜成人爽爽爽爽A片李冰冰| 天天躁日日躁AAAXX| 99在线啪| 国语av最新自产拍在线观看| 东京太热久久久| 日韩性爱小视频| 91蜜臀熟女| 中文字幕乱码在线| 啊啊啊啊嗯嗯嗯用力好爽 | 欧美骚少妇| 亚洲乱码国产乱码精网站| 最新中文字幕av| 色九久| 国产农村一一级特黄毛片| 免费夜夜爱黄色视频毛片| 另类成人首页一区| 国产精品久久99日日| 二对二中文字幕。| 久操网无码在线| 欧美在线大香蕉| 岛国视频一二三区| 一二三四视频在线社区中文字幕| 久草国产在线视频| 98福利在线视频| 偷拍自拍在线视频观看| 91无摭挡| 91狠狠综合久久| 天天综合~91| 蜜臀AV成人精品蜜臀AV久久| 夜夜操美女| 天天操天天射青青草| 麻豆国产97在线| 精产国品一区二三产品| 中国国产精品一区视频| 久久9999 | 91无码中出人妻视频| 人妻精品一区二区| 日韩有码 一区二区三区| 自拍偷拍草一草| 麻豆伊人网| 看一级特黄a大一片| 亚洲高潮影院| 色欧洲| 有码免费观看| 日韩欧美tv一区二区在线观看| 台湾佬大香蕉| 中文乱码99| 亚洲自拍天堂| 97视频免费在线| 九九热免费国产视频婷婷伊人| 亚洲国产ⅴ高清在线观看| 91成人久久| 天天做天天爱| 亚洲 日本 国产 综合| 国产农村妇女毛片精品久久| 久久久久久亚洲精品中文字幕人妻| 熟妇女伦乱视频视频| 亚洲大色堂| 日韩久射综合| 极品色社| 三级日本一区二区三区| 福利一级版子| 精品-91人妻子系列| 无码人妻1727| 精品国产久久乱码| 成人资源中文字幕在线观看天天| 正在播放国产精品一区| 97亚洲欧美| 色天堂在线观看| 骚逼高潮久久精品| 日韩亚洲国产视频| 亚洲精品国产精品成人| 久久久久久99999国产精品| 好淫网一二三视区| 黄片直播三级黄片两女一男| 看免费的黄片| 三及片网站| 秋霞福利网| 亚洲中文制服诱惑| 美國A片| 欲香欲色| 婷婷10月天青娱乐| 久久99精品国产| 色综合av男人天堂| 中国少妇XXXX做受| 91在线免费精品视频| 欧美综合色图片| 粉嫩国产精品久久久| 激情四射婷婷四五月天| 日本黄 R色 成 人网站| 亚洲国产尤物yw在线观看| 欧美一级A一级a爱片久久| 九一综合网| 欧美天堂日韩三级国产传媒| 防屏蔽在线视频| 深田咏美亚洲精品福利社| 草莓精品视频在线免费观看| 大香蕉免费中文| 日韩欧美字幕亚洲一区二区| 成全动漫视频观看免费下载| 综合97| 成人性交午夜免费片| 日本精品一区二区三| 中文字幕视频一区视频二区| 骚乳在线| 四虎 精品 WWW| 东京热男人的天堂网| 欧美日韩 强奸乱伦| 亚洲黄色网址视频| 亚洲导航深夜福利| 思思热在线cao| av网站免费看| 日本黄色精品专区网站| 操国产逼| 在线观看无码三级少妇| 26UUU欧美日本| 亚洲天堂五月天国产| 色哟哟 日韩精品| 2024年最新色情网站在线观看| 国模私拍一区二区三区神乳| 美女视频尤物网在线看| 欧美色视频在线| 日韩国产成人自拍视频| 国产成人自拍视频在线| 99综合视频一体| 久久麻豆一区二区| 久悠悠av| 日韩丝袜高跟制服在线观看| 欧美综合 站| 男人天堂最新手机版在线青青草| 欧美后入式| 91 丝袜在线播放| 亚洲性网| 国产精品探花在线| 九色视频91| 野狼激情网| 91色艳| 97精品国产精品免费观看| 神马九九九| 日本不卡在线二区三区| 都市久久精品激情亚洲| av在线一区二区三区| 婷婷五月综合在线| 青青草在线视频人人想人人上| 超碰97欧美日韩| 色约约一区=区三区| 国产品精品自在在线午夜免费| 欧美黑人熟妇精品91| 狼狼色丁香久久婷婷综合五月| 在线可观看的黄色网址| 亚州色图第三区| 欧美最大综合网| 色综合91好| 国产精品网址| 天天日天天舔天天喷天天射| A男人的天堂| 亚洲中文字幕熟女少妇一区二区| 极品销魂美女一区二区| 熟女这里只有精品6| 精品一区二区成人动漫| 午夜呻吟欧美| 欧美色图99| 久久男人精品| 又大又长又爽| 桑老女人九区| 成人久久久| 色色色色网站| 91黑丝美女| 国产精品操| 99久久精品无码一区二区| 国产伦精品一区二区三区视频女| 熟女91网| 国产亚洲精品无码三区| 色99视频| 一区二区三区四区五区高清无码永久视频 | 日本视频一区二区三区| 亚洲情色婷婷五月天| 精人妻无码一区二区三区伊人直播 | 香蕉99秘 一区精品蜜桃臀| 天天干人妇| 欧洲精品网| 99久久亚洲精品无码毛片潘甜甜| 欧美极品女人的天堂| 久操av在线| 成人精品一区二区91毛片不卡| 欧美性猛交美女自慰91| 亚洲日韩美女丝袜美腿人妻视频| 玖玖爱免费观看视频| 久久黄色视频一区二区三区 | 999 久久久| av黄图片在线观看| 97超碰巨乳| 久久久艹艹艹| 无码精品人妻一区二区三区妖精| 天天艹天天日| 神马影院午夜福利久久久| 色吧5亚洲| 成人综合色网| 日夜尻逼网| 欧美刺激色黄片免费看| 久久视频,这里只有精品| 中文字幕AV乱伦| 超碰98综合网| 亚洲,日韩,欧美,成人播放| 亚洲综合另类欧美久久久| av一区二区三区不卡| 欧美大码在线视频| 大香蕉一级黄色片久久| 久久草草欧美精品| 男人天堂欧美| 国色天香av| 日本阿v天堂在线观看| 97大色网| 午夜超爽| 欧洲亚洲人人爽爽视频| 亚洲精美粉嫩嫩泬在线观看| 亚洲91大片| 国产女生在线| 欧美92| 男人的天堂2018东京热啪啪啪| 男人久久天堂| 强奸少妇AV导航网| 无码国产Av| 久操| 五月丁香久久| 九九精品无码专区免费| 欧美大干日韩| 色婷五月| 2020中文在线一区二区三区| 精品成人女人久久| 91人妻Pr| 一区二区高清视频| 中文字幕人妻色偷偷久久皮| 亚洲97久久精品亚洲| 亚洲图片 激情小说| 久久草大香蕉| 尤物av网站免费在线播放| 狠狠操使劲操| 夜草欧美| 999狠狠综合| se01国产在线视频| 日本免费二区三区| 东北女人| 丁香九月激情啪| 大象AV在线| 色呦呦、国产精品| 青娱乐日韩无码| 亚洲巨爆乳一区二区三区四季网| 日本一片一区| www.色五月| 飘花国产午夜精品不卡| 超碰97综合网| 日欧毛片久久| 精品久久久久久亚洲| 韩国手机不卡无码三级视频| 男同专区一区二区三区在线| 在线视频一区二区传媒| 日韩无码专区| 欧美东京热精品A∨| 加勒比综合网| 91老熟女91老女人| 欧美97视频| 熟女丰满人妻一区| 女同性恋久久| 人人操人人搞人人草| 亚洲自拍97| 乱色老一区二区三区的观看方式 | 99九九久久| 日本高清_区二区三区| 日本一区二区不卡| 天天性射网| 啊嗯嗯啊好大好爽| 裸模AV女优| 男人兔费天堂| 欧美亚洲日韩人妻在线观看| 日韩成人精品视频自拍| 亚洲中文字幕精品一区| 欧美天天干| 欧美图片校园春色| 色香伊人| 伊人久久亚洲色欲综合网站 | 中国女人内射6XXXXX| 精品国产三级av韩国在线| 久久久久国产精品人妻aⅴ天堂| 欧美超碰96| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 伊人麻豆传媒| 人妻人久久精品中文字幕| 亚洲激情色片 | 在线播放欧洲免费av| 国精综合一二三区影视| 天天看片天天爽| 丁香激情五月天| 日韩精品在线观看观看| 懂色天天爱天天日天天射天天澡| 精品国模无码| 亚洲天天自拍| 东京热av影院| 殴美色网| 又粗又长又大国产不卡| 成人精品在线免费视频| 熟女人妻一区二区三区| 婷婷九月丁香| 五月天精品| wuyechaopeng| 丝袜综合| 亚洲日本天堂| 久久久久极品| 97中文字幕九区| 亚洲男人天堂手机版| 新91视频.cmp| 大色综合| 激情婷婷综合久久| 日本乱人伦片中文三区| 国产黄色在线播放观看| 婷婷丁香九月| 嫩草一区二区在线观看| 欧美在线观看综合国产| 超碰91在线| 五月天激情国产综合婷婷婷| 久久人妻办公室视频| 九九九九九九亚洲| 亚洲成人精品久久久| 国产精品青青草| 操死我了嗯嗯嗯| 伊人 俄罗斯 a v| 五月天加勒比啪| 超碰社区97| 天天亚洲| 日韩色欲久久一二三四区| 另类小色呦| 婷婷大香蕉| 69精品人人人人| 嗯~啊~快点 死我视频免费看网站| 欧美偷偷网| 五十路熟女人妻一区二区在线观看| 亚洲精品国产精品成人| 被操高清无码视频| 黄色AAAAA欧美| 97色婷婷| 999久久久九| 伊人久久久日韩一区| 台湾佬大香蕉| 黄色片A级一区二区三区| 午夜偷拍久久熟女| 夜夜操狠狠操| 国产欧美日韩臀| 熟妇人妻丰满久久久久久久无码| 久久久久久久精| 日韩国产欧美伦理在线| 亚洲另类综合欧美| 久久一二三四五六七八九区区| 欧美丝袜美女电影一二三四区| 试看60秒 爽| 精品人妻av在线播放| 熟女人妇一区二区三区| 欧美精品在线观看| 四虎免费视频| 91成人高清在线观看| 色五月激情综合网| 亚洲精品丝袜| 伊人操| 日本精品无码三级网站| 亚洲少妇中文字幕网址| 麻豆AV短剧| 国产精选视频| 国产精品蜜乳AV| 骚乳在线| 9I1性色影院| 国产女人操逼视频| 久久久久一本一区二区青青蜜月| 少妇精品| 欧美性爱一级操| 色九月综合| 色欲天天综合久久久无码网中文| 日本在线不卡v二区| 性吧在线视频| 狠狠色五月亚洲91| 黄色一区二区秘书性感| 天天看特黄的免费网站 | 日韩人妻一区二区| 亚洲91网。| A级在线视频| 五月丁香色色网| 91高清日| 欧美顶级黄色大片免费| 亚洲AV高潮| 美国日韩黄片| 青青国产精品在线| 9久久久久| 国产超碰人人操| 天天在线91| 99日精品欧美国产| 91网站在线播放| 九九黄色视频在线观看| 东京热熟女亚洲视频网站| 9国产超碰| 亚洲情色一区二区三区| 国产第12页| 无码男人天堂| 91精品久久久| 天美传媒国产原创中文字幕亚洲欧美另类 | 一中国女人毛片水真多| 九九热九九热| 思思热在线视频在线| 国产不卡精品91| 亚洲男人电影天堂| 免费观看欧美日韩操逼视频| 亚洲黄色电影| 中日无幕一二三四区| 97视频在线看| 磁力99AV| 欧美aa一级片| 嗯嗯啊好大| 思思热免费视频观看| 97国产精品久久久久| 99ri在线视频| 亚洲女人91| 夜夜肏2021| 日本熟女免费視颖| 鸥美极品| 成人五月香网在线| 91老熟女| 噜噜噜亚洲精品| 亚洲无码久久久久久久| 美女淫穴| 亚洲精品日日夜夜52| 91制服丝袜| 中国黑人三级片网站上区| 亚洲综合另类小说色区亚洲成av人片在www| 亚洲国产中文字幕| 国产免费一区在线观看| 欧美色另类| 青青草吊丝| 天天弄天天操| 欧美亚洲色的图| 天天色粽合合合合合合合| 99热欧美| 丁香婷婷久久 | 精品亚洲国产成人精品| 女生自91网站| 激情五月综合网| AAAA欧美日韩| 久久精品六区| 天天综合~91入口| 青青久久手机线视频| 一本久久久精品| 中文字幕十五区| 91人妻Pr| 天堂亚洲精品| 欧美 日韩 另类 亚洲| 怡红院一区二区熟女人妻| 中文AV制服乱伦| 干美女人妻| 精品国产国产AV| 天天躁日日躁AAAXX| 久久久精品91八戒| 欧美色交| 亚洲视频一二区| 小少妇| 久久综合亚洲色1080p| 精品视频一区二区| 国产又大又粗又长视频| 欧美亚洲一区二区久久久婷精品大包诱| 国产AV精久久| 日B操| 東南亚性呦成人伦理资源在线视频| 嗯嗯啊啊操死我| 新版天堂中文资源8在线| 男插女青青影院| 一区二区高清视频| 大但人体久久久久| 精品中文日韩字幕视频| 插入综合网| 欧美性爱五月天| 欧美性爱三区二区| 中文字幕一二区二三区人妻专区| 日本大香蕉综合网红本杳社区| 1024午夜激情男人的天堂| 四虎影视在线| 性爱视频无打码在线观看| 欧美Ⅴ性爱| 91人妻熟女| 天天综合网~91| 91n.欧美| 91色s| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 国产成人自拍视频在线| 午夜.DJ高清在线观看免费7| 国色天香av| 综合久久中文字幕综合日韩精品| 操我无码| 中国一级操逼视频| 国产日韩色综合| 一级二级在线观看| 欧综合网| 全国男人天堂网| 久久东京热成人| 后入式五六区| 一区二区三区四区五区久久久久久| 欧美性爱一区二区三区四区 | 久久久久精| 亚洲欧美九九| 9九九九九视频在线观看| a在线观看| 飘花国产午夜精品不卡| 91丝袜美女视频| 亚洲中文字幕av | 成人片在线播放| 国产高清无码一区三区二区| 久久午夜鲁丝片| 激情小说图片亚洲首页| 26UUU欧美日本|