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

ARTICLE DETAIL

資訊詳情

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

CANN ops-math 算子接口實(shí)戰(zhàn):aclnnLtTensor 與 aclnnInplaceLtTensor 全解析

CANN ops-math 算子接口實(shí)戰(zhàn):aclnnLtTensor 與 aclnnInplaceLtTensor 全解析 算子庫(kù)人工智能CANN【免費(fèi)下載鏈接】ops-math本項(xiàng)目是CANN提供的數(shù)學(xué)類基礎(chǔ)計(jì)算算子庫(kù)實(shí)現(xiàn)網(wǎng)絡(luò)在NPU上加速計(jì)算。項(xiàng)目地址https://gitcode.com/cann/ops-math點(diǎn)擊查看免費(fèi)下載導(dǎo)讀本文以 CANN ops-math 倉(cāng)庫(kù)中 Less小于比較算子的兩個(gè)單算子 API 接口為核心系統(tǒng)講解aclnnLtTensor與aclnnInplaceLtTensor的產(chǎn)品支持情況、功能語(yǔ)義、兩段式調(diào)用范式、完整參數(shù)約束與錯(cuò)誤碼并結(jié)合倉(cāng)庫(kù)源碼剖析其底層計(jì)算流程Contiguous → Cast → Less → ViewCopy、平臺(tái)差異與 kernel 實(shí)現(xiàn)原理。讀完本文你將掌握在 NPU 上通過(guò) aclnn 接口完成逐元素小于比較并輸出 Bool 張量的完整編碼能力并理解普通輸出與原地inplace輸出的工程取舍。產(chǎn)品支持情況根據(jù) math/less/docs/aclnnLtTensoraclnnInplaceLtTensor.md 與 math/less/README.md 的記載Less 算子及配套的兩個(gè) aclnn 接口支持情況如下產(chǎn)品是否支持Ascend 950PR / Ascend 950DT支持Atlas A3 訓(xùn)練系列產(chǎn)品 / Atlas A3 推理系列產(chǎn)品支持Atlas A2 訓(xùn)練系列產(chǎn)品 / Atlas A2 推理系列產(chǎn)品支持Atlas 200I/500 A2 推理產(chǎn)品支持Atlas 推理系列產(chǎn)品不支持Atlas 訓(xùn)練系列產(chǎn)品支持注意在Atlas 200I/500 A2 推理產(chǎn)品與Atlas 訓(xùn)練系列產(chǎn)品上aclnnLtTensor/aclnnInplaceLtTensor不支持BFLOAT16數(shù)據(jù)類型見原文檔約束說(shuō)明中 npu910,310b 標(biāo)記段。功能說(shuō)明aclnnLtTensor與aclnnInplaceLtTensor實(shí)現(xiàn)相同的功能判斷輸入self中的每個(gè)元素是否小于輸入other中的元素返回一個(gè) Bool 類型的 Tensor。計(jì)算公式為$$ out_i (self_i other_i) ? [True] : [False] $$即當(dāng)self_i嚴(yán)格小于other_i時(shí)輸出True否則輸出False。這一語(yǔ)義與 PyTorch 的torch.lt一致常用于掩碼生成、條件篩選、比較統(tǒng)計(jì)等場(chǎng)景。兩個(gè)接口的功能區(qū)別在于結(jié)果的存放位置aclnnLtTensor需新建一個(gè)輸出張量對(duì)象out存儲(chǔ)計(jì)算結(jié)果輸入self保持不變aclnnInplaceLtTensor無(wú)需新建輸出張量對(duì)象直接在輸入張量selfRef的內(nèi)存中原地寫入計(jì)算結(jié)果節(jié)省一份輸出內(nèi)存。在倉(cāng)庫(kù)中該算子的完整實(shí)現(xiàn)分布于 math/less 目錄op_api提供 aclnn 接口層、op_host提供算子定義與 tiling、op_kernel提供 AscendC kernel 實(shí)現(xiàn)、op_kernel_aicpu提供 AICPU 兜底實(shí)現(xiàn)、framework提供 TF 插件適配。兩段式接口與函數(shù)原型aclnnLtTensor和aclnnInplaceLtTensor均為兩段式接口詳細(xì)范式見 兩段式接口必須先調(diào)用xxxGetWorkspaceSize第一段接口獲取計(jì)算所需的workspace 大小與包含算子計(jì)算流程的op 執(zhí)行器executor再依據(jù) workspaceSize 在 Device 側(cè)申請(qǐng)內(nèi)存后調(diào)用第二段接口執(zhí)行計(jì)算。說(shuō)明workspace 是指除輸入/輸出外算子在 NPU 上完成計(jì)算所需的臨時(shí)內(nèi)存。第二段接口如aclnnLtTensor不能重復(fù)調(diào)用否則會(huì)出現(xiàn)異常。四個(gè)接口的原型如下aclnnStatus aclnnLtTensorGetWorkspaceSize( const aclTensor* self, const aclTensor* other, aclTensor* out, uint64_t* workspaceSize, aclOpExecutor** executor)aclnnStatus aclnnLtTensor( void* workspace, uint64_t workspaceSize, aclOpExecutor* executor, aclrtStream stream)aclnnStatus aclnnInplaceLtTensorGetWorkspaceSize( const aclTensor* selfRef, const aclTensor* other, uint64_t* workspaceSize, aclOpExecutor** executor)aclnnStatus aclnnInplaceLtTensor( void* workspace, uint64_t workspaceSize, aclOpExecutor* executor, aclrtStream stream)接口聲明位于 math/less/op_api/aclnn_lt_tensor.h實(shí)現(xiàn)位于 math/less/op_api/aclnn_lt_tensor.cpp調(diào)用時(shí)需要包含頭文件aclnnop/aclnn_lt_tensor.h。aclnnLtTensorGetWorkspaceSize 參數(shù)說(shuō)明參數(shù)名輸入/輸出描述使用說(shuō)明數(shù)據(jù)類型數(shù)據(jù)格式維度(shape)非連續(xù)TensorselfaclTensor*輸入輸入張量數(shù)據(jù)類型與 other 需滿足互推導(dǎo)關(guān)系shape 需與 other 滿足 broadcast 關(guān)系FLOAT、FLOAT16、BFLOAT16、INT32、UINT32、INT64、UINT64、INT16、UINT16、INT8、UINT8、DOUBLE、BOOLND0-8√otheraclTensor*輸入輸入張量數(shù)據(jù)類型與 self 需滿足互推導(dǎo)關(guān)系shape 需與 self 滿足 broadcast 關(guān)系FLOAT、FLOAT16、BFLOAT16、INT32、UINT32、INT64、UINT64、INT16、UINT16、INT8、UINT8、DOUBLE、BOOL---outaclTensor*輸出輸出張量shape 與 self、other 廣播之后的 shape 一致數(shù)據(jù)類型要求為 BOOL 可轉(zhuǎn)換的數(shù)據(jù)類型參見互轉(zhuǎn)換關(guān)系FLOAT、FLOAT16、BFLOAT16、INT32、UINT32、INT64、UINT64、INT16、UINT16、INT8、UINT8、DOUBLE、BOOL、COMPLEX64、COMPLEX128ND0-8√workspaceSizeuint64_t*輸出返回需要在 Device 側(cè)申請(qǐng)的 workspace 大小-----executoraclOpExecutor**輸出返回 op 執(zhí)行器包含了算子計(jì)算流程-----約束Atlas 200I/500 A2 推理產(chǎn)品、Atlas 訓(xùn)練系列產(chǎn)品不支持 BFLOAT16 數(shù)據(jù)類型。返回值與錯(cuò)誤碼aclnnLtTensorGetWorkspaceSize返回aclnnStatus狀態(tài)碼完整定義見 aclnn返回碼。第一段接口完成入?yún)⑿r?yàn)出現(xiàn)以下場(chǎng)景時(shí)報(bào)錯(cuò)返回值錯(cuò)誤碼描述ACLNN_ERR_PARAM_NULLPTR161001傳入的 self、other 或 out 是空指針ACLNN_ERR_PARAM_INVALID161002self、other 或 out 的數(shù)據(jù)類型不在支持的范圍之內(nèi)ACLNN_ERR_PARAM_INVALID161002self、other 或 out 的維度大于 8ACLNN_ERR_PARAM_INVALID161002self 和 other 的數(shù)據(jù)類型無(wú)法進(jìn)行推導(dǎo)ACLNN_ERR_PARAM_INVALID161002self 和 other 的 shape 無(wú)法進(jìn)行 broadcastACLNN_ERR_PARAM_INVALID161002out 的 shape 與 broadcast 后的 shape 不一致在 math/less/op_api/aclnn_lt_tensor.cpp 的CheckParams中可以看到校驗(yàn)順序與上述錯(cuò)誤碼一一對(duì)應(yīng)先做空指針檢查CheckNotNull返回ACLNN_ERR_PARAM_NULLPTR再檢查數(shù)據(jù)類型是否在支持列表內(nèi)CheckDtypeValid、類型能否互推導(dǎo)CheckPromoteType、shape 能否 broadcast 且與 out 一致CheckShape其余全部歸入ACLNN_ERR_PARAM_INVALID。aclnnLtTensor 參數(shù)說(shuō)明參數(shù)名輸入/輸出描述workspace輸入在 Device 側(cè)申請(qǐng)的 workspace 內(nèi)存地址workspaceSize輸入在 Device 側(cè)申請(qǐng)的 workspace 大小由第一段接口 aclnnLtTensorGetWorkspaceSize 獲取executor輸入op 執(zhí)行器包含了算子計(jì)算流程stream輸入指定執(zhí)行任務(wù)的 StreamaclnnInplaceLtTensorGetWorkspaceSize 參數(shù)說(shuō)明參數(shù)名輸入/輸出描述使用說(shuō)明數(shù)據(jù)類型數(shù)據(jù)格式維度(shape)非連續(xù)TensorselfRefaclTensor*輸入|輸出輸入|輸出張量數(shù)據(jù)類型與 other 需滿足互推導(dǎo)關(guān)系shape 需與 other 滿足 broadcast 關(guān)系broadcast 后的 shape 需與 selfRef 的 shape 一致FLOAT、FLOAT16、BFLOAT16、INT32、UINT32、INT64、UINT64、INT16、UINT16、INT8、UINT8、DOUBLE、BOOLND0-8√otheraclTensor*輸入輸入張量數(shù)據(jù)類型與 selfRef 需滿足互推導(dǎo)關(guān)系shape 需與 self 滿足 broadcast 關(guān)系broadcast 后的 shape 需與 selfRef 的 shape 一致FLOAT、FLOAT16、BFLOAT16、INT32、UINT32、INT64、UINT64、INT16、UINT16、INT8、UINT8、DOUBLE、BOOL---workspaceSizeuint64_t*輸出返回需要在 Device 側(cè)申請(qǐng)的 workspace 大小-----executoraclOpExecutor**輸出返回 op 執(zhí)行器包含了算子計(jì)算流程-----約束Atlas 200I/500 A2 推理產(chǎn)品、Atlas 訓(xùn)練系列產(chǎn)品不支持 BFLOAT16 數(shù)據(jù)類型。返回值與錯(cuò)誤碼返回值錯(cuò)誤碼描述ACLNN_ERR_PARAM_NULLPTR161001傳入的 selfRef、other 是空指針ACLNN_ERR_PARAM_INVALID161002selfRef 和 other 的數(shù)據(jù)類型不在支持的范圍之內(nèi)ACLNN_ERR_PARAM_INVALID161002selfRef 和 other 的數(shù)據(jù)類型無(wú)法進(jìn)行推導(dǎo)ACLNN_ERR_PARAM_INVALID161002selfRef 和 other 的 shape 無(wú)法做 broadcastACLNN_ERR_PARAM_INVALID161002selfRef 和 other 做 broadcast 后的 shape 不等于 selfRef 的 shapeACLNN_ERR_PARAM_INVALID161002selfRef、other 的維度大于 8注意原地版本的差異點(diǎn)由于結(jié)果寫回selfRef因此要求廣播后的 shape 必須與 selfRef 的 shape 相等否則無(wú)法原地寫回這是與普通版本最核心的語(yǔ)義區(qū)別。aclnnInplaceLtTensor 參數(shù)說(shuō)明參數(shù)名輸入/輸出描述workspace輸入在 Device 側(cè)申請(qǐng)的 workspace 內(nèi)存地址workspaceSize輸入在 Device 側(cè)申請(qǐng)的 workspace 大小由第一段接口 aclnnInplaceLtTensorGetWorkspaceSize 獲取executor輸入op 執(zhí)行器包含了算子計(jì)算流程stream輸入指定執(zhí)行任務(wù)的 Stream約束說(shuō)明確定性計(jì)算aclnnLtTensor與aclnnInplaceLtTensor默認(rèn)確定性實(shí)現(xiàn)。即同一輸入在相同硬件與軟件環(huán)境下多次執(zhí)行結(jié)果完全一致不會(huì)引入并行歸約順序?qū)е碌姆谴_定誤差可放心用于需要復(fù)現(xiàn)結(jié)果的訓(xùn)練與調(diào)試場(chǎng)景更詳細(xì)的背景可參考 確定性計(jì)算說(shuō)明。調(diào)用示例示例代碼僅供參考完整編譯與執(zhí)行流程請(qǐng)參考 編譯與運(yùn)行樣例。兩個(gè)完整可運(yùn)行的示例同樣保存在倉(cāng)庫(kù)中math/less/examples/test_aclnn_lt_tensor.cpp 與 math/less/examples/test_aclnn_inplace_lt_tensor.cpp。aclnnLtTensor 示例代碼#include iostream #include vector #include acl/acl.h #include aclnnop/aclnn_lt_tensor.h #define CHECK_RET(cond, return_expr) \ do { \ if (!(cond)) { \ return_expr; \ } \ } while (0) #define LOG_PRINT(message, ...) \ do { \ printf(message, ##__VA_ARGS__); \ } while (0) int64_t GetShapeSize(const std::vectorint64_t shape) { int64_t shapeSize 1; for (auto i : shape) { shapeSize * i; } return shapeSize; } int Init(int32_t deviceId, aclrtStream* stream) { // 固定寫法資源初始化 auto ret aclInit(nullptr); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclInit failed. ERROR: %d\n, ret); return ret); ret aclrtSetDevice(deviceId); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtSetDevice failed. ERROR: %d\n, ret); aclFinalize(); return ret); ret aclrtCreateStream(stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtCreateStream failed. ERROR: %d\n, ret); aclrtResetDevice(deviceId); aclFinalize(); return ret); return 0; } template typename T int CreateAclTensor(const std::vectorT hostData, const std::vectorint64_t shape, void** deviceAddr, aclDataType dataType, aclTensor** tensor) { auto size GetShapeSize(shape) * sizeof(T); // 調(diào)用aclrtMalloc申請(qǐng)device側(cè)內(nèi)存 auto ret aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtMalloc failed. ERROR: %d\n, ret); return ret); // 調(diào)用aclrtMemcpy將host側(cè)數(shù)據(jù)拷貝到device側(cè)內(nèi)存上 ret aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtMemcpy failed. ERROR: %d\n, ret); return ret); // 計(jì)算連續(xù)tensor的strides std::vectorint64_t strides(shape.size(), 1); for (int64_t i shape.size() - 2; i 0; i--) { strides[i] shape[i 1] * strides[i 1]; } // 調(diào)用aclCreateTensor接口創(chuàng)建aclTensor *tensor aclCreateTensor(shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(), *deviceAddr); return 0; } struct LtTensorData { std::vectorint64_t selfShape {4, 2}; std::vectorint64_t otherShape {4, 2}; std::vectorint64_t outShape {4, 2}; void* selfDeviceAddr nullptr; void* otherDeviceAddr nullptr; void* outDeviceAddr nullptr; aclTensor* self nullptr; aclTensor* other nullptr; aclTensor* out nullptr; std::vectordouble selfHostData {0, 1, 2, 3, 4, 5, 6, 7}; std::vectordouble otherHostData {5, 5, 5, 5, 5, 5, 5, 5}; std::vectordouble outHostData {0, 0, 0, 0, 0, 0, 0, 0}; void* workspaceAddr nullptr; uint64_t workspaceSize 0; }; int CreateInputAndOutputTensors(LtTensorData data) { auto ret 0; // 創(chuàng)建self aclTensor ret CreateAclTensor(data.selfHostData, data.selfShape, data.selfDeviceAddr, aclDataType::ACL_DOUBLE, data.self); CHECK_RET(ret ACL_SUCCESS, return ret); // 創(chuàng)建other aclTensor ret CreateAclTensor(data.otherHostData, data.otherShape, data.otherDeviceAddr, aclDataType::ACL_DOUBLE, data.other); CHECK_RET(ret ACL_SUCCESS, return ret); // 創(chuàng)建out aclTensor ret CreateAclTensor(data.outHostData, data.outShape, data.outDeviceAddr, aclDataType::ACL_DOUBLE, data.out); CHECK_RET(ret ACL_SUCCESS, return ret); return ret; } int ExecuteLtTensorComputation(aclrtStream stream, LtTensorData data) { auto ret 0; aclOpExecutor* executor; // 調(diào)用aclnnLtTensor第一段接口 ret aclnnLtTensorGetWorkspaceSize(data.self, data.other, data.out, data.workspaceSize, executor); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclnnLtTensorGetWorkspaceSize failed. ERROR: %d\n, ret); return ret); // 根據(jù)第一段接口計(jì)算出的workspaceSize申請(qǐng)device內(nèi)存 data.workspaceAddr nullptr; if (data.workspaceSize 0) { ret aclrtMalloc(data.workspaceAddr, data.workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(allocate workspace failed. ERROR: %d\n, ret); return ret); } // 調(diào)用aclnnLtTensor第二段接口 ret aclnnLtTensor(data.workspaceAddr, data.workspaceSize, executor, stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclnnLtTensor failed. ERROR: %d\n, ret); return ret); // 同步等待任務(wù)執(zhí)行結(jié)束 ret aclrtSynchronizeStream(stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtSynchronizeStream failed. ERROR: %d\n, ret); return ret); return ret; } int ProcessAndPrintResults(const LtTensorData data) { auto ret 0; auto size GetShapeSize(data.outShape); std::vectordouble resultData(size, 0); ret aclrtMemcpy(resultData.data(), resultData.size() * sizeof(resultData[0]), data.outDeviceAddr, size * sizeof(resultData[0]), ACL_MEMCPY_DEVICE_TO_HOST); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(copy result from device to host failed. ERROR: %d\n, ret); return ret); for (int64_t i 0; i size; i) { LOG_PRINT(result[%ld] is: %lf\n, i, resultData[i]); } return ret; } void ReleaseResources(LtTensorData data) { // 釋放aclTensor和aclScalar aclDestroyTensor(data.self); aclDestroyTensor(data.other); aclDestroyTensor(data.out); // 釋放device資源 aclrtFree(data.selfDeviceAddr); aclrtFree(data.otherDeviceAddr); aclrtFree(data.outDeviceAddr); if (data.workspaceSize 0) { aclrtFree(data.workspaceAddr); } } int ExecuteLtTensorOperator(aclrtStream stream) { LtTensorData data; // 創(chuàng)建輸入和輸出張量 auto ret CreateInputAndOutputTensors(data); CHECK_RET(ret ACL_SUCCESS, return ret); // 執(zhí)行LtTensor算子操作 ret ExecuteLtTensorComputation(stream, data); CHECK_RET(ret ACL_SUCCESS, return ret); // 處理并打印結(jié)果 ret ProcessAndPrintResults(data); CHECK_RET(ret ACL_SUCCESS, return ret); // 釋放資源 ReleaseResources(data); return 0; } int main() { int32_t deviceId 0; aclrtStream stream; auto ret Init(deviceId, stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(Init acl failed. ERROR: %d\n, ret); return ret); // 執(zhí)行LtTensor操作 ret ExecuteLtTensorOperator(stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(ExecuteLtTensorOperator failed. ERROR: %d\n, ret); return ret); // 重置設(shè)備和終結(jié)ACL aclrtDestroyStream(stream); aclrtResetDevice(deviceId); aclFinalize(); return 0; }示例中self {0,1,2,3,4,5,6,7}、other {5,5,5,5,5,5,5,5}逐元素執(zhí)行比較后期望輸出前 5 個(gè)元素為True對(duì)應(yīng)數(shù)值 1.0后 3 個(gè)元素為False對(duì)應(yīng)數(shù)值 0.0。結(jié)果通過(guò)aclrtMemcpy(..., ACL_MEMCPY_DEVICE_TO_HOST)拷回 Host 側(cè)打印驗(yàn)證。aclnnInplaceLtTensor 示例代碼#include iostream #include vector #include acl/acl.h #include aclnnop/aclnn_lt_tensor.h #define CHECK_RET(cond, return_expr) \ do { \ if (!(cond)) { \ return_expr; \ } \ } while (0) #define LOG_PRINT(message, ...) \ do { \ printf(message, ##__VA_ARGS__); \ } while (0) int64_t GetShapeSize(const std::vectorint64_t shape) { int64_t shape_size 1; for (auto i : shape) { shape_size * i; } return shape_size; } int Init(int32_t deviceId, aclrtStream* stream) { // 固定寫法,資源初始化 auto ret aclInit(nullptr); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclInit failed. ERROR: %d\n, ret); return ret); ret aclrtSetDevice(deviceId); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtSetDevice failed. ERROR: %d\n, ret); aclFinalize(); return ret); ret aclrtCreateStream(stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtCreateStream failed. ERROR: %d\n, ret); aclrtResetDevice(deviceId); aclFinalize(); return ret); return 0; } templatetypename T int CreateAclTensor(const std::vectorT hostData, const std::vectorint64_t shape, void** deviceAddr, aclDataType dataType, aclTensor** tensor) { auto size GetShapeSize(shape) * sizeof(T); // 調(diào)用aclrtMalloc申請(qǐng)device側(cè)內(nèi)存 auto ret aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtMalloc failed. ERROR: %d\n, ret); return ret); // 調(diào)用aclrtMemcpy將host側(cè)數(shù)據(jù)拷貝到device側(cè)內(nèi)存上 ret aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtMemcpy failed. ERROR: %d\n, ret); return ret); // 計(jì)算連續(xù)tensor的strides std::vectorint64_t strides(shape.size(), 1); for (int64_t i shape.size() - 2; i 0; i--) { strides[i] shape[i 1] * strides[i 1]; } // 調(diào)用aclCreateTensor接口創(chuàng)建aclTensor *tensor aclCreateTensor(shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(), *deviceAddr); return 0; } int ExecuteInplaceLtTensorOperator(aclrtStream stream) { auto ret 0; std::vectorint64_t selfShape {4, 2}; std::vectorint64_t otherShape {4, 2}; void* selfDeviceAddr nullptr; void* otherDeviceAddr nullptr; aclTensor* self nullptr; aclTensor* other nullptr; std::vectordouble selfHostData {0, 1, 2, 3, 4, 5, 6, 7}; std::vectorint otherHostData {1, 1, 1, 1, 0, 0, 0, 0}; ret CreateAclTensor(selfHostData, selfShape, selfDeviceAddr, aclDataType::ACL_DOUBLE, self); CHECK_RET(ret ACL_SUCCESS, return ret); ret CreateAclTensor(otherHostData, otherShape, otherDeviceAddr, aclDataType::ACL_INT32, other); CHECK_RET(ret ACL_SUCCESS, return ret); uint64_t workspaceSize 0; aclOpExecutor* executor; ret aclnnInplaceLtTensorGetWorkspaceSize(self, other, workspaceSize, executor); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclnnInplaceLtTensorGetWorkspaceSize failed. ERROR: %d\n, ret); return ret); void* workspaceAddr nullptr; if (workspaceSize 0) { ret aclrtMalloc(workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(allocate workspace failed. ERROR: %d\n, ret); return ret); } ret aclnnInplaceLtTensor(workspaceAddr, workspaceSize, executor, stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclnnInplaceLtTensor failed. ERROR: %d\n, ret); return ret); ret aclrtSynchronizeStream(stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtSynchronizeStream failed. ERROR: %d\n, ret); return ret); auto size GetShapeSize(selfShape); std::vectordouble resultData(size, 0); ret aclrtMemcpy(resultData.data(), resultData.size() * sizeof(resultData[0]), selfDeviceAddr, size * sizeof(resultData[0]), ACL_MEMCPY_DEVICE_TO_HOST); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(copy result from device to host failed. ERROR: %d\n, ret); return ret); for (int64_t i 0; i size; i) { LOG_PRINT(result[%ld] is: %lf\n, i, resultData[i]); } aclDestroyTensor(self); aclDestroyTensor(other); aclrtFree(selfDeviceAddr); aclrtFree(otherDeviceAddr); if (workspaceSize 0) { aclrtFree(workspaceAddr); } return 0; } int main() { int32_t deviceId 0; aclrtStream stream; auto ret Init(deviceId, stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(Init acl failed. ERROR: %d\n, ret); return ret); // 執(zhí)行InplaceLtTensor操作 ret ExecuteInplaceLtTensorOperator(stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(ExecuteInplaceLtTensorOperator failed. ERROR: %d\n, ret); return ret); // 重置設(shè)備和終結(jié)ACL aclrtDestroyStream(stream); aclrtResetDevice(deviceId); aclFinalize(); return 0; }原地示例展示了兩個(gè)工程要點(diǎn)輸入可以是混合數(shù)據(jù)類型self為ACL_DOUBLE、other為ACL_INT32兩者滿足互推導(dǎo)關(guān)系f64 與 s32 推導(dǎo)為 f64由接口內(nèi)部完成隱式轉(zhuǎn)換無(wú)需用戶手動(dòng) Cast結(jié)果從self的 Device 地址讀取執(zhí)行完aclnnInplaceLtTensor后比較結(jié)果直接寫回self所在內(nèi)存因此只需從selfDeviceAddr拷回結(jié)果即可全程無(wú)需分配輸出張量。源碼級(jí)原理剖析接口層的完整計(jì)算流水線在 math/less/op_api/aclnn_lt_tensor.cpp 的注釋中完整計(jì)算流程被描述為self other | | \ / Contiguous(workspace_0) Contiguous(workspace_2) \ / Cast(workspace_1) Cast(workspace_3) \ / Less(workspace_4) | Cast(workspace_5) | ViewCopy | result對(duì)應(yīng)aclnnLtTensorGetWorkspaceSize的實(shí)現(xiàn)邏輯aclnn_lt_tensor.cpp空 Tensor 快速路徑若self或other為空 Tensor直接返回workspaceSize 0不構(gòu)造計(jì)算圖隱式類型提升先通過(guò)op::PromoteType或 A2 平臺(tái)上的op::BinaryOpTypePromote推導(dǎo)統(tǒng)一計(jì)算類型特別地若推導(dǎo)結(jié)果為DT_BOOL會(huì)提升為DT_UINT8aclnn_lt_tensor.cpp因?yàn)?BOOL 參與向量比較計(jì)算不直接、且 kernel 側(cè)統(tǒng)一按 uint8 語(yǔ)義處理布爾結(jié)果Contiguous Cast分別對(duì)self、other做l0op::Contiguous支持非連續(xù)張量輸入與l0op::Cast轉(zhuǎn)換為統(tǒng)一推導(dǎo)類型Less 核心計(jì)算調(diào)用l0op::Less完成逐元素比較產(chǎn)出 BOOL 結(jié)果Cast ViewCopy將 BOOL 結(jié)果 Cast 成out的目標(biāo)數(shù)據(jù)類型如示例中的 DOUBLE再通過(guò)l0op::ViewCopy拷貝到輸出張量從而兼容out為非連續(xù)張量的情況最后通過(guò)executor-GetWorkspaceSize()匯總整條流水線各階段workspace_0 至 workspace_5所需的臨時(shí)內(nèi)存總大小。Inplace 接口的實(shí)現(xiàn)本質(zhì)從 aclnn_lt_tensor.cpp 可以看出aclnnInplaceLtTensorGetWorkspaceSize的實(shí)現(xiàn)極為簡(jiǎn)潔aclnnStatus aclnnInplaceLtTensorGetWorkspaceSize(const aclTensor* selfRef, const aclTensor* other, uint64_t* workspaceSize, aclOpExecutor** executor) { auto out const_castaclTensor*(selfRef); return aclnnLtTensorGetWorkspaceSize(selfRef, other, out, workspaceSize, executor); }即原地版本只是將selfRef同時(shí)作為輸出out傳給普通版本計(jì)算完成后結(jié)果通過(guò) ViewCopy 寫回selfRef的內(nèi)存。這也解釋了為何原地版本要求broadcast 后的 shape 必須與 selfRef 的 shape 一致——輸出寫回的目標(biāo)地址容量是固定的。平臺(tái)相關(guān)的數(shù)據(jù)類型支持在 aclnn_lt_tensor.cpp 中輸入與輸出的數(shù)據(jù)類型支持列表按平臺(tái)區(qū)分ASCEND910Atlas 訓(xùn)練系列產(chǎn)品等輸入支持 FLOAT、INT32、INT64、FLOAT16、INT16、INT8、UINT8、DOUBLE、UINT32、UINT64、BOOL、UINT16不含 BFLOAT16ASCEND910B 及以上Atlas A2/A3、Ascend 950 等或 RegBase 架構(gòu)在上述基礎(chǔ)上額外支持 BFLOAT16輸出側(cè)還額外支持 COMPLEX64、COMPLEX128作為 BOOL 可轉(zhuǎn)換的目標(biāo)類型。這一差異正是原文檔中Atlas 訓(xùn)練系列產(chǎn)品、Atlas 200I/500 A2 推理產(chǎn)品不支持 BFLOAT16約束的代碼級(jí)來(lái)源由GetCurrentPlatformInfo().GetSocVersion()動(dòng)態(tài)判定。算子定義、InferShape 與 Tiling在算子定義層面math/less/op_host/less_def.cpp算子名為L(zhǎng)ess輸入為x1、x2輸出為y輸入數(shù)據(jù)類型支持 BF16、FLOAT16、FLOAT、INT8、UINT8、INT32、INT64、UINT64、BOOL、DOUBLE輸出固定為 BOOLAICore 配置開啟DynamicCompileStaticFlag、DynamicRankSupportFlag、DynamicShapeSupportFlag即支持動(dòng)態(tài) shape 與動(dòng)態(tài) rank 編譯并指定 kernel 文件為less_apt在 math/less/op_host/less_infershape.cpp 中InferShape 直接復(fù)用廣播基類Ops::Base::InferShape4Broadcast與接口層shape 需滿足 broadcast 關(guān)系的校驗(yàn)保持一致在 math/less/op_host/arch35/less_tiling_arch35.cpp 中tiling 按輸入數(shù)據(jù)類型int64、uint64、int32、float、half、uint8、int8/bool、double實(shí)例化對(duì)應(yīng)的BroadcastBaseTilingLessComputeT::OpDag模板同一時(shí)刻要求x1與x2的數(shù)據(jù)類型一致該文件在接口層完成類型提升后天然滿足。Kernel 層的 DAG 計(jì)算圖在 math/less/op_kernel/arch35/less_dag.h 中kernel 通過(guò) DAG有向無(wú)環(huán)圖描述計(jì)算輸入經(jīng)Vec::CopyInBrcT廣播拷貝進(jìn) Vector 單元Input0/Input1Vec::Compareuint8_t, T, LESS_CMP_MODELESS_CMP_MODE 0執(zhí)行小于比較產(chǎn)出 uint8 掩碼再經(jīng)Vec::SelectLESS_SELECT_MODE 2結(jié)合常量 1/0 把比較結(jié)果映射為布爾值最終Vec::CopyOutuint8_t寫回輸出內(nèi)存配置為MemLevel::LEVEL_2。入口 math/less/op_kernel/less_apt.cpp 中l(wèi)esskernel 使用BroadcastSchschMode, OpDag調(diào)度器統(tǒng)一處理廣播邏輯當(dāng)輸入類型為 BOOL 時(shí)按int8_t模板實(shí)例化其余類型按DTYPE_X1模板實(shí)例化。此外math/less/op_kernel_aicpu/less_aicpu.cpp 提供 AICPU 側(cè)的兜底實(shí)現(xiàn)。二進(jìn)制配置與測(cè)試驗(yàn)證算子的各數(shù)據(jù)類型二進(jìn)制配置位于 math/less/op_host/config/ascend950/less_binary.json如Less_BFLOAT16、Less_FLOAT32、Less_INT64等輸出統(tǒng)一為bool以及 math/less/op_host/config/ascend350/less_binary.json。倉(cāng)庫(kù)同時(shí)提供了多層次的測(cè)試用例用于驗(yàn)證接口行為OP API 單元測(cè)試math/less/tests/ut/op_api/test_lt_tensor.cpp 覆蓋 FLOAT、FLOAT16、INT32、INT64 等多種 dtype 與 ND/NHWC/NCHW 等 format 組合并包含廣播場(chǎng)景如{4,5}與{2,3,4,5}的廣播比較通過(guò)OP_API_UT(aclnnLtTensor, ...)框架自動(dòng)校驗(yàn)GetWorkspaceSize與計(jì)算結(jié)果InferShape 單元測(cè)試math/less/tests/ut/op_host/test_less_infershape.cppAICPU 兜底測(cè)試math/less/tests/ut/op_kernel_aicpu/test_less.cppST 測(cè)試math/less/tests/st/aclnnLtTensor/atk_aclnnLtTensor.json 與 math/less/tests/st/arch35/ttk_kernel_less_st.csv。工程選型建議需要保留原輸入時(shí)使用aclnnLtTensor自行創(chuàng)建out張量接收結(jié)果希望節(jié)省內(nèi)存、原輸入不再需要時(shí)使用aclnnInplaceLtTensor直接將selfRef原地改寫省去一份輸出張量的申請(qǐng)與拷貝注意廣播約束普通版本允許out的 shape 等于廣播后 shape原地版本要求廣播后 shape 與selfRefshape 完全一致平臺(tái)差異在 Atlas 訓(xùn)練系列產(chǎn)品、Atlas 200I/500 A2 推理產(chǎn)品上避免使用 BFLOAT16 輸入否則第一段接口會(huì)返回ACLNN_ERR_PARAM_INVALID。如需了解算子本身的完整語(yǔ)義、參數(shù)總覽與其他調(diào)用方式如 aclnnLtScalar、圖模式調(diào)用可進(jìn)一步閱讀 math/less/README.md 與同目錄下的 aclnnLtScalaraclnnInplaceLtScalar 文檔。贊分享算子庫(kù)人工智能CANN【免費(fèi)下載鏈接】ops-math本項(xiàng)目是CANN提供的數(shù)學(xué)類基礎(chǔ)計(jì)算算子庫(kù)實(shí)現(xiàn)網(wǎng)絡(luò)在NPU上加速計(jì)算。項(xiàng)目地址https://gitcode.com/cann/ops-math點(diǎn)擊查看免費(fèi)下載相關(guān)推薦CANN ops-math Less 算子 aclnnLtTensor 與 aclnnInplaceLtTensor 接口調(diào)用指南CANN ops math Less 算子 aclnnLtTensor 與 aclnnInplaceLtTensor 接口調(diào)用指南 本篇技術(shù)指南以 CANN o算子庫(kù)人工智能CANNCANN ops-math 算子實(shí)戰(zhàn)aclnnDiv 與 aclnnInplaceDiv 除法算子接口全解析CANN ops math 算子實(shí)戰(zhàn)aclnnDiv 與 aclnnInplaceDiv 除法算子接口全解析 本篇技術(shù)指南圍繞 CANN ops math 數(shù)算子庫(kù)人工智能CANNCANN ops-math 除法取模算子 aclnnDivMod / aclnnInplaceDivMod 接口全解析與實(shí)戰(zhàn)CANN ops math 除法取模算子 aclnnDivMod / aclnnInplaceDivMod 接口全解析與實(shí)戰(zhàn) 本文是 CANN ops math算子庫(kù)人工智能CANN創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
www狠狠| 日韩无码精品综合久久| 国内精品不卡无毒99999| 亚洲一卡二卡在线免费| 超碰在线综合97| 久久黄黄| 欧美拳交在线播放| 一级黄色牲爱A级片| 亚洲精品一二牛牛| 国产性爱强奸乱伦大全| 亚洲影视综合| 色网在线视频观看免费| 99re在线| 97ai亚洲| 日韩综合第八区国产精品| 欧美日韩资源在线| 日美免费黄片| 高清国产成人无码| 色狠狠一区二区三区香蕉| 江都AV在线| 自拍鲍鱼一区在线高清观看免费| 波多野结衣AV无码一区| 老司机香蕉久久久久| 天天噜| 久久久精品视频免费观看| 亚洲一本色道中文无码aV天美| 日产123区精品免费观看| 91激情综合| 国产成人亚洲精品自产在线| 99re98| 嗯,啊。舔我逼| 日韩性爱网址| 97欧美色| 成人片在线播放| 久久超碰、| 综合网91| 欧美日韩情色一区二区| 欧美精品第四五页中文字幕在线观看| 日韩一级二级三级免费看完整版国语版| 吻戏激情性巴克| 超碰精品在线| 夜夜夜久久| 精品少妇后入一区二区三区四区人妻巨乳 | 久久婷婷精品| 97人人干| 95精品在线| 思思热在线视频精品| 欧美麻豆成人同性GⅤ在线| 四虎影视永久在线免费| 五月丁香综合| 亚洲,欧美,春色,另类| 综合网亚洲1| 97超碰资源网| 亚洲 中文 欧美 日韩 在线| 果冻传媒A片麻豆熟妇人妻| 日韩欧美麻豆| 黄色免费一级在线毛片| 久久激情亚洲精品无码?V| 操亚州| 欧洲精品网| oumeizonghese,www| 欧美在线视频观看一二三四区高清| 传媒免费一区二区三区| 人人干黄色| 天天综合~91| 日产中文字幕2020| a人片中文字幕一区二区| 男人的天堂在线| 一区二区亚州激情久婷婷欧美| 中文字幕伊人| 日韩黄色片子| 国产精品免费视频不卡| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 亚洲熟妇极品| 精品无码人妻一区二区免费蜜桃| 久久久999国产精品| 久久成年片色大黄全免费网站| 立川理惠被中出无码| 天天色天天干天天射| 国产精品老师| 日韩中文字幕宗合在线| 秋霞一级鲁丝片A片| 亚洲第一页综合在线| 欧美性夜| 激情视频网址| 久久大精品乱码视频人妻熟女| 国产乱不卡| 在线视频 亚洲精品| 日本视频一区二区三区| 国产乱弄免费在线视频。 | 337p大胆噜噜噜噜噜91Av| 欧美白嫩女HD| 美女被啪到深处抽搐视频| 国产黄色 A 片免费看| 五月婷婷六月丁香| 人妻喷水| 日本激情免费大片| 素颜老阿姨乱情色| 婷婷色色五月天福利| 国产热RE99久久6国产精品首| 亚洲色图超碰在线| 在线人成亚洲视频免费观看| 白嫩嫩一区| 色97欧美| 91爱综合| se..亚洲欧美| 夜夜嗷嗷一区二区| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 欧洲乱码一区二区| 亚洲欧洲激情卡通另类文学四射小说网站| 国产精品一级毛片不卡视| 香港成人一级视频在线青青草| 人妻91少妇| 欧美疯狂做爰xxxx| 四虎av在线| 无码精品人妻一区二区三区妖精| 日韩一级欧美一级国产一级台湾 | 加勒比99999| 国产精品爽爽v| 伊人五月天青青草婷婷| 成人蜜乳小视频网站| 中文字幕啊啊啊在线观看视频| 99福利社| 狠狠久久四虎| 视频一区二区免费在线| 久久久久密臀一区二区| 日韩欧美俄罗斯A片| 裸体美女久久久| 成年人黄色小视频网站| 女同性恋中文字幕| 一本道综合色图| 96精品久久| 五月黑AⅤ| 97chaopengongkai| 欧美性区| 岛国黄色大片网站| 人妻丝袜一区二区三区在线| 亚洲天堂区| 九九九九九精品视频| 丁香五月色| 国产精品剧情| 无码视频一区二区| 小情侣高清国产在线视频| 色97国产69香蕉| 五月婷婷久久综合| 久久久亚洲熟妇熟女| 亚洲春色激情小说| 亚洲,日韩,欧美,成人播放| 玖玖爱一区在线| 国产成人午夜视频网址| 青青久草| 精品999日本| 日韩亚洲Av人人夜夜澡人人爽| 国产超碰欧美| 91撸色网 玖玖网 欧美| 欧美精品四区| 最新三级网址| 人妻啊啊人妻啊| 中文操逼字幕| 人妻少妇久久| 真实高潮91| 精品国产丝袜一区二区三区乱码| 狠狠91| 亚洲一本色码中文字幕| 秋霞视频一区二区| 日韩欧美大片免费高清啪啪| 91在线国产后入风骚翘臀美女素人| 你懂得91| 熟女人妻一区二区三区| 久久夜夜夜夜| 色色网91| 91一区二匹| 熟女人妻精品一区二区视频 | 日韩欧美偷拍美女视频| 青青草自拍视频在线播放| 黄色av网站在线播放| 蜜臀Av一区二区三区| 青青草视频在线观看一区二区| 国产Aα| 91久| 日韩日韩日韩-国产乱码精品一区二区| 日韩精品一二三四| 国产久久久久久久久一区二区| 国产毛片毛片4p懂色| 制服丝袜第二页| 久久久久9久久久久| 色娱乐色呦呦夜夜夜夜av| 日本综合久久| 国产女人成人精品视频| 欧美精品一区二区少妇免费A片| 日夜精品| 天天操福利视频综合网站| 超碰综合97在线| 大香蕉专区| 婷婷涩嫩草鲁丝久久午夜精品| 九九热精彩视频| 久久久久密| 国产成人无码网站在线视频| 伊人在线大香蕉视频久久| 日本一道在线播放高清| 3PAV乱伦视频| 9久精品| 大香蕉伊人75| 九九九久久久W精品| 老鸭窝日丰县女人| 日日日大屁股骚女人精品| 黑丝91视频| 久久啊哟| 青青草精品| 91美女精品| 操人无码| 日日夜夜狠狠| 91久精品| 啊啊啊好湿久久| 欧州色图区| 怡红院视频在线| 欧美 亚洲 制服 精品| 综合熟女| 欧美少妇大量自拍视频在线观看| 亚洲日韩AV视色| 六月色色| 久久无码精品| 国产精品白丝| 香蕉热人人精品| 成人免费看吃奶视频网站| 久久久久久久久久久免费精品| 免费观看日本操逼视频| 一级岛国大片| 中文字幕精品资源在线| 婷婷六月天| 成人看片网站| 国产人妻天天干精品| 青女偷拍网| 日韩人妻丝袜中文字幕| 亚洲天堂精品日韩电影| 在线观看亚洲成人精品| 八戒无码国产午夜福利| 亚洲啪啪视频一区二区| 丁香五月天堂| 精品对白久久不卡| 伊人综合色网| 激情综合av| 尤物网址| 亚洲色图日韩精品| 日韩久久激情精品| 60秒试看最爽10分钟网站| 精品176精品2| 欧美天天| 99综合免费视频| 天色综合网| 老司机午夜福利视频一区二区| 人妻美腿丝袜日韩| 日韩熟女无码| 人妻久久久| 9精品在线| 久久三| 俺去也婷婷| 操一对老熟妇爽上天视频| 大香蕉av在线| 久久久久久久六六| 午夜福利国产欧美日韩夜夜| 99操逼| 伊人操操| 无码操逼视频一下| 日韩人妻精品久久久久| 亚洲一二三四区在线免费看视频 | 亚洲国产一级精品毛一级精品看免费视频 | 91亚洲不卡一区| 97超碰欧美手机在线| 国产中出内射一区二区| 99色婷婷| 春色综合免费| 色官网色综合| 亚洲精品天天影视综合网| 婷婷性网| 亚洲欧美国产成人综合不卡| 亚洲999综合| 大香蕉欧美| 天堂8在线新版官网| 欧美亚洲影视| 国内偷拍精品一区二区| 999在线电影香蕉| 凹凸 69堂 在线播放| 成人av影院在线观看| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 亚洲小说视频| 久久怡红院| 3p国产色噜噜一区| 香蕉av一区二区三区| 精品人妻免费观看| 精品乱子一区二区三区99| 欧美日韩中文字幕人妻| 婷婷香蕉欧美在线一区二区三区| 91久久国产精品| 久久夜黄色无码A级大片| 日逼五月天| 亚洲欧美日韩免费电影| 超碰在线1234区| 国产精品一区二区三区,亚洲综合| 欧洲精品网| 岛国片在线视频网站| 日日夜夜骚| 天天看天天干| 超碰1997| 免费视频a级毛片免费视频| 国产精彩女在线观看视频| 2017人人操,人人摸| 青草一区二区| 91色人妻| 五十路一区无码| 69天堂| 草草影院最新网址| 色九月| 色淫网站优优视频| 国产不卡精品91| V A在线| 亚洲精品国产AV天美传媒| 欧美一级美片在线观看免费| 九九热精彩视频| 日本Xx性爱| 97在线视频免费看| 色狠狠综合噜一二三区| 亚洲情色1区| 日本韩高清无砖码22o| 亚洲综合888| 国产精品点击进入在线影院| 97久久天天综合色天天综合色电影| 91丨熟女丨丰满熟女| 亚州高清AV| 日韩性色b| 久久久一区二区三区三州| 东北女人操比视频| 婷婷性爱| 婬女免费一二三区A片| 五十路一区无码| 亚州再线| 五月婷婷六月丁香| 四虎影院成年人片| 国产乱子伦一区二区三区免看| 亚洲图片欧美91N| 日欧美色| 亚洲人妻色图| 爱干爱射网啊啊啊| 亚洲欧美激情在线视频| 日本东京热久久久电影| 男人天堂无码| 操一区| 免费久久精品麻豆一区二区av| 亚洲天堂男人天堂| 夜夜嗨老熟女AV一区二区三区| 亚州精品一区二区三区香中文字幕在线| 日本熟女不卡视频| 五十路三区在线| 天堂伊人久久| 国模不卡一本二本三电影| 国产又爽又黄| 久久久免费的精品| 人人玩人人添人人澡免费| 久操频道免费在线呗看| 国产精品大屁股999| sss视频华人在线| 五月天偷拍| 亚洲精品人妻在线| 国产兽交视频在线播放| 久久久精品网站| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 好爽视频在线观看视频| 高颜值美女口爆高潮浪叫| 九九热免费国产视频婷婷伊人五月| 久久av成人无码免费| 日本一道在线播放高清| 殴美色网| 亚洲精品97久久| 日本五区不卡| 伊人久久亚洲色欲综合网站 | 亚洲天堂2020| 亚洲毛片久久| 美女诱惑久久| 大香蕉综合网| 欧美97超碰| 98超碰欧美| 91色综合色| 小骚逼被操的爽不爽| 欧美页片| 日韩一级二级三级免费看完整版国语版 | 欧美综合第一| 成人在线午夜视频一区| 中文欧丝袜诱惑| 香蕉av一区二区三区| 日韩钢筋无码高清啾啾啾| 亚州成人A√| 91国产丝袜足交精品视频| 中文字幕啊啊啊在线观看视频| 色综合色| 亚洲情色婷婷五月天| 私色综合网| 国内91熟女人妻丝袜天天精品视频在线| 久久久婷婷婷| 国产不卡精品91| 嗯嗯啊啊用力视频免费| 日韩在线97| AV99热18这里只有精品| 亚洲影视第一页| 精品人妻一区二区三区四区| 尤物网站91| 性色av大全| 久久一区二区高清免费| 97碰在线视频| 日日干日日操五月天伦理视频| 大香蕉啪啪啪啪在线| 任我爽在线视频免费观看| 91在线国产后入风骚翘臀美女素人| 欧美日韩精品久久久久东北老熟妇| 中文字幕一区日韩精| 中文字幕日韩国产传媒欧美精品| 中文字幕福利视频一区二区三区在线观看| 97视频在线免费播放| 色婷婷五月综合| 婷婷九月| 欧美日韩亚洲少妇寂寞影院正在播放 | 综合五月天| 免费国产视频| 久久一区二区高清免费| 亚洲性爱高潮影院| 99精品高潮| 欧美性夜| A V视频日本| 激情第四色| 10000部十八禁看电影| 色与欲影视天天看综合网| 免费试看60秒| aⅴ日韩成人电影av在线免费看av大全| 日本福利社| 素颜老阿姨乱情色| 亚洲综合第一页| 国产偷拍自拍在线视频| 99re8超碰| 东北女人高潮视频| 淫荡少妇免费| 国产天天骚| 黄色成年| 大香蕉一线视频| 亚洲网自拍| 蜜臀99久久| 国模精品娜娜一二三区| 屌妞视频久久久久久久久久久久| 久久综合97| 尤物一级在线免费观看| 蜜桃久久久久久久久久久久| 国产97在线视频| 男女真人网18| 加勒比海成人视频网| 日韩啪啪视频| 亚洲综合激情五月久久| 自拍第一页| 久久黄片国产一区二区| 亚洲人成色9999精品久久| 色原狠狠天天天| 国产熟女乱论| 后入式福利| 国语av最新自产拍在线观看| 欧美日韩亚洲五月天婷婷| 伊人AAA| 婷婷久久久精品| aaaa少妇高潮大片| 亚洲综合大片| 91成人精品在线播放| 夜夜国产一区| 一区二区影院| 欧美性天天影院| 久久精品日韩| 日韩中文9| 免费作爱一级视频| 骚妻少妇精品性色无码四色A V| 综合免费无码中文| 日韩精品国模| 色牛牛AV| 欧美日韩资源| 免费人人搞97| 免费看黄视频亚洲网站| 男人天堂 天天射| av日韩在线观看电影| 死我十八禁| 午夜男女爽爽爽在线视频| 欧美日韩人妻精品一区二区三区 | 国产又粗又长又大的视频| 久久久久久波多野吉衣高潮| 女同女同恋久久级三级| 97网址97| 日韩性爱高清免费视频| 国产精品一区二区三| 99国产人成精品| 日韩亚洲欧美中文字幕| 欧美色图片91| 亚洲无码?第一页| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 精品美女久久一二三| 欧美色性爱| 亚洲自拍小说| 精品久久久久9999| 淫荡熟女乱伦网| 97久久久网站| 欧美亚洲一区二区久久久婷精品大包诱| 18禁在线视频| 亚洲乱熟女一区二区| 裸体美女国产免费久久久网站| 国产精品美女视频诱惑| 亚洲自拍欧美色综合| 日本污ww视频网站| 欧美人与动性人交a| 性爱视频无打码在线观看| 91nbbbbbb| AAA久久| 中文字幕精品免费一区二区| 少妇人妻激情四射| 后入 亚洲 美女 射| 国产精品自拍xxxx| 超碰成人人人爽人人爽| 日韩中文9| 狠狠躁AV| 午夜丁香婷婷| 少妇高潮特黄A片| 国产精品96| 中文子幕一二三| 四虎AV无码| 亚洲夜夜欢无码一区二区| 26UUU欧美日本| 大色网久久| 日韩精品电影| 精品无人区麻豆乱码久久久| 婷婷五月天影院| 国产精品色片一区二区| 五月天婷婷在线看 | 国产精品久久99日日| 96精品久久久久久久久久| 大香蕉日亚洲日本亚大| 青青草伊人久久| 天美传媒国产原创中文字幕亚洲欧美另类 | 综合熟女| 欧美精品1区2区3区| 九九综合久久中文字幕| 操逼网站网站| 中字幕人妻一区二区三区| 精品一区二区三区四区外站| 99操逼| 久久草草亚洲蜜桃臀| A 在线网址| 精品久久九| 夜夜爽妓女| 99在线精品观看99| 欧美日综合| 亚洲乱码尤物193YW| 中文字幕五月婷婷免费| 日日干天天干夜夜爽| 新亚洲无码| 免费试看60秒| 97爱爱| 91综合色| 天天色图| 天天看精品动漫视频一区| 91天天综合| 日韩无码人妻| 青青青国产手线观看视频2| 中英熟女操女| a片偷拍视频| 成人av福利在线观看| 国模无码人体一区二区三| 免费精品无码一级毛片牛牛影视 | 国产日逼视频| 国产乱人伦AVA麻豆软件.| 一本一道波多野毛片中文在线| 欧美伊人久久综合网| 韩三级a视频在线观看| 亚洲黄色视频在线观看视频| 天天躁日日躁AAAAXXXX国产| 国产精品人妻熟女aⅴ| 夜夜久久| 91n免费处女| 91在线一起| 婷婷五月天丁香花| 精品一区二区亚洲国产| 日本不卡一区二区三区| 人人操我人人干| 116美女午夜| 97久久综合网| 亚洲中文字幕av | 国产欧美日韩在线观看麻豆传媒公司| 亚洲有码 视频一区| 精品国产嫩穴视频| 蜜臀亚洲综合一二三四区| 人妻熟女一区二区| 久久久日本电影| 一级人妻性爱视频| 成人综合久久精品色婷婷| 黑操B| 日韩国产十八禁| 综合情欲网| 国产AB视频| 欧美 日韩第一性色| 免费毛片在线播放| 丝袜AV一区二区三区| 九九Av| 亚洲日韩美国人妻| 加勒比性爱成人在线| 色路综合| 欧美激情另类一区二区| 丁香五月天堂网| 丁香五月天久久精品视频一区二区三区| 国产乱码精品久久久久久| 天天色综合影视网| 久久精品国产99精品亚洲蜜... | 污污污8888| 麻豆精品.欧美精品.日韩精品.| 在线女人91| 国桃视频产巨乳精品一区二区在线| 青青青在线高清视频在线一二三四区| 国产三级在线现体验区| 啊啊啊不要好疼视频| 亚洲人人夜夜澡人人爽| 日韩熟女操逼| 乱伦图一区| 日本不卡在线二区三区| 啊啊啊草死我| 日本高清一区二区在线| 中文在线久久字幕| 欧美少妇人妻| 婷婷在线精品| 亚洲有码第一页| 精品视频一区二区| AV 少妇 人妻 偷拍| 欧美第一页| 久久精品日韩| 东北女人的毛片| 国产h小视频在线观看免费| 欧美黄色大香蕉一区二区| 国产久久男人天堂| 人人操人人操人人操人人操人人操人人人11.CM | 成·人免费午夜在线观看| 乱色视频中文字幕| 青青青草原| 久久性爱网站| 激情人妻另类| 亚洲 日韩 丝袜 熟女 变态| www.高清无码诱惑一区.com| se吧提供国产乱老熟视频胖女人| 91国产大片| 久久香蕉综合一本到3atv| 国产精品久久久777| 久久综合九色综合欧洲98| 欧美激情总合网| 伊人91| 亚洲五月丁香花狠狠干一区二区三区| 久99在线免费观看视频| 亚洲国产一区二区三区四区国产| 九九九九九九免费视频| 国产av美女被艹的乱叫| 99热线麻豆| 精品国产片亚洲一区| 国际精品久久久| 五月丁香久久| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 粉嫩av久久一区二区三区| 无码欧美有限公司| 九九九精品成人免费视频小说| 天天干一区二区| A级片日韩欧美国产欧美视频精选观看| 大香蕉手机在线视频| 麻豆三极片| 亚洲精品蜜桃久久久久久久| 狠狠色噜噜狠狠狠狠狠色综合久久| 无毛精品| 亚洲.欧美.丝袜.中文.综合| 亚洲伊人久久综合97| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 亚洲中字慕不卡| 婷婷15月天青娱乐| 日躁天天爽爽| 10000部十八禁看电影| 久久毛卡| 欧美成人精品欧美一级乱黄一区二…| 久久国色天香香蕉| 日本熟女中文字幕一区| 美女十八禁| 中文字幕丝袜美腿| 大香蕉乱级| 亚洲男人的天堂AV| 香伊人在线| 91熟女视频网| 婷婷激情一区二区三区俺也去| 日韩乱中文| 欧美天天干| 国产成人天堂| 人人爽天天爽| 日韩成人性爱AV| 日日骚中文字幕| 9长久久精品| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 欧美日韩久久精品爱爱| 日韩在线97| 嗯啊不要在线观看嗯啊| 久久毛卡| 日韩欧美福利视频看看| 久久久久成人网| 很很很很操| 成年男人的天堂| www.99在线| 欧美极品美女aaaaaa级黄片| 加勒比综合九九99视频在线播放| 性欧美| 亚洲激情 欧美色图| 国产懂色精品国产av| 囯产精品久久久久久久久久梁医生 | 国产蜜臀精品一区免费尤物| 欧美网站免费| 亚洲 自拍偷拍 欧美| 男人午夜天堂| 91性网| 亚洲自拍青操视频| av天天在线| 啊嗯好大视频在线观看| 久久久五月天| 天天做日日爱夜夜爽| 日韩免费在线视频观看| 日韩特级毛片免费观看全集| 亚洲欧美清纯| 亚洲色图欧美色18直播在线| 欧美极品色| 中文字幕一区二区三四五区日日骚| 久草久热| 91在线美女| 人妻熟女字幕一区二区| 色综合五月天| 麻豆人妻精品一区二区| 色播丁香| 九九热免费视频| 激情小说五月天| 91九色在线| 大香蕉九九| 国产一级片| 亚洲宅男天堂| 2020中文字幕| 情侣开房子拍 日韩无码 女的很漂亮| 久久99久久99精品免视看婷婷| 欧美精品1区2区3区| 亚洲码专区| 91人妻Pr| 亚洲午夜免费狠狠干| 中文啪啪视频| 欧美一区二区日韩传媒搭讪精品| 亚洲综合码| 午夜精品久久久久| www.男人天堂| 在线啊啊啊| 中文字幕精品码亚洲| 久久久无码视频| 国产一区二区三区高清视频| 欧美成熟性爱精品| 亚洲AV无码翔田千里网站| 日本日逼高清| 伊人色综合网电影| 亚洲欧洲偷拍一区| 麻豆福利视频导航| 亚州高清av| 九九九成人| 人人操人人色网| 亚洲图片日本AⅤ欧美在线| 欧美强奸乱能| 东京热亚洲一区二区| 国产h小视频在线观看免费| 深夜福利黄片| 黄色电影观看久久9| 久久人人爽人人爽人人片Ⅴ| 玖玖婷婷五月天| 熟女视频久久| 国产人伦精品一区二区三区| 亚洲日韩东京热一区| 精品少妇一区二区| 人妻一区二区三区四区视频| 中文字幕中文字幕一区二区| 东京热免费视频| 台湾佬中文娱乐自偷自拍| 亚洲综合校园春色| 欧美综合91| 久草网站免费在线观看| 亚洲不卡AV在线| 大吊色| 天天干夜夜鈤| 人人看人人爰人人操| 色五月婷婷中文字幕| 国产午夜福利视频在线| 天天躁日日躁AAAAXXXX国产 | 人人妻人人爽一区二区三区| 欧美亚洲国产91在线| av无码精品久久久久| 伊人网免费视频| 日本二三四区| 自拍偷拍 日韩无码| 中文字幕十五区| 亚洲天堂欧美| 国产夜夜操| 久久成人午夜精品影院 | 国产嫩草精品A88AV| 欧美成熟性爱精品| 大香蕉手机视频| 精品美女少妇一区二区三区| 成人国产二区三区在线,男女精品。| 91看黄片| 激激五月| 日本亚洲嫩草影院啪啪| 国产日韩欧美亚洲精品95| 欧美美女自慰一区二区三区| 一二三四区操操Av| 国产51色综合久久免费| 久久久久9久久久久| 精品999一区二区| 国产福利av精彩对白| 久久综合女优| 三级精品三级在线观看| 综合网,亚洲,欧美| 啊v在线观看视频| 久操精品网| 免费97视频| 一级黄色性爱A级片| 91久久久视| 69XX一中文字幕人妻91| 亚洲另类久操网| 日韩黄色成人性爱| 激情小说亚洲图片| 熟女五十路一区二区三| 午夜欧美神马久久久久| 伊人网免费视频| 欧美另类色| 无码精品久久久久久亚洲| 九九内射在线| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 玖玖综合视频| 综合色99| 日本大香蕉综合网红本杳社区| 操逼逼无码| 成人开心网在线视频| 久久婷婷综合国际产色怕| 天天日美女的B| 岛国视频免费在线观看| 日韩三级性| 久久久久成人亚洲国产| 国产中午字一暮区| 国产精品自在线发布| 大香蕉伊人网WWWn0n| 老司机福利社视频在线观看| 亚洲天堂7777| 九九五月天| 裸体美女免费看网站青草| 国产精品乱码久久久久| 高清不卡一二三区视频......| 婷婷五月天激情四射| 99久久com免费视频′| 成年人网站在线免费观看| 2019天天操天天爽天天拍| 一本精品日本在线视频精品| 日韩欧美天天爽爽爽天天爽爽| 色久桃花影院在线观看| 97在线观看视频| 水澄无码AV| 亚洲无码超碰免费| 男人的天堂日韩| 婷婷亚洲综合| 欧美综合传媒| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 99激情视频| 日本不卡一区二区| 躁躁日曰躁2020| 久久免费精品视频免一| 日韩超碰97| 大香蕉欧美日韩| 国产九九九九九九九九| 欧美日韩亚洲天堂| 91熟女综合| 色色色色电影网| 亚洲婷婷综合网| 97资源站久久| 中文字幕一区 二 区 三 四 五 区日 日 骚| 天天上日日上日韩精品| 国产九九九九九九| 国产精品视频电影| 极品色www影院| 国产精品精品系列在线观看| 色踪合AV| 超碰激情808| 欧美日韩操逼嗦吊| 国产兽交视频在线播放| 91精品国产长腿丝袜美女| 亚洲人在线成线成人| 欧美日韩国内不卡| 色婷婷六月丁香七月婷婷| 国产97在线播放| 亚洲大色堂| 久久久久免费少妇| 亚洲精品亚洲人成在线麻豆| 岛国爱情动作片在国产AV无码专区亚洲AV漫画| 久久99草| 红桃视频高潮| 丁香五月影院| 色久桃花影院在线观看| 强奸抽插av| 91人妻Pr| 天天综合青苹果| 999九九精品| 日本不卡三级网在线播放| 欧美日韩第一页| 噜噜噜在线视频| 国产精品成人AV片免费看网站| 亚洲不卡一| 国产精品久久久九九九| 亚洲18禁| www.色五月| 中文字幕日本久久| 少妇高潮对白在线观看| 翔田千里无码中出中文字幕| 久久久中文| 男人的天堂视频精品乱在线| 青青草无码视频| 神马久久69| 精品网站99999| 亚洲三级网址久久最新| 亚洲熟妇乱女区二区三区| 九九九精品一区二区无码| PMv在线观看| 91美女片在线| 91模特在线观看| 日韩中文9| 亚洲色图伊人网| 精品9区| 国产精品suv一区| 美女淫穴| 中文字幕免费观看| 国产福利一区二| 91精品国| 国产精品久久久午夜夜伦鲁鲁| 91男人天堂网| 综合一区二区影视| 91熟女视频网| 色亚洲欧美| 东京太热男人的天堂久久久| 97国产|免费| 亚洲日韩美女丝袜美腿人妻视频| 一区二区视频在看| w w w.久久精品| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 日韩中文字幕二区| 欧美色五月| 理论久久婷婷网 8| 丰满少妇一区二区三区四区观看| 久久欧美1卡2卡3| 超碰97玖玖爱| 98超碰日本| 老熟女阿 国产91| 1240青青草一区二区三区视频天爱| 日韩熟女精一区二区三区不卡| 啊啊啊啊啊啊啊啊在线观看| 99热| 2019久久久久久久久福利| 黄色欧美性爱视频| 婷色五月| 国产一区麻豆免费观看| 中文字幕人乱码中文字的预防方法| 亚洲精品美女久久久久久久久| 国语对白露脸XXXXXX| 少妇一级无码精品| 久久熟女人| 亚洲情色五月天 | 在线观看国产黄色| 爽爽淫人网| 亚洲官网在线| 职场同事知名国产国产精品久久欧美日韩 | 亚洲午夜蜜臀| 久久超碰97| 亚洲天堂中文字| 五月激情啪啪| 日本一天色道久久久精品视频| 午夜精品久久久99热蜜桃的功能特点| 欧美少妇高潮| 午夜男女爽爽爽影院视频| 深夜国产一区二区三区在线看| 亚洲1区| 99re69| 麻豆熟妇乱妇熟色A片在线看| 中国AAAAAA黄色片| 国产一级αv免费看片| 久久久久无码| 九九热午夜欧亚国产视频| 蜜臀99久久精品久久久懂爱| 国产AV久久野战精品| 淮穴色AV| 久久是精品| 波多野结衣之双飞调教在线播放 | 日韩无码AB| 国产精品久久久 | 精品一区二区综合熟妇| 综合色图区| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 日韩欧美tv一区二区在线观看| 加勒比大香蕉视频在线| 老熟妇一区二区三区啪啪| 九九九精品美女| 青青操综合网| 2025亚洲男人天堂| 91亚洲欧美激情| 人、人、摸,人、人、草| 和协无码影院| 好吊色综合| 精品亚洲国产成人AV制服丝袜| 天天综合香 ld视频| 深夜国产福利| 久久精品色欧美aⅴ一区二区| 美女啪欧美一区| 成人线上超碰| 乱精品一区字幕二区| 九九超碰综合网| 性在久久久久久| 亚洲欧洲久久天堂| 手机午夜电影神马久久| 欧美极品女人的天堂| 欧美性色欧美| 久久久夜夜嗨免费视频| 另类成人首页一区| 亚洲无吗在线视频| 99只有精品| 黑人白女精品一区| 青青草精玖玖69精品| 亚洲精品国产精品成人| 久久久久骚| 精品亚洲| 亚洲天堂色图| 欧美极品| 超碰久久性爱| 国产高清成人免费视频| 爱爱动态120秒| 欧美亚洲中文| 成人熟女视频一区二区三区| 韩国一级做a久久久久| 夜夜操天| 色牛aV| 欧美亚洲第1页| 中文字幕日韩精品久久| 91偷拍欧美亚洲| 久热在线精品免费观看| 黄色不卡视频| 国产高清26uuu| 男人天堂 天天射| 一级啊性爱在线视频| 欧美淫乱视频| 99精品在线| 欧美激情总合网| 久久久久久午夜男人的天堂| 亚州欧美在线| 曰韩精品九九无码| 91丨人妻丨国产丨丝袜| 欧美另类色| 翔田千里无码中出中文字幕| 日韩欧美水蜜桃人妻| 另类 日韩 熟女| 欧美色图另类图片| 超碰亚洲97| 国产第12页| 四虎精品一区| 天天操夜夜操| 日韩强奸av| 91强在线播放| 色综合久久久久| 中文字幕欧美日韩三级| 91殴美大片| 91操人| 色综合大香蕉| 久久超碰亚洲人| 人人插人人摸人人| 91 综合网| 情色五月天久久久| 丰满人妻大屁一区二区| 91另类| 亚洲999综合| 国产丝袜视频| 女人被男人桶爽视频网站| 久热精品在线| 天天天肏屄欧美| 俺去俺来也在线www| 欧美 亚洲| 国产精品第二页| 久久精品一区二区三区不卡| 国产又黄又粗的视频| 欧洲一区二区三区四区在线观看| 久久久久久国产精品| 色翁荡息又大又硬又粗又爽| 亚洲图片视频小说| 日本精品国产视频| 丁香五月电影| 欧美性生活免费网| 人人妻人人玩人人澡人人爽| 欧洲自拍色图gif在线| 国产欧美精品日韩区二区麻豆天美| 午夜福利无毒不卡| 久九色| 91综合天天看| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 色官网在线| 日本欧美韩国国产在线| 97天天| 中文字幕第95页| 9精品在线| 欧美制服另类丝袜| 欧美精品999| 91社操逼| 人妻二区| 上特色A在线| 日韩精品亚洲一二三| 国产乱人妻精品入口| 精精夜夜| 污啪啪啪视频| 综合一区中亚洲国产成人综合精品| 国产精品久久久久久久久久梁医生| 传媒在线观看一区二区三区| 99黄页网站| 97超碰天天爱天天爱| 欧美色偷拍 | Av色五月| 99re9在线| 久99| 丁香色色网| 最近的最新的中文字幕视频| 老熟妇一区二区三区…| 91性高朝久久久久久久久| 亚洲熟女综合网| 一区二区三区麻豆| 欧美色爱综合| 尤物视频新赏网鲜网色诱网| 色综合99999| 亚洲男人的天堂网| 欧洲精品人妻| 日日做夜狠狠爱欧美黑人| 亚洲欧洲精品成人| 欧美永久激情一区二区| 有码免费观看| 欧美精品在线观看| 成人影 天天操 亚洲| www鬼畜国产男人的天堂| 亚洲色图在线视频| 亚洲精品久| 亚洲aw毛茸茸在线| AND人妻系列| 狠狠热这里都是精品| 国产熟女一区二区丰满| 亚州色站 日韩电影| 啊啊啊在线观看免费视频| 97超碰逼| 色婷婷淫色网| A一级色女| 校园春色美腿丝袜 | 91丝袜在线视频| 国产精品在线一区二区| 天天搞欧美| 蜜臀网 一区|