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

ARTICLE DETAIL

資訊詳情

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

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

CANN ops-math 算子接口實戰(zhàn):aclnnLtTensor 與 aclnnInplaceLtTensor 全解析 算子庫人工智能CANN【免費下載鏈接】ops-math本項目是CANN提供的數(shù)學(xué)類基礎(chǔ)計算算子庫實現(xiàn)網(wǎng)絡(luò)在NPU上加速計算。項目地址https://gitcode.com/cann/ops-math點擊查看免費下載導(dǎo)讀本文以 CANN ops-math 倉庫中 Less小于比較算子的兩個單算子 API 接口為核心系統(tǒng)講解aclnnLtTensor與aclnnInplaceLtTensor的產(chǎn)品支持情況、功能語義、兩段式調(diào)用范式、完整參數(shù)約束與錯誤碼并結(jié)合倉庫源碼剖析其底層計算流程Contiguous → Cast → Less → ViewCopy、平臺差異與 kernel 實現(xiàn)原理。讀完本文你將掌握在 NPU 上通過 aclnn 接口完成逐元素小于比較并輸出 Bool 張量的完整編碼能力并理解普通輸出與原地inplace輸出的工程取舍。產(chǎn)品支持情況根據(jù) math/less/docs/aclnnLtTensoraclnnInplaceLtTensor.md 與 math/less/README.md 的記載Less 算子及配套的兩個 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ù)類型見原文檔約束說明中 npu910,310b 標(biāo)記段。功能說明aclnnLtTensor與aclnnInplaceLtTensor實現(xiàn)相同的功能判斷輸入self中的每個元素是否小于輸入other中的元素返回一個 Bool 類型的 Tensor。計算公式為$$ out_i (self_i other_i) ? [True] : [False] $$即當(dāng)self_i嚴(yán)格小于other_i時輸出True否則輸出False。這一語義與 PyTorch 的torch.lt一致常用于掩碼生成、條件篩選、比較統(tǒng)計等場景。兩個接口的功能區(qū)別在于結(jié)果的存放位置aclnnLtTensor需新建一個輸出張量對象out存儲計算結(jié)果輸入self保持不變aclnnInplaceLtTensor無需新建輸出張量對象直接在輸入張量selfRef的內(nèi)存中原地寫入計算結(jié)果節(jié)省一份輸出內(nèi)存。在倉庫中該算子的完整實現(xiàn)分布于 math/less 目錄op_api提供 aclnn 接口層、op_host提供算子定義與 tiling、op_kernel提供 AscendC kernel 實現(xiàn)、op_kernel_aicpu提供 AICPU 兜底實現(xiàn)、framework提供 TF 插件適配。兩段式接口與函數(shù)原型aclnnLtTensor和aclnnInplaceLtTensor均為兩段式接口詳細(xì)范式見 兩段式接口必須先調(diào)用xxxGetWorkspaceSize第一段接口獲取計算所需的workspace 大小與包含算子計算流程的op 執(zhí)行器executor再依據(jù) workspaceSize 在 Device 側(cè)申請內(nèi)存后調(diào)用第二段接口執(zhí)行計算。說明workspace 是指除輸入/輸出外算子在 NPU 上完成計算所需的臨時內(nèi)存。第二段接口如aclnnLtTensor不能重復(fù)調(diào)用否則會出現(xiàn)異常。四個接口的原型如下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實現(xiàn)位于 math/less/op_api/aclnn_lt_tensor.cpp調(diào)用時需要包含頭文件aclnnop/aclnn_lt_tensor.h。aclnnLtTensorGetWorkspaceSize 參數(shù)說明參數(shù)名輸入/輸出描述使用說明數(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è)申請的 workspace 大小-----executoraclOpExecutor**輸出返回 op 執(zhí)行器包含了算子計算流程-----約束Atlas 200I/500 A2 推理產(chǎn)品、Atlas 訓(xùn)練系列產(chǎn)品不支持 BFLOAT16 數(shù)據(jù)類型。返回值與錯誤碼aclnnLtTensorGetWorkspaceSize返回aclnnStatus狀態(tài)碼完整定義見 aclnn返回碼。第一段接口完成入?yún)⑿r灣霈F(xiàn)以下場景時報錯返回值錯誤碼描述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ù)類型無法進行推導(dǎo)ACLNN_ERR_PARAM_INVALID161002self 和 other 的 shape 無法進行 broadcastACLNN_ERR_PARAM_INVALID161002out 的 shape 與 broadcast 后的 shape 不一致在 math/less/op_api/aclnn_lt_tensor.cpp 的CheckParams中可以看到校驗順序與上述錯誤碼一一對應(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ù)說明參數(shù)名輸入/輸出描述workspace輸入在 Device 側(cè)申請的 workspace 內(nèi)存地址workspaceSize輸入在 Device 側(cè)申請的 workspace 大小由第一段接口 aclnnLtTensorGetWorkspaceSize 獲取executor輸入op 執(zhí)行器包含了算子計算流程stream輸入指定執(zhí)行任務(wù)的 StreamaclnnInplaceLtTensorGetWorkspaceSize 參數(shù)說明參數(shù)名輸入/輸出描述使用說明數(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è)申請的 workspace 大小-----executoraclOpExecutor**輸出返回 op 執(zhí)行器包含了算子計算流程-----約束Atlas 200I/500 A2 推理產(chǎn)品、Atlas 訓(xùn)練系列產(chǎn)品不支持 BFLOAT16 數(shù)據(jù)類型。返回值與錯誤碼返回值錯誤碼描述ACLNN_ERR_PARAM_NULLPTR161001傳入的 selfRef、other 是空指針ACLNN_ERR_PARAM_INVALID161002selfRef 和 other 的數(shù)據(jù)類型不在支持的范圍之內(nèi)ACLNN_ERR_PARAM_INVALID161002selfRef 和 other 的數(shù)據(jù)類型無法進行推導(dǎo)ACLNN_ERR_PARAM_INVALID161002selfRef 和 other 的 shape 無法做 broadcastACLNN_ERR_PARAM_INVALID161002selfRef 和 other 做 broadcast 后的 shape 不等于 selfRef 的 shapeACLNN_ERR_PARAM_INVALID161002selfRef、other 的維度大于 8注意原地版本的差異點由于結(jié)果寫回selfRef因此要求廣播后的 shape 必須與 selfRef 的 shape 相等否則無法原地寫回這是與普通版本最核心的語義區(qū)別。aclnnInplaceLtTensor 參數(shù)說明參數(shù)名輸入/輸出描述workspace輸入在 Device 側(cè)申請的 workspace 內(nèi)存地址workspaceSize輸入在 Device 側(cè)申請的 workspace 大小由第一段接口 aclnnInplaceLtTensorGetWorkspaceSize 獲取executor輸入op 執(zhí)行器包含了算子計算流程stream輸入指定執(zhí)行任務(wù)的 Stream約束說明確定性計算aclnnLtTensor與aclnnInplaceLtTensor默認(rèn)確定性實現(xiàn)。即同一輸入在相同硬件與軟件環(huán)境下多次執(zhí)行結(jié)果完全一致不會引入并行歸約順序?qū)е碌姆谴_定誤差可放心用于需要復(fù)現(xiàn)結(jié)果的訓(xùn)練與調(diào)試場景更詳細(xì)的背景可參考 確定性計算說明。調(diào)用示例示例代碼僅供參考完整編譯與執(zhí)行流程請參考 編譯與運行樣例。兩個完整可運行的示例同樣保存在倉庫中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申請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); // 計算連續(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ù)第一段接口計算出的workspaceSize申請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 個元素為True對應(yīng)數(shù)值 1.0后 3 個元素為False對應(yīng)數(shù)值 0.0。結(jié)果通過aclrtMemcpy(..., ACL_MEMCPY_DEVICE_TO_HOST)拷回 Host 側(cè)打印驗證。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申請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); // 計算連續(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; }原地示例展示了兩個工程要點輸入可以是混合數(shù)據(jù)類型self為ACL_DOUBLE、other為ACL_INT32兩者滿足互推導(dǎo)關(guān)系f64 與 s32 推導(dǎo)為 f64由接口內(nèi)部完成隱式轉(zhuǎn)換無需用戶手動 Cast結(jié)果從self的 Device 地址讀取執(zhí)行完aclnnInplaceLtTensor后比較結(jié)果直接寫回self所在內(nèi)存因此只需從selfDeviceAddr拷回結(jié)果即可全程無需分配輸出張量。源碼級原理剖析接口層的完整計算流水線在 math/less/op_api/aclnn_lt_tensor.cpp 的注釋中完整計算流程被描述為self other | | \ / Contiguous(workspace_0) Contiguous(workspace_2) \ / Cast(workspace_1) Cast(workspace_3) \ / Less(workspace_4) | Cast(workspace_5) | ViewCopy | result對應(yīng)aclnnLtTensorGetWorkspaceSize的實現(xiàn)邏輯aclnn_lt_tensor.cpp空 Tensor 快速路徑若self或other為空 Tensor直接返回workspaceSize 0不構(gòu)造計算圖隱式類型提升先通過op::PromoteType或 A2 平臺上的op::BinaryOpTypePromote推導(dǎo)統(tǒng)一計算類型特別地若推導(dǎo)結(jié)果為DT_BOOL會提升為DT_UINT8aclnn_lt_tensor.cpp因為 BOOL 參與向量比較計算不直接、且 kernel 側(cè)統(tǒng)一按 uint8 語義處理布爾結(jié)果Contiguous Cast分別對self、other做l0op::Contiguous支持非連續(xù)張量輸入與l0op::Cast轉(zhuǎn)換為統(tǒng)一推導(dǎo)類型Less 核心計算調(diào)用l0op::Less完成逐元素比較產(chǎn)出 BOOL 結(jié)果Cast ViewCopy將 BOOL 結(jié)果 Cast 成out的目標(biāo)數(shù)據(jù)類型如示例中的 DOUBLE再通過l0op::ViewCopy拷貝到輸出張量從而兼容out為非連續(xù)張量的情況最后通過executor-GetWorkspaceSize()匯總整條流水線各階段workspace_0 至 workspace_5所需的臨時內(nèi)存總大小。Inplace 接口的實現(xiàn)本質(zhì)從 aclnn_lt_tensor.cpp 可以看出aclnnInplaceLtTensorGetWorkspaceSize的實現(xià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同時作為輸出out傳給普通版本計算完成后結(jié)果通過 ViewCopy 寫回selfRef的內(nèi)存。這也解釋了為何原地版本要求broadcast 后的 shape 必須與 selfRef 的 shape 一致——輸出寫回的目標(biāo)地址容量是固定的。平臺相關(guān)的數(shù)據(jù)類型支持在 aclnn_lt_tensor.cpp 中輸入與輸出的數(shù)據(jù)類型支持列表按平臺區(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約束的代碼級來源由GetCurrentPlatformInfo().GetSocVersion()動態(tài)判定。算子定義、InferShape 與 Tiling在算子定義層面math/less/op_host/less_def.cpp算子名為Less輸入為x1、x2輸出為y輸入數(shù)據(jù)類型支持 BF16、FLOAT16、FLOAT、INT8、UINT8、INT32、INT64、UINT64、BOOL、DOUBLE輸出固定為 BOOLAICore 配置開啟DynamicCompileStaticFlag、DynamicRankSupportFlag、DynamicShapeSupportFlag即支持動態(tài) shape 與動態(tài) rank 編譯并指定 kernel 文件為less_apt在 math/less/op_host/less_infershape.cpp 中InferShape 直接復(fù)用廣播基類Ops::Base::InferShape4Broadcast與接口層shape 需滿足 broadcast 關(guān)系的校驗保持一致在 math/less/op_host/arch35/less_tiling_arch35.cpp 中tiling 按輸入數(shù)據(jù)類型int64、uint64、int32、float、half、uint8、int8/bool、double實例化對應(yīng)的BroadcastBaseTilingLessComputeT::OpDag模板同一時刻要求x1與x2的數(shù)據(jù)類型一致該文件在接口層完成類型提升后天然滿足。Kernel 層的 DAG 計算圖在 math/less/op_kernel/arch35/less_dag.h 中kernel 通過 DAG有向無環(huán)圖描述計算輸入經(jīng)Vec::CopyInBrcT廣播拷貝進 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 時按int8_t模板實例化其余類型按DTYPE_X1模板實例化。此外math/less/op_kernel_aicpu/less_aicpu.cpp 提供 AICPU 側(cè)的兜底實現(xiàn)。二進制配置與測試驗證算子的各數(shù)據(jù)類型二進制配置位于 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。倉庫同時提供了多層次的測試用例用于驗證接口行為OP API 單元測試math/less/tests/ut/op_api/test_lt_tensor.cpp 覆蓋 FLOAT、FLOAT16、INT32、INT64 等多種 dtype 與 ND/NHWC/NCHW 等 format 組合并包含廣播場景如{4,5}與{2,3,4,5}的廣播比較通過OP_API_UT(aclnnLtTensor, ...)框架自動校驗GetWorkspaceSize與計算結(jié)果InferShape 單元測試math/less/tests/ut/op_host/test_less_infershape.cppAICPU 兜底測試math/less/tests/ut/op_kernel_aicpu/test_less.cppST 測試math/less/tests/st/aclnnLtTensor/atk_aclnnLtTensor.json 與 math/less/tests/st/arch35/ttk_kernel_less_st.csv。工程選型建議需要保留原輸入時使用aclnnLtTensor自行創(chuàng)建out張量接收結(jié)果希望節(jié)省內(nèi)存、原輸入不再需要時使用aclnnInplaceLtTensor直接將selfRef原地改寫省去一份輸出張量的申請與拷貝注意廣播約束普通版本允許out的 shape 等于廣播后 shape原地版本要求廣播后 shape 與selfRefshape 完全一致平臺差異在 Atlas 訓(xùn)練系列產(chǎn)品、Atlas 200I/500 A2 推理產(chǎn)品上避免使用 BFLOAT16 輸入否則第一段接口會返回ACLNN_ERR_PARAM_INVALID。如需了解算子本身的完整語義、參數(shù)總覽與其他調(diào)用方式如 aclnnLtScalar、圖模式調(diào)用可進一步閱讀 math/less/README.md 與同目錄下的 aclnnLtScalaraclnnInplaceLtScalar 文檔。贊分享算子庫人工智能CANN【免費下載鏈接】ops-math本項目是CANN提供的數(shù)學(xué)類基礎(chǔ)計算算子庫實現(xiàn)網(wǎng)絡(luò)在NPU上加速計算。項目地址https://gitcode.com/cann/ops-math點擊查看免費下載相關(guān)推薦CANN ops-math Less 算子 aclnnLtTensor 與 aclnnInplaceLtTensor 接口調(diào)用指南CANN ops math Less 算子 aclnnLtTensor 與 aclnnInplaceLtTensor 接口調(diào)用指南 本篇技術(shù)指南以 CANN o算子庫人工智能CANNCANN ops-math 算子實戰(zhàn)aclnnDiv 與 aclnnInplaceDiv 除法算子接口全解析CANN ops math 算子實戰(zhàn)aclnnDiv 與 aclnnInplaceDiv 除法算子接口全解析 本篇技術(shù)指南圍繞 CANN ops math 數(shù)算子庫人工智能CANNCANN ops-math 除法取模算子 aclnnDivMod / aclnnInplaceDivMod 接口全解析與實戰(zhàn)CANN ops math 除法取模算子 aclnnDivMod / aclnnInplaceDivMod 接口全解析與實戰(zhàn) 本文是 CANN ops math算子庫人工智能CANN創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美日韩操操操| 自拍视频大全亚洲专媒视频/一区二区三区 | 99自拍视频在线观看| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 综合熟妇一区二区三区| 百度百度日本操逼| 91丨九色丨熟女高潮| 女生自91网站| 一区二区亚州激情久婷婷欧美| 妇女一区二区三区| 97久久精品亚洲| 久久久久久久| 五月婷婷影院| 亚洲黄网在哪免费看| 96一区二区三区| 91操人| 麻豆 美女 丝袜 人妻 中文| 日韩在线76| 日韩成人私密一级精品av| 亚洲91网站| www.91人妻.com| 久久久久久夜夜夜夜夜| 97在线观看播放视频| 婷婷激情一区二区三区俺也去| 五月天激情国产综合婷婷婷| 精品国产91内射久久| 密臀在线免费观看| 日韩强奸av| 麻豆AV一区二区| 老外又粗又长一晚做五次| 好舒服视频| 久久高清欧美国产| 五月天婷婷在线看| 1240青青草一区二区三区视频天爱| 91爱综合| 丁香六月啪啪| 天天干天天干天天干| 大茄子熟女AV导航| 97干在线| 97爱啪| 日韩AV一区二区三区四四| 3PAV乱伦视频| 强奸乱伦免费网站| 视频在线观看一二三区| av爱爱爱| 青青久草| 久久久91福利姬| 欧美色五月| 国产绿奴视频在线观看| 亚洲美女AV无码| 天天在线91| 欧美一级欧美三级在线观看| 亚洲中文字母在线播放| 亚洲精品性爱片| 熟妇亚洲一区二区三区| 一区二区三区四区久久视1| 草草草视频在线免费看| 久久久久久国产无码精品| 久久久久久99999国产精品| 欧美成人综合| 久久AV无码1区2区3区| 国模精品娜娜一二三区| 亚洲天堂7777| 精品久久久九九九孕妇| 国产一区在线播放| 激情小说激情视频| 欧美性性性| www色日本| 欧 美 自 拍 偷 拍| 青娱乐蜜桃臀AV色婷| 成人AV素股で擦久久| 精品国产乱码久久久久久久久1| 激情抓乳插进去啪啪啪日韩 | 99re视频这里只有精品| 日韩欧美蜜桃精品久久中文字幕久久| 91色人| 2020中文字幕在线| 欧美性爱www免费版| 91日韩在线| 国产日韩在线播放av| 欧美性暴力猛交| 777超碰| 精品国产av一区二区三区四区入口| 亚州色交| 欧美丰满少妇xx高潮| 香蕉热人人精品| 亚洲欧洲精品视频发布| 欧美亚洲手机在线| 色欧洲| 亚洲综合婷婷| 日韩AV电影网站| 大香蕉手机在线视频| 人妻夜夜爽天天爽麻豆三区网站 | 久久久人妻| 精品视频在线观看| 亚洲黄色网址视频| 国产人妻精品久久久一区二区三区| 久草婷婷| 91天美免费| 日本加靬比网站发布页| 久操| 思思热在线视频免费| 久久久久久久久久精| 天天色悠悠激情| 国产亚洲性生活视频播放| 变态另类专区| 韩国女主播青草福利视频| 97色涩| 大香蕉性欧美| 狠狠久久手机视频精品| 精品欧美А∨无码黑人大荫蒂| 无码自拍SM| 久久精彩视频9| 啊啊啊在线看| 国产60区。| 激情小说亚洲视频| 一本色道久久天天射天天干| 人妻加勒比东京热| 国产吹潮女在线观看| 99亚洲国产精品色一区二区三区| 91色综| 午夜无码熟妇丰满人妻| 日韩人妻有码免费视频| 久久亚州大香蕉| 91搞逼视频| 情色五月天久久久| 伊人热综合| 狼人久草| 日韩啪啪视频| 成人AV超碰免费在线| 97爱亚洲综合色| 亚洲91在线| 高清无码国产亚洲| 日韩精品一二三| 色婷婷九月| 91精品国产麻豆国产自产在| 激情开心五月天| 欧美日韩香蕉| 禁十八久久| japan日本高清乱xxxx| 国产精品久久久啊| 亚洲va有码在线天堂| 秋霞视频一区二区| 麻豆区久久久久亚| www.91逼逼.com| 亚洲资源网| 国产女人高潮视频| 自拍偷拍亚洲熟女妇人精品| 国产精品扒开腿做爽爽爽视频| 欧美性暴力猛交XXXX| 亚洲一区二区中文字幕| 国产午夜精品理论片一二三区区| 国产精品对白自产拍| 91网亚洲| 久久综合激情| 人妻人人做人人澡人人爽欧美一区| 久久久久女教师免费一区 | 国产三级中文有码在线视频| 亚洲自拍97| 99这里只有精品国产| 狠狠色伊人亚洲综合网站色| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 久久夜夜| 亚洲欧洲网站免费观看| 欧美变态激情网| 超碰色综合| 屁股久久久久久久| 超硑97精品| 秋霞视频一区二区 | AV天堂电影网| 女人爽到高潮潮喷18禁网站 | 99热精品在线| 亚洲国产麻豆一区二区三区| 五月天我淫我色av| 岛国激情视频软件| 欧美亚洲国内自拍| 中国少妇XXXX做受| 啊a一区在线| 丁香色五月 97干| 亚洲综合另类小说色区亚洲成av人片在www| 欧美性爱一区二区三区| 亚欧操逼片在线观看 | 色香欲影| 手机看av网站在线看| 欧美色图私拍91| 91超碰人人操| 亚洲精品aa久久伊人| 黄色片A级一区二区三区| 超碰地址久久| 天天干天天日天天射黄色| 97在线精品观看视频| 在线 欧美 亚洲| 国产亚洲色婷婷99精品91| 国产av青草| 青草青青久久久久久国产| 久热九九| 免费精品99| 国产精点久久久成人| 久久久久久日韩| 超碰在线人妻中文字幕| 1769成人国产精品视频| 精品一级毛片在线观看| 亚洲在饯| 色欲Av人妻精品一区二| 国产乱伦性爱区| 岛国1区2区3区在线观看| 久久久久久97| 久久超碰com| julia ann久久| 久久一区二区三区入口| www.av在线观看| 一区二区三区成人高清视频| 亚洲密乳AV| 久久成人国产精品| 五月丁香黄色网| 婷婷午夜清品久久久久久久性色视频观| 国产AV线| 亚欧操逼片在线观看 | 国产精品香蕉| 色色九区| 久久久久久久久999| 精精品人妻一区二区三区| 亚洲精品电影| 欧美色图 色综合图| 97资源久久| 99热婷婷一区二区三| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 中日韩免费看男女操逼大全| A级毛片在线看免费| 人人操,人人插| 啪啪啪精品| 日本高清视频xxxx| 国产精品自拍欧美在线| 午夜天堂精品久久久久91| 日本特黄f c2| 97视频7| 天天超级碰碰碰| 碰人碰碰人人开房人肉| 99AV| 91福利网在线观看| 强奸乱伦亚洲第一页| 国产激情av女片自拍| 亚洲午夜av| 少妇一线天久久久久久| 中出789在线视频| 97天天插| 家庭乱伦麻豆| 太久视频| 国产伊人自拍| 欧美第二页午夜| 东京热综合久久一区二区| 国产真实子伦对白| 凸凹视频在线观看| 偷拍欧美激情| 久久久91福利姬| 无码78| 中文字幕高清精品一区| 婷婷九月色| 亚洲免费精品一区| 久久久熟妇熟女国产| 亚洲少妇自拍中文字幕懂色| 2018天天日天天日| 九九热精品| 操香逼| 色偷偷综合91久久噜噜| 国产一区二区在线播放量| 日韩欧美经典在线观看| www.色五月| 熟女网站最新| 欧美色图欧美| 一区不卡在线观看av| 国产人妻天天干精品| 曰韩精品九九无码 | 欧美天堂超碰97| 十八禁黄色| 亚洲春色一区二区三区| 亚洲天堂99| 天天综合影院91| 亚洲天堂久久| 波多野结衣被操50分钟免费视频| 67914亚洲精品| 岛国999| 国产捆绑一区| www久久99| 九九国产热| 99re这里只有精品2| a片自拍直播视频| 国产97色在线| 大鸡吧尹人在线| 99热 按摩 日韩| 亚洲天天更新| 91粉嫩萝控精品福利网站_精品影音先锋国 | 蜜桃不卡一区二区| 男女国产精品| 国语av最新自产拍在线观看| 东北女人的毛片| 欧美91变态| 欧美精品自慰系列寂寞少妇| 久久久久久久久久久久久久久久9 亚洲成人妻日韩在线 | 五月天社区| 色踪合AV| 日本一区视频在线观看| 91麻豆天美国产欧美| 欧美色道啊| 一二三四视频中文字幕在线看| 91 在线亚洲| 999热日韩精品| 色色色色日本| 97精品视频网站| 日产操逼| 天天噜| 一区二区三区日韩欧美 | 色婷婷淫色网| 五月丁香婷婷啪啪| 午夜精品久久久久久久男人的天堂| 老司机午夜福利视频一区二区| 91久久久亚洲| 91色艳| 熟妇无码视频三区| 日本五十路熟女一区二区| 97一本大道亚洲一区| 欧美色www亚洲国产阿娇要播| 日本天天操| 欧美色图99| 热99这里只有精品| 人人摸人人舔一区二区| 美女尤物人人操| 香港成人一级视频在线青青草| 九九九九热| 欧美1727免费观看视频| 黄色视频高清无码网站| 超碰成人免费| 国产精品久久久久999| 少妇一区二区三区| 久久久久大香青草精品综合| 太久视频| 99re69| 久久久新亚洲AV| 中文字幕av亚洲在线| 乱伦av国产| 国产精品成人无码av| 久久久久78| 无码外流操逼视频| 久久久久久夜夜夜夜夜| 91丝袜熟女| 91观看 国产白丝| 婷婷在线视频| 色香综合天天影视综合 | 无码99| 国产亚洲日本| 91neishe| 黑人无码一区二区| 乱老熟女一区二区三区| 免费av高清无码| 啊啊啊无码| 人人澡人人澡人人| 国产精品另类一区大香蕉| 日韩 女同 综合| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 欧插网站| 国产精品丝袜久久亚洲不卡| 婷婷久草| 91精品国产一区三一| 农村妇女精品一二区| 日韩精品啪啪啪| 人妻美腿丝袜日韩| 久久免费9| 99婷婷一区二区| 亚洲男人久久综合天堂| 久草福利在线资源站| 水澄无码AV| 中文字幕乱碼在线| 东北老熟女| 无码久久亚洲高清,| 东北少妇高潮zzzz| 欧美成人AⅤ大片在线观看| 秋霞Av理论一级在线| 无码国产Av| 日本一级黄色电影| 久久国99999| 婷婷10月天青娱乐| 欧美日韩不卡a片| 久久婷婷五月综合| 国产一区二区久久| 乱伦一二三| 国产av波波国产精品| 黄色免费网页无码| 亚洲五月丁香花狠狠干一区二区三区 | 26uuu成人影片| 福利视频一区二区微拍| 大香蕉520| 另类av综合久久| 啊啊啊啊免费视频| 福利在线观看一区二区| 8050午夜少妇无码| 成人在线视频一区| 蜜臀无码视频在线观看| 99热这里只有精品地址| 91真人天天在线| 欧美91变态| 亚洲一区日韩| 婷婷中文字幕| 久久嫩草国产成人一区| 亚洲综合伊人无码久久| 中文字幕一区二区三区字幕| 97久久久久久久精| 在线一区| 欧美亚洲国产91在线| 婷婷99狠狠| 后入式视频国产自| 亚洲色图日韩精品| 熟妇人妻一区二区| 国产精品69久久久久孕妇欧美| AV乱伦专区| 亚洲一二三精品久久网| 日本人妻丰满熟妇久久久久久| 少妇人妻好深太紧了vr91| 久久九九综合| 中文字幕99999| 小草精彩毛片| 久久神马| 老熟女91av| 国产精品诱惑| 国产suv精品一区二区四| 久久中文字幕在线观看| 综合影院亚洲| a片在线播放| 国产伦精品免编号公布| 日日噜噜夜夜狠狠视频无| 五月丁香综合啪啪| 首页亚洲国产高跟丝袜诱惑视频| 中文字幕1区2区| 婷婷五月天色色| 99少妇| 老司机老司机午夜影院| 91蜜桃传媒精品久久久一区二区| 亚洲AV成人无码一区二区三区在线观看 | 成人在线视频一区| 久久久久久亚洲中文| 青青伊人加勒比海| 久久曰曰| 无码人妻一区二区三区色欲aⅴ | 91久精品| 欧美午夜视频精品久久| 久久超碰日韩精品| 亚洲国产ⅴ高清在线观看| 欧美久久九九| 欧美性爱精品七区| 天天天做天天天爱天天天爽| 亚洲夜色在线| 黄片无码在线制服| 性爱视频免费网址| 大香蕉色欲AV| 天天干一干| 男女性感激情网站| 精品九九九九| 超碰欧美97资源| 情色日播放AV| 超碰碰碰碰| 日本精品网站在线中文| 97亚洲中文| 欧美日韩亚洲五月天婷婷| 日本午夜精品理论片A级APP发布| 99爱久久视频频| 亚洲自拍天堂| 操屄日韩| 日韩亚洲国产视频| 亚洲欧美激情另类色图| 在线免费观看日韩一区| 天天干夜夜鈤| 色五月AV在线| 亚洲综合贴图91 | 97超碰美女| 乱伦一区二区三区‘| 亚洲欧美不卡线| 久九干| 五月婷婷深深爱| 人人操人人摸人| 久久久久少妇| 情色五月天就去干| 日本精品加勒比海一区| 亚洲精品久久久久久| 亚洲欧洲精品成人| 欧洲无码一区二区| 毛片视频白嫩| 嗯……啊…嗯嗯…啊…好舒服| 成人资源中文字幕在线观看天天| 啪啪啪东京| 久久性爱视频免费看| 国产精品乱码久久久| 人妻另类| 一区二区三区四区理论片| 1240青青草一区二区三区视频天爱| 后入人妻无码| 亚洲图片第一页| 张柏芝国产一区在线观看| 三级日本一区二区三区| 囯产精品久久久久久久久久梁医生 | 欧美999| 国产亚洲精品无码三区| 日韩图区 偷拍| 抽插无码高清一区| 9/A片| 91在线限制级| 国产内射爽爽大片| 国产精品久久久久久久久久久久久久久久 | 96精品久久| 欧美黄页| 久操网无码在线| 青青草一区二区高清无码视频| 国产精品另类| 欧美日韩*字幕一区| 超碰人人超在线观看| 91久久久久免| 精品久久大胆人体| 久久骚少妇| 日本最新1区2区3区| 人人妻人人色一区二区三区| 欧美97| 日欧亚洲二三区大片不卡| 亚洲天堂久久| 超碰爽人妻熟女Av| 国产中文字幕在线| 极品综合| 男人亚洲91首页在线| 9999亚洲精品| 999色欧美中文字幕| 精品国产三级av韩国在线| 亚洲欧洲精品视频发布| 人妻在线臀日韩| 久久精品无码熟妇一区二区三区视频导航| 精品一级毛片在线观看| 久久丁香五月婷婷| 丝袜喷水在线| 69一区二区| 欧美成人午夜免费福利785| 久久久啊啊| 人人妻人人爽人人精品| 国产av波波国产精品| 69超碰综合| 一二三四区操操Av| 蜜乳性色无码专日粉嫩骚逼AV| 中文字幕亚洲欧美在线不卡| 色激情综合网站| 992这里有精品| 青娱乐黄色录像| 333kkkk·亚洲com久久| 精品人妻一区二区三区-国产精品| 亚洲情色 自拍| 秋霞蝌科网日本一区| 国产精品丝袜久久亚洲不卡| 午夜操逼不卡| 中文字幕在线2| 中国国产精品一区视频| 日本孕妇一区二区视频操逼免费看 | 精品人妻中文字幕高清| 久久精品国产精品亚洲艾通辽熟妇 | 丁香色狠狠色综合久久小说| 99精品无码| 熟女少妇视频| 亚洲熟女av日韩熟女| 大香蕉欧美日韩| 人人 操人人 操人人| 精品亚洲俞拍视频一区| 天天搞在线综合网| 亚洲 欧美 综合 91| 亚洲丝袜色图| 国产av强奸美女| jiujiujiujingpin| 亚洲成人久久美女| 97超碰香蕉| 免费A V在线播放| 99av| 啊啊啊好湿国产一二| 一级一性爱免费视频| 嫩草伊人久久精品| 熟妇操花| 蜜臀AV一区二区三区激情综合| 久久噜| 色情五月婷婷| 亚洲欧美首页| 欧美人人曰人人操人人射射| 国语av最新自产拍在线观看| 青青久草| 好看的久久不射无码影视影院| 欧洲综合色图| 久久熟妇五十路一区| 99re国产精品视频| 日本ZZ高免费A级视频| 色人久久| 色官网色综合| 天天操天天干一区二区| 欧美一级特黄淫片在线观看| 欧美超碰人妻97| 国产999精品久久久久久| 国产亚洲日韩欧| 亚洲情色1区| 国产欧美岛国精品一区| 久久婷婷苹果| 一二三四视频在线社区中文字幕| 男人的天堂2019AV| 性爱Av免费| 青青草导航在线视频| 曰韩精品九九无码| 久久久9品一区二区三区| 人人干黄色| 美国精品国产精品| 男人的天堂无码| 热天堂一区二区| 99久久婷婷国产综合精品草原| 一级二级三级黑人无码| 999精品女人| 人妻人久久精品中文字幕| 麻豆九九九| 99久热| 久久‘黄片视频| 久草在线| 国产九九九九九九九九| 先锋女优在线观看视频| 黑人精品久久97| 青青草原av| 日韩精品资源专区二区| 婷婷综合视频| 夜夜青青无码影院| 婷婷三区| www.91色综合| 女人天堂AV五区在线| 丁香激情网| 亚洲熟妇自偷自拍另欧美| 午夜黄色免费在线观看| 免费看黄片现成| 骚女天天综合网| 青青草好吊色| 96精品久久久久久久久久| 国产精品丝袜在线| 亚洲自拍97| 午夜小电影在线插入淫高潮| 国产精品懂色tv影视免费观看| 国产农村妇女毛片精品久久| 亚洲第一男人天堂| 欧美人妻二区三区| 久草男人天堂| 亚洲一卡2卡3卡4卡乱码网站 | 91国产丝袜美女| 性欧美| 99超碰碰| 色逼综合| 亚洲中字幕日本一区二区三区| 天天草天天日| 蜜桃精品一区二区三区ww | 精品1区2区3区| 亚洲人天堂| 岛国免费视频在线| 国产剧情AV不卡在线观看| 国产精品干干干| 五月丁香综合啪啪| 国产精品黑人一区二区三区| 少妇高潮九九九九| 8x福利精品第一福利视频导航| 少妇人妻好深太紧了vr91| 欧美激情 一区| 国产乱码精品久久久久久| 操一操摸一摸| 男人的天堂一区| 人妻精品一区二区三区| 久久久精品中文字幕爱豆| 激情无码日韩| 国产欧美伊人| 91狠狠狠| 美女操逼福利视频| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 视频一区二区三区精品| 精品在线观看视频在线| 亚洲精品天天影视综合网| 婷婷精品久久av影视| 激情天天视频| 激情五月婷| 久久天天摸| 亚洲成人在线乱码色午夜| 亚洲国产另类在线中文| 色综合色色| 亚洲无限观看| 搡老女人老91妇女熟女| 天天看天天日天天操| 无码视频黄色网战| 男人天堂综合| 97在线免费看视频| 天天色综亚洲91污| 日韩97视频| av网页一区二区三区| www.AV有限公司一区| 91精品国产长腿丝袜美女| 亚洲天堂一区二区久久| 欧美精品第四五页中文字幕在线观看| 香蕉综合网| 亚洲九区| 无码九九九九| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 色噜噜狠狠色综无码久久| 99人妻碰碰碰久久久久禁片| 亚洲欧美校园| 福利在线观看一区二区| 婷婷精品国产一区二区三区日韩| 综合av社区| 欧美亚男人的天堂| 国产中出内射一区二区| ,国产乱人伦精品一区二区三区| 97超级久久| 亚洲最大无码中文字幕网站| 日han少妇无码| 午夜精品久久久99| 91欧美色| 亚洲中文字幕妇伦久久| 午夜啪| 欧美一区二区三区不卡高清视频| 五月丁香啪啪网| 99re免费| 大香蕉欧美国产日韩高潮| 色伊人91| 亚洲情色 自拍| 五月天丁香网| 欧美资源| 91国产美女丝袜足交精品视频| 国产精品无码av嫩草| 亚拍在线| 人妻AV 中文字幕的| 人妻一区二区三区视频| 亚欧美色图| 情侣开房子拍 日韩无码 女的很漂亮| 欧美BT 亚洲色图| 大香蕉伊人亚洲| 日本在线激情一区二区三区| 乱伦日本中文自拍| 超碰97综合网| 国精综合一二三区影视| 免费视频a级毛片免费视频| 91丨人妻丨国产丨丝袜| 人妻在线大香蕉| 在线观看AV片| 男人天堂综合| 亚洲图片 激情小说| 青青草天天亲夜夜操网| 婷婷激情四射| 欧美性爱网97| 久草视频制服诱惑| 91在线欧色| 色五月综合| 国产操逼逼网| 自拍内地三级在线观看| 欧美另类丝袜熟女| 啊啊啊啊嗯嗯在线久久久| 久久久久久91香蕉国产| 欧美制服网站美腿丝袜| 五月丁香综合| 无码78| 欧美日韩亚洲少妇寂寞影院正在播放 | 大香蕉综合网| 国产少妇内射| 中文字幕在线2| 五月丁香色综合| 欧美很很操视频| 中文自拍欧美影视| 欧美日韩性爱操大逼| 十八禁av无码免费网站APP| 天天视频网站黄| 黑人免费福利视频| 午夜精品久久一区二区| 国产在线综合福利网站| 国产91美女视频| 96久久久久久久| 久久二| 亚洲阿v天堂在线| 男女性无套 免费九一| 天天综合网在线观看| 91丝袜在线观看| 国产亚洲色停停久久99精品91| 亚洲无码精品AV久久久| 13小男生GAY自慰脱裤子| 综合在线导航一区| 国语对白在线播放视频| 日韩欧美俄罗斯A片| 91精品丝袜在线观看| 日本一区二区成人在线| 99在线免费视频| 亚州操操穴网| 五十路熟女工口 | 大学生口爆吞精| 人人人摸人人| 色婷婷导航| 香蕉99秘 精品一区丁香| 中美日韩毛片| 欧美偷| 91处女在线观看| 二男一女成人A片| 97香蕉碰碰人妻国产欧美| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 96久久久精品| 大香蕉日韩| 中文字幕精品一区二| 亚洲第一无码播放立川理惠| 亚洲中文字幕网| 日韩美女久久一区二区三区| 四季AV一区二区凹凸精品小说| 超碰无码五月97| 偷拍 亚洲 欧美| 18禁免费视频| 校园春色之综合网| 毛片麻豆91糖心精品毛情片| 国产精品播放| 八戒无码国产午夜福利| 日va操| 性爱动态120秒| 蜜桃臀一区二区aV| AV一区观看| 色五月婷婷中文字幕| 1024亚洲中文字幕久在线看片你懂的 | 日韩欧美综合激情| 极品色www影院| 熟妇一区二区三区| 亚洲综合20p| 国产一区二区视频在线播放| caopeng97人妻| 97在线观看| 国产女人高潮视频| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 大学生口爆吞精| 狠狠中文字幕| 久久精品一区二区| 丁香五月社区| 91精品丝袜久久久久久| 国产精品老师| 精品一区二区三区四区外站 | 亚洲AV无码天美传媒一区| 加勒比久久av| 粉嫩av在线一区二区| 色综合20p| 欧美日本中字另类在线| 日本九九久久99| 欧美高清无码免费视频高清版| 天天射影院| 亚洲天堂电影网99999| 欧美另类综合久久| 欧美第一页| 91精品久久久久久综合五月天| 久久精品女同亚洲女同13| 九色视频91| 9久久精品| 艳美熟妇先锋一二三区| 蜜桃av色偷偷av老熟女| 密臀在线免费观看| 农村女一级毛卡片| 超碰天天操| 日韩黄色成人性爱| 97中文综合| 天天综合网站| 在线不欧美| 97精品97| 亚洲欧美经典一区二区| 久久九色| 欧天美中出| 国产黄色av大片网站| 九九九九热| 国产原创自拍| 78超碰| 中文乱码99| aⅴ日韩成人电影av在线免费看av大全 | 久久久9品一区二区三区| 久96热在线观看视频| 99婷婷一区二区| 校园春色综合| 亚洲国产成人精品久久久国产成人一区二区| 综合日韩激情另类图片| 人人模人人看| h色99999| 人人爱夜夜爱| 久久男女激情视频网站 | 少妇精品久久久| 国产一级片| 国产一区免费午夜视频| 外国免费性情大片| 免费精品无码一级毛片牛牛影视 | 久操不卡视频| 久久性爱精品一区| 亚洲a色| 精品色色| 乱论91| 国产精品成久久久久午夜午夜| 国产免费内射视频| 日本久久999| 久草成人福利导航| 久久性爱城| 熟女少妇视频| 少妇高潮喷水无套久久久久久| 日本999精品视频| 78p欧美| 嗯嗯啊在线视频| 久久久久久AⅤ无码免费肉站| 国产精品亚洲无码| 免费αV在线视频| 999久久久久久久久| 99re6国产精品99re在线| 草草影院最新网址| 伊人久久AV诱惑悠悠| 成人性交免费视屏| 蜜臀久久久99久久久久| 夜夜操一区二区| 日韩中文字幕在线视频观看| 亚洲精品免费中文字幕| 99在线精品观看视频中文 | 婷婷久草| 97超级色碰碰| 色鬼在线综合| 国产又大又粗又长视频在线| 北京专精特新企业招聘信息| 超碰在线国产| 欧美日韩国产高清在线一二三区 | 国产探花精品在线| 免费αV在线视频| 国产精品久久久无码aV去| 青娱乐老司机视频| 午夜精品久久久久久久久久蜜桃| 神马久久久久久伦理片| 日韩性爱再线视频| 国产AV久久久蜜爱影集| 日本亚洲熟女视频| 激情小说五月天| 99热超碰| 国产精品对白内射| 激情欧美日韩女同久久| 香蕉免费一区二区三区不读| 男人的天堂日韩| 色综合美国| 天天拍天天操| 国产超碰在线一区| 福利伊人玖玖国产| 人妻81p| 日韩欧美俄罗斯A片| 狠狠干综合| 农村妇女精品一区二区| 东北女人性交| 成人97人人超碰人人| 伊人网综合在线视频| 操操啪| 日本一二区免费| 欧美极品色| 亚洲天堂男人天堂网| 久久性爱视频99| 日韩熟女乱伦中出| 五月色综合| 夜夜操av亚洲一区二区| 91久久久久| 不卡中文字幕aⅴ在线| 日本高清有码网址视频| 韩国久久97| 神马九九九| 91搞逼视频| 九九热九九热| 四虎AV在线播放| 欧美五十路熟| 91肏屄网| 蜜臀精品1区2区| 国产亚洲女v在线观看| 狠狠干狠狠色| 性交一区二区在线播放| 欧美一级在线观看成人| 亚洲成aⅴ人片不卡无码| 婷婷综合激情| 亚洲污污网站| 青娱乐老司机视频| 69精品久久久久中文字幕| 丁香五月影院| 久噜噜| 你懂的在线观看区国产| 9久久9综合| 亚洲天天操| 超碰成人免费| WWW美腿丝袜香蕉中文| 91精品人妻偷情| 亚洲人在线成线成人| 春色综合免费| 丝袜色综合| 操www| 一区二区三区日韩欧美| 精品人妻免费观看| 久久久亚洲精品电影免费看| 四方色播| 激情五月天婷婷| 日日夜夜骑| 日韩三级一区 | 亚洲 中文 欧美 日韩 在线| 精品一区二区三区免费古装毛片香港三级日本三级人妇 | 亚洲无码99| 青青在线视频日韩欧美| 九九热精品| 中文字幕在线免费观看| 色噜噜综合在线| 毛片久久| 四虎在线免费视频| 久久草大香蕉| 九九九九免费| 亚洲AV高潮| 思思热在线cao| a啊啊啊啊啊啊啊啊一区二区| 欧美激情综合色综合啪啪五月| 久久在线观看免费视频| 国产乱人妻精品入口| 97摸视频| 中文字幕久久婷婷丁香五月天| 91久久久视| 激情小说五月天| 婷婷av在线中文字幕| 亚洲欧洲激情| 丰满人妻一区二区三区四| 亚洲AV成人无码一二三久久| 9 1超碰九色| 亚洲自拍另类丝袜综合| 性爱综合一区二区| 亚洲色天堂九9| 精品人妻一区二区免费蜜桃| 久久婷婷综合国际产色怕| 26uuu久久| 色哟哟av| 久久本道| 乱伦熟女区| 精品日韩人妻视频| 九九九九九九九九九国产精品| 91人妻丝袜无码| 日韩三级在线观看网站| 久久久久9| AV中文在线| 翔田千里AⅤHD无码| 日韩小电影| 骚日日av| 天天色播| 无码丰满熟妇一区二区浪潮AV| 丁香七月婷婷| 久久夜精品一区二区三区| 国产传媒日本欧美专区| 亚洲精品亚洲人成人网| 无色无码| 亚洲va有码在线天堂| 亚洲影院无码在线| 久久中出| 在线洲亚线| 情色五月天就去干| 在线五区| 操淫穴亚洲五月丁香| 欧美97在线观看| 黄色二级片网站| 日本不卡码黄色| 75大香蕉| 97亚洲欧美日韩| 蜜臀久久99精品久久久久免费观| 人人爱夜夜爱| 裸体女人草逼视频播放一区,二区,三区,四区,五区| 99ri在线视频| 大香蕉综合网| 亚洲国产第一页综合视频| 强奸乱伦大香蕉网| 国产精品久久久三级无码| 人人妻人人爽 97人人看碰人免费公开视频| 九九九精品| 亚洲精品久久久久毛片A片拉屎 | 激情文学小说一区二区| 久久精品无码不卡| 亚洲图片 欧美电影| 日本日皮视频逼| 99热| 老师充足的奶水小说| 欧美少妇色综合| 1204金沙人妻懂旧版免费| 激情啪啪视频| 热热色色综合| 97 国产精品| 人人妻人人爱人人玩| 毛片久久| 人妻-91porn| 亚洲欧美激情在线视频| 色蜜AV| 偷拍2020| 少妇综合网| 中文色综合| 国产精选三级在线观看| 日韩欧亚太美不卡| 啊啊啊啊啊在线视频| 91中文字幕在线观看| 神马九九| 精品国产肉丝袜在线拍国语| 婷婷五月天久久精品视频一区二区三区| 午夜AV污污污| 中文字幕第2页| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 嗯嗯嗯,草死我| 亚洲高清少妇| 亚洲91在线| 国产女性无套 免费观看| 岛国大片在线观看网站入口| 欧美第一页| 国产精品高清2021在线| 欧美,日韩,亚洲视频| 少妇无码太爽| 一区二区视频在看| 殴美在线AⅤ| 性色高清在线| 欧美天天综合网版| 成人七区| 久久亚洲不卡一区二区三区| 黄色工厂这里只有精品| 91福利网在线观看| 欧美婷婷五月天| 性爱AV天堂| 久久透逼视频| 曰韩无码777| 国产人妻精品一区二区三区秋霞| 中文字幕一区二区三区字幕| 一级黄色影片| 亚洲精品97p| 久久久久国产精品喷潮免费观看臀| 欧美 亚洲 另类 综合| 91成人无码| 嗯啊免费视频| 伊人精品国产| 人妻人人做人人澡人人爽欧美一区| 自拍视频大全亚洲专媒视频/一区二区三区| 国产福利电影| 99精品网站| 好属操| 富二代亚洲精品99| 97超碰久久| 国模无码一区二区三区在线| 18禁久极品美女久久哦哟呀!| 97欧美日韩| 亚洲色图大香| 日本精品五区| 久操网无码在线| 九九成人视频| 在线观看视频91| 色婷婷激一区二区三区| 国产嫩草精品A88AV在线| 白丝av| 东北老女人的激情视频| 翔田千里Av在线| 亚洲 欧美 中文 日韩超碰| 人澡逼| 可以免费观看的av| 91天美免费| 无码heyzo高清一区| 综合五月婷婷亚洲一区| 亚洲欧美日韩中文久久自慰| 欧美日韩另类在线播放| 欧洲亚洲人人爽爽视频| 婷婷五月天福利| 久久精品国产亚洲AV高清演员表| 天天享受天天看| 亚洲av无码成人精品国产| 美女诱惑久久| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 婷婷99狠狠| 久久社区一区二区三区| 手机看片91人妻|