已合并
refactor: clarify SIMT launch and internal option semantics #1774
yrz1027创建于 19 天前
refactor: clarify SIMT launch and internal option semantics #1774
已合并
共 11 个文件变更+247-404
| @@ -60,12 +60,7 @@ enum class aclskOptionType : uint32_t { | |||
| 60 | SK_OPTION_MAX | 60 | SK_OPTION_MAX |
| 61 | }; | 61 | }; |
| 62 | 62 | ||
| 63 | -enum class SkInnerOptionType : uint32_t { | 63 | +enum class SkInnerOptionType : uint32_t { MIX_KERNEL_SPLIT = 0, SIMT_OP_SUPPORT = 1, SK_INNER_OPTION_MAX }; |
| 64 | - ENABLE_MIX_KERNEL_SPLIT = 0, | ||
| 65 | - ENABLE_SIMT_OP_CHECK = 1, | ||
| 66 | - ENABLE_SET_DYN_UBUF_SIZE = 2, | ||
| 67 | - SK_INNER_OPTION_MAX | ||
| 68 | -}; | ||
| 69 | 64 | ||
| 70 | typedef struct aclskPreloadOption { | 65 | typedef struct aclskPreloadOption { |
| 71 | uint32_t preloadMode; | 66 | uint32_t preloadMode; |
| @@ -823,32 +823,30 @@ bool SuperKernelBaseNode::Update(const UpdateContext &ctx) { | |||
| 823 | return true; | 823 | return true; |
| 824 | } | 824 | } |
| 825 | 825 | ||
| 826 | -void SuperKernelBaseNode::LogNodeUpdateResult(const aclmdlRITaskParams *resultParams) const { | 826 | +void SuperKernelBaseNode::LogNodeUpdateResult(const aclmdlRITaskParams *paramsToLog) const { |
| 827 | std::ostringstream oss; | 827 | std::ostringstream oss; |
| 828 | oss << "node update result: nodeId=" << nodeId; | 828 | oss << "node update result: nodeId=" << nodeId; |
| 829 | - if (resultParams == nullptr) { | 829 | + if (paramsToLog == nullptr) { |
| 830 | oss << ", type=INVALID"; | 830 | oss << ", type=INVALID"; |
| 831 | SK_LOGI("%s", oss.str().c_str()); | 831 | SK_LOGI("%s", oss.str().c_str()); |
| 832 | return; | 832 | return; |
| 833 | } | 833 | } |
| 834 | 834 | ||
| 835 | - oss << ", type=" << GetUpdateTargetTypeName(resultParams->type); | 835 | + oss << ", type=" << GetUpdateTargetTypeName(paramsToLog->type); |
| 836 | - switch (resultParams->type) { | 836 | + switch (paramsToLog->type) { |
| 837 | case ACL_MODEL_RI_TASK_KERNEL: | 837 | case ACL_MODEL_RI_TASK_KERNEL: |
| 838 | - oss << ", opInfoPtr=" << resultParams->opInfoPtr << ", opInfoSize=" << resultParams->opInfoSize | 838 | + oss << ", opInfoPtr=" << paramsToLog->opInfoPtr << ", opInfoSize=" << paramsToLog->opInfoSize |
| 839 | - << ", funcHandle=" << resultParams->kernelTaskParams.funcHandle | 839 | + << ", funcHandle=" << paramsToLog->kernelTaskParams.funcHandle |
| 840 | - << ", args=" << resultParams->kernelTaskParams.args | 840 | + << ", args=" << paramsToLog->kernelTaskParams.args << ", argsSize=" << paramsToLog->kernelTaskParams.argsSize |
| 841 | - << ", argsSize=" << resultParams->kernelTaskParams.argsSize | 841 | + << ", numBlocks=" << static_cast<uint32_t>(paramsToLog->kernelTaskParams.numBlocks); |
| 842 | - << ", numBlocks=" << static_cast<uint32_t>(resultParams->kernelTaskParams.numBlocks); | ||
| 843 | break; | 842 | break; |
| 844 | case ACL_MODEL_RI_TASK_VALUE_WRITE: | 843 | case ACL_MODEL_RI_TASK_VALUE_WRITE: |
| 845 | - oss << ", addr=" << resultParams->valueWriteTaskParams.devAddr << ", value=0x" << std::hex | 844 | + oss << ", addr=" << paramsToLog->valueWriteTaskParams.devAddr << ", value=0x" << std::hex |
| 846 | - << resultParams->valueWriteTaskParams.value << std::dec; | 845 | + << paramsToLog->valueWriteTaskParams.value << std::dec; |
| 847 | break; | 846 | break; |
| 848 | case ACL_MODEL_RI_TASK_VALUE_WAIT: | 847 | case ACL_MODEL_RI_TASK_VALUE_WAIT: |
| 849 | - oss << ", addr=" << resultParams->valueWaitTaskParams.devAddr << ", value=0x" << std::hex | 848 | + oss << ", addr=" << paramsToLog->valueWaitTaskParams.devAddr << ", value=0x" << std::hex |
| 850 | - << resultParams->valueWaitTaskParams.value << ", flag=0x" << resultParams->valueWaitTaskParams.flag | 849 | + << paramsToLog->valueWaitTaskParams.value << ", flag=0x" << paramsToLog->valueWaitTaskParams.flag << std::dec; |
| 851 | - << std::dec; | ||
| 852 | break; | 850 | break; |
| 853 | default: | 851 | default: |
| 854 | break; | 852 | break; |
| @@ -1062,22 +1060,18 @@ void SuperKernelKernelNode::IdentifyAndHandleSimtKernel(const SuperKernelOptions | |||
| 1062 | nodeInfos.kernelInfos.hasAllocUbufSize = false; | 1060 | nodeInfos.kernelInfos.hasAllocUbufSize = false; |
| 1063 | nodeInfos.kernelInfos.dynUbufSize = 0; | 1061 | nodeInfos.kernelInfos.dynUbufSize = 0; |
| 1064 | nodeInfos.kernelInfos.allocUbufSize = 0; | 1062 | nodeInfos.kernelInfos.allocUbufSize = 0; |
| 1065 | - if (opts == nullptr) { | 1063 | + if (opts == nullptr || !opts->IsInnerOptionEnabled(SkInnerOptionType::SIMT_OP_SUPPORT)) { |
| 1066 | - return; | ||
| 1067 | - } | ||
| 1068 | - const auto *simtCheckOpt = opts->GetOption(SkInnerOptionType::ENABLE_SIMT_OP_CHECK); | ||
| 1069 | - if (simtCheckOpt == nullptr || simtCheckOpt->GetIntValue() != 1) { | ||
| 1070 | return; | 1064 | return; |
| 1071 | } | 1065 | } |
| 1072 | SkKernelType kernelType = nodeInfos.kernelInfos.kernelType; | 1066 | SkKernelType kernelType = nodeInfos.kernelInfos.kernelType; |
| 1073 | bool hasAivSection = (kernelType == SkKernelType::AIV_ONLY || kernelType == SkKernelType::MIX_AIV_1_0 || | 1067 | bool hasAivSection = (kernelType == SkKernelType::AIV_ONLY || kernelType == SkKernelType::MIX_AIV_1_0 || |
| 1074 | kernelType == SkKernelType::MIX_AIC_1_1 || kernelType == SkKernelType::MIX_AIC_1_2); | 1068 | kernelType == SkKernelType::MIX_AIC_1_1 || kernelType == SkKernelType::MIX_AIC_1_2); |
| 1075 | if (!hasAivSection) { | 1069 | if (!hasAivSection) { |
| 1076 | - SK_LOGI("IdentifyAndHandleSimtKernel: %s has no AIV section (kernelType=%s), skip SIMT check", Format().c_str(), | 1070 | + SK_LOGI("IdentifyAndHandleSimtKernel: %s has no AIV section (kernelType=%s), skip SIMT analysis", Format().c_str(), |
| 1077 | to_string(kernelType)); | 1071 | to_string(kernelType)); |
| 1078 | return; | 1072 | return; |
| 1079 | } | 1073 | } |
| 1080 | - SK_LOGI("IdentifyAndHandleSimtKernel: checking for %s, kernelType=%s, nodeId=%lu", Format().c_str(), | 1074 | + SK_LOGI("IdentifyAndHandleSimtKernel: analyzing %s, kernelType=%s, nodeId=%lu", Format().c_str(), |
| 1081 | to_string(kernelType), nodeId); | 1075 | to_string(kernelType), nodeId); |
| 1082 | uint32_t aivType = 0; | 1076 | uint32_t aivType = 0; |
| 1083 | rtError_t ret = rtFunctionGetMetaInfo(taskParams.kernelTaskParams.funcHandle, RT_FUNCTION_TYPE_AIV_TYPE_FLAG, | 1077 | rtError_t ret = rtFunctionGetMetaInfo(taskParams.kernelTaskParams.funcHandle, RT_FUNCTION_TYPE_AIV_TYPE_FLAG, |
| @@ -1113,15 +1107,17 @@ void SuperKernelKernelNode::IdentifyAndHandleSimtKernel(const SuperKernelOptions | |||
| 1113 | return; | 1107 | return; |
| 1114 | } | 1108 | } |
| 1115 | 1109 | ||
| 1116 | -bool SuperKernelKernelNode::SetupLaunchKernelCfgWithDynUbuf(size_t minAvailableUbufSize) { | 1110 | +bool SuperKernelKernelNode::SetupLaunchKernelCfg(aclrtFuncHandle funcHandle, size_t skMaxDcacheSize, |
| 1117 | - launchKernelAttrs_.clear(); | 1111 | + std::vector<aclrtLaunchKernelAttr> &launchKernelAttrs, |
| 1112 | + aclrtLaunchKernelCfg &launchKernelCfg) const { | ||
| 1113 | + launchKernelAttrs.clear(); | ||
| 1118 | const aclrtLaunchKernelCfg *originCfg = taskParams.kernelTaskParams.cfg; | 1114 | const aclrtLaunchKernelCfg *originCfg = taskParams.kernelTaskParams.cfg; |
| 1119 | if (originCfg != nullptr && originCfg->attrs != nullptr) { | 1115 | if (originCfg != nullptr && originCfg->attrs != nullptr) { |
| 1120 | - launchKernelAttrs_.reserve(originCfg->numAttrs + 1); | 1116 | + launchKernelAttrs.reserve(originCfg->numAttrs + 1); |
| 1121 | for (size_t attrIdx = 0; attrIdx < originCfg->numAttrs; ++attrIdx) { | 1117 | for (size_t attrIdx = 0; attrIdx < originCfg->numAttrs; ++attrIdx) { |
| 1122 | const aclrtLaunchKernelAttr &originAttr = originCfg->attrs[attrIdx]; | 1118 | const aclrtLaunchKernelAttr &originAttr = originCfg->attrs[attrIdx]; |
| 1123 | if (originAttr.id != ACL_RT_LAUNCH_KERNEL_ATTR_DYN_UBUF_SIZE) { | 1119 | if (originAttr.id != ACL_RT_LAUNCH_KERNEL_ATTR_DYN_UBUF_SIZE) { |
| 1124 | - launchKernelAttrs_.push_back(originAttr); | 1120 | + launchKernelAttrs.push_back(originAttr); |
| 1125 | } | 1121 | } |
| 1126 | } | 1122 | } |
| 1127 | } | 1123 | } |
| @@ -1129,31 +1125,26 @@ bool SuperKernelKernelNode::SetupLaunchKernelCfgWithDynUbuf(size_t minAvailableU | |||
| 1129 | aclrtLaunchKernelAttr dynUbufAttr{}; | 1125 | aclrtLaunchKernelAttr dynUbufAttr{}; |
| 1130 | dynUbufAttr.id = ACL_RT_LAUNCH_KERNEL_ATTR_DYN_UBUF_SIZE; | 1126 | dynUbufAttr.id = ACL_RT_LAUNCH_KERNEL_ATTR_DYN_UBUF_SIZE; |
| 1131 | size_t skAllocUbufSize = 0; | 1127 | size_t skAllocUbufSize = 0; |
| 1132 | - if (!GetFunctionAllocUbufSize(taskParams.kernelTaskParams.funcHandle, skAllocUbufSize, Format())) { | 1128 | + if (!GetFunctionAllocUbufSize(funcHandle, skAllocUbufSize, Format())) { |
| 1133 | return false; | 1129 | return false; |
| 1134 | } | 1130 | } |
| 1135 | - if (minAvailableUbufSize > SK_TOTAL_UB_SIZE || skAllocUbufSize > SK_TOTAL_UB_SIZE - minAvailableUbufSize) { | 1131 | + if (skMaxDcacheSize > SK_TOTAL_UB_SIZE || skAllocUbufSize > SK_TOTAL_UB_SIZE - skMaxDcacheSize) { |
| 1136 | SK_LOGE( | 1132 | SK_LOGE( |
| 1137 | - "invalid dyn ubuf calculation for %s, totalUbSize=%zu, minAvailableUbufSize=%zu, " | 1133 | + "invalid dyn ubuf calculation for %s, totalUbSize=%zu, skMaxDcacheSize=%zu, " |
| 1138 | "skAllocUbufSize=%zu", | 1134 | "skAllocUbufSize=%zu", |
| 1139 | - Format().c_str(), SK_TOTAL_UB_SIZE, minAvailableUbufSize, skAllocUbufSize); | 1135 | + Format().c_str(), SK_TOTAL_UB_SIZE, skMaxDcacheSize, skAllocUbufSize); |
| 1140 | return false; | 1136 | return false; |
| 1141 | } | 1137 | } |
| 1142 | - size_t finalDynUbufSize = SK_TOTAL_UB_SIZE - minAvailableUbufSize - skAllocUbufSize; | 1138 | + size_t skEntryDynUbufSize = SK_TOTAL_UB_SIZE - skMaxDcacheSize - skAllocUbufSize; |
| 1143 | - if (finalDynUbufSize > std::numeric_limits<uint32_t>::max()) { | 1139 | + dynUbufAttr.value.dynUBufSize = static_cast<uint32_t>(skEntryDynUbufSize); |
| 1144 | - SK_LOGE("dynUbufSize exceeds uint32_t range for %s, dynUbufSize=%zu", Format().c_str(), finalDynUbufSize); | 1140 | + launchKernelAttrs.push_back(dynUbufAttr); |
| 1145 | - return false; | ||
| 1146 | - } | ||
| 1147 | - dynUbufAttr.value.dynUBufSize = static_cast<uint32_t>(finalDynUbufSize); | ||
| 1148 | - launchKernelAttrs_.push_back(dynUbufAttr); | ||
| 1149 | 1141 | ||
| 1150 | - launchKernelCfg_.attrs = launchKernelAttrs_.data(); | 1142 | + launchKernelCfg.attrs = launchKernelAttrs.data(); |
| 1151 | - launchKernelCfg_.numAttrs = launchKernelAttrs_.size(); | 1143 | + launchKernelCfg.numAttrs = launchKernelAttrs.size(); |
| 1152 | - taskParams.kernelTaskParams.cfg = &launchKernelCfg_; | ||
| 1153 | SK_LOGI( | 1144 | SK_LOGI( |
| 1154 | - "Set dyn ubuf launch cfg for %s, minAvailableUbufSize=%zu, skAllocUbufSize=%zu, " | 1145 | + "Set dyn ubuf launch cfg for %s, skMaxDcacheSize=%zu, skAllocUbufSize=%zu, " |
| 1155 | - "finalDynUbufSize=%zu, attrCount=%zu", | 1146 | + "skEntryDynUbufSize=%zu, attrCount=%zu", |
| 1156 | - Format().c_str(), minAvailableUbufSize, skAllocUbufSize, finalDynUbufSize, launchKernelCfg_.numAttrs); | 1147 | + Format().c_str(), skMaxDcacheSize, skAllocUbufSize, skEntryDynUbufSize, launchKernelCfg.numAttrs); |
| 1157 | return true; | 1148 | return true; |
| 1158 | } | 1149 | } |
| 1159 | 1150 | ||
| @@ -1201,7 +1192,8 @@ bool SuperKernelKernelNode::Update(const UpdateContext &ctx) { | |||
| 1201 | SK_LOGE("Failed to update base node for %s", Format().c_str()); | 1192 | SK_LOGE("Failed to update base node for %s", Format().c_str()); |
| 1202 | return false; | 1193 | return false; |
| 1203 | } | 1194 | } |
| 1204 | - const aclmdlRITaskParams *resultParams = nullptr; | 1195 | + aclmdlRITaskParams updateParams{}; |
| 1196 | + bool hasUpdateParams = false; | ||
| 1205 | 1197 | ||
| 1206 | if (ctx.customParams != nullptr && ctx.customParams->type != 0) { | 1198 | if (ctx.customParams != nullptr && ctx.customParams->type != 0) { |
| 1207 | // check update value | 1199 | // check update value |
| @@ -1218,38 +1210,48 @@ bool SuperKernelKernelNode::Update(const UpdateContext &ctx) { | |||
| 1218 | Format().c_str()); | 1210 | Format().c_str()); |
| 1219 | break; | 1211 | break; |
| 1220 | } | 1212 | } |
| 1213 | + updateParams = *ctx.customParams; | ||
| 1221 | // update kernel with custom params for stream sync | 1214 | // update kernel with custom params for stream sync |
| 1222 | - aclError aclRet = aclmdlRITaskSetParams(*originTask, ctx.customParams); | 1215 | + aclError aclRet = aclmdlRITaskSetParams(*originTask, &updateParams); |
| 1223 | if (aclRet != ACL_SUCCESS) { | 1216 | if (aclRet != ACL_SUCCESS) { |
| 1224 | SK_LOGE("Failed to set kernel with custom params for %s", Format().c_str()); | 1217 | SK_LOGE("Failed to set kernel with custom params for %s", Format().c_str()); |
| 1225 | return false; | 1218 | return false; |
| 1226 | } | 1219 | } |
| 1227 | // Sync taskParams for JSON dump | 1220 | // Sync taskParams for JSON dump |
| 1228 | - taskParams = *ctx.customParams; | 1221 | + taskParams = updateParams; |
| 1229 | - resultParams = &taskParams; | 1222 | + hasUpdateParams = true; |
| 1230 | } else if (ctx.launchInfo != nullptr && ctx.launchInfo->entryInfo.skEntryFunc != nullptr) { | 1223 | } else if (ctx.launchInfo != nullptr && ctx.launchInfo->entryInfo.skEntryFunc != nullptr) { |
| 1231 | - taskParams.kernelTaskParams.args = static_cast<void *>(ctx.launchInfo->devArgs.Get()); | 1224 | + updateParams = taskParams; |
| 1232 | - taskParams.kernelTaskParams.argsSize = ctx.launchInfo->devArgs.Get()->skHeader.totalSize; | 1225 | + updateParams.type = ACL_MODEL_RI_TASK_KERNEL; |
| 1233 | - taskParams.kernelTaskParams.isHostArgs = true; | 1226 | + updateParams.opInfoPtr = ctx.launchInfo->cacheInfo; |
| 1234 | - | 1227 | + updateParams.opInfoSize = ctx.launchInfo->cacheopInfoSize; |
| 1235 | - taskParams.kernelTaskParams.funcHandle = ctx.launchInfo->entryInfo.skEntryFunc; | 1228 | + updateParams.kernelTaskParams.args = static_cast<void *>(ctx.launchInfo->devArgs.Get()); |
| 1236 | - taskParams.kernelTaskParams.numBlocks = ctx.launchInfo->entryInfo.numBlocks; | 1229 | + updateParams.kernelTaskParams.argsSize = ctx.launchInfo->devArgs.Get()->skHeader.totalSize; |
| 1237 | - taskParams.type = ACL_MODEL_RI_TASK_KERNEL; | 1230 | + updateParams.kernelTaskParams.isHostArgs = true; |
| 1238 | - taskParams.opInfoPtr = ctx.launchInfo->cacheInfo; | 1231 | + updateParams.kernelTaskParams.funcHandle = ctx.launchInfo->entryInfo.skEntryFunc; |
| 1239 | - taskParams.opInfoSize = ctx.launchInfo->cacheopInfoSize; | 1232 | + updateParams.kernelTaskParams.numBlocks = ctx.launchInfo->entryInfo.numBlocks; |
| 1240 | - if (ctx.launchInfo->hasMinAvailableUbufSize && | 1233 | + aclrtLaunchKernelCfg *originCfg = taskParams.kernelTaskParams.cfg; |
| 1241 | - !SetupLaunchKernelCfgWithDynUbuf(ctx.launchInfo->minAvailableUbufSize)) { | 1234 | + updateParams.kernelTaskParams.cfg = originCfg; |
| 1242 | - SK_LOGE("Failed to setup dyn ubuf launch cfg for kernel node %s", Format().c_str()); | 1235 | + std::vector<aclrtLaunchKernelAttr> launchKernelAttrs; |
| 1243 | - return false; | 1236 | + aclrtLaunchKernelCfg launchKernelCfg{}; |
| 1237 | + if (ctx.launchInfo->useSimtEntry) { | ||
| 1238 | + if (!SetupLaunchKernelCfg(updateParams.kernelTaskParams.funcHandle, ctx.launchInfo->skMaxDcacheSize, | ||
| 1239 | + launchKernelAttrs, launchKernelCfg)) { | ||
| 1240 | + SK_LOGE("Failed to setup dyn ubuf launch cfg for kernel node %s", Format().c_str()); | ||
| 1241 | + return false; | ||
| 1242 | + } | ||
| 1243 | + updateParams.kernelTaskParams.cfg = &launchKernelCfg; | ||
| 1244 | } | 1244 | } |
| 1245 | 1245 | ||
| 1246 | - aclError aclRet = aclmdlRITaskSetParams(*originTask, &taskParams); | 1246 | + aclError aclRet = aclmdlRITaskSetParams(*originTask, &updateParams); |
| 1247 | + updateParams.kernelTaskParams.cfg = originCfg; | ||
| 1247 | 1248 | ||
| 1248 | if (aclRet != ACL_SUCCESS) { | 1249 | if (aclRet != ACL_SUCCESS) { |
| 1249 | SK_LOGE("Failed to update kernel node %s", Format().c_str()); | 1250 | SK_LOGE("Failed to update kernel node %s", Format().c_str()); |
| 1250 | return false; | 1251 | return false; |
| 1251 | } | 1252 | } |
| 1252 | - resultParams = &taskParams; | 1253 | + taskParams = updateParams; |
| 1254 | + hasUpdateParams = true; | ||
| 1253 | } else { | 1255 | } else { |
| 1254 | aclError aclRet = InValidateNode(); | 1256 | aclError aclRet = InValidateNode(); |
| 1255 | if (aclRet != ACL_SUCCESS) { | 1257 | if (aclRet != ACL_SUCCESS) { |
| @@ -1257,7 +1259,7 @@ bool SuperKernelKernelNode::Update(const UpdateContext &ctx) { | |||
| 1257 | } | 1259 | } |
| 1258 | } | 1260 | } |
| 1259 | 1261 | ||
| 1260 | - LogNodeUpdateResult(resultParams); | 1262 | + LogNodeUpdateResult(hasUpdateParams ? &updateParams : nullptr); |
| 1261 | return true; | 1263 | return true; |
| 1262 | } | 1264 | } |
| 1263 | 1265 | ||
| @@ -1361,7 +1363,8 @@ bool SuperKernelMemoryNode::Update(const UpdateContext &ctx) { | |||
| 1361 | SK_LOGE("Failed to update base node for %s", Format().c_str()); | 1363 | SK_LOGE("Failed to update base node for %s", Format().c_str()); |
| 1362 | return false; | 1364 | return false; |
| 1363 | } | 1365 | } |
| 1364 | - const aclmdlRITaskParams *resultParams = nullptr; | 1366 | + aclmdlRITaskParams updateParams{}; |
| 1367 | + bool hasUpdateParams = false; | ||
| 1365 | 1368 | ||
| 1366 | if (ctx.customParams != nullptr && ctx.customParams->type != 0) { | 1369 | if (ctx.customParams != nullptr && ctx.customParams->type != 0) { |
| 1367 | // check update value | 1370 | // check update value |
| @@ -1378,15 +1381,16 @@ bool SuperKernelMemoryNode::Update(const UpdateContext &ctx) { | |||
| 1378 | Format().c_str()); | 1381 | Format().c_str()); |
| 1379 | break; | 1382 | break; |
| 1380 | } | 1383 | } |
| 1384 | + updateParams = *ctx.customParams; | ||
| 1381 | // update memory node with custom params for stream sync | 1385 | // update memory node with custom params for stream sync |
| 1382 | - aclError aclRet = aclmdlRITaskSetParams(*originTask, ctx.customParams); | 1386 | + aclError aclRet = aclmdlRITaskSetParams(*originTask, &updateParams); |
| 1383 | if (aclRet != ACL_SUCCESS) { | 1387 | if (aclRet != ACL_SUCCESS) { |
| 1384 | SK_LOGE("Failed to set custom params on memory node %s", Format().c_str()); | 1388 | SK_LOGE("Failed to set custom params on memory node %s", Format().c_str()); |
| 1385 | return false; | 1389 | return false; |
| 1386 | } | 1390 | } |
| 1387 | // Sync taskParams for JSON dump | 1391 | // Sync taskParams for JSON dump |
| 1388 | - taskParams = *ctx.customParams; | 1392 | + taskParams = updateParams; |
| 1389 | - resultParams = &taskParams; | 1393 | + hasUpdateParams = true; |
| 1390 | } else { | 1394 | } else { |
| 1391 | aclError aclRet = InValidateNode(); | 1395 | aclError aclRet = InValidateNode(); |
| 1392 | if (aclRet != ACL_SUCCESS) { | 1396 | if (aclRet != ACL_SUCCESS) { |
| @@ -1394,7 +1398,7 @@ bool SuperKernelMemoryNode::Update(const UpdateContext &ctx) { | |||
| 1394 | } | 1398 | } |
| 1395 | } | 1399 | } |
| 1396 | 1400 | ||
| 1397 | - LogNodeUpdateResult(resultParams); | 1401 | + LogNodeUpdateResult(hasUpdateParams ? &updateParams : nullptr); |
| 1398 | return true; | 1402 | return true; |
| 1399 | } | 1403 | } |
| 1400 | 1404 | ||
| @@ -534,7 +534,7 @@ class SuperKernelBaseNode { | |||
| 534 | 534 | ||
| 535 | protected: | 535 | protected: |
| 536 | aclmdlRITaskParams taskParams; | 536 | aclmdlRITaskParams taskParams; |
| 537 | - void LogNodeUpdateResult(const aclmdlRITaskParams *resultParams) const; | 537 | + void LogNodeUpdateResult(const aclmdlRITaskParams *paramsToLog) const; |
| 538 | const char *GetUpdateTargetTypeName(aclmdlRITaskType type) const; | 538 | const char *GetUpdateTargetTypeName(aclmdlRITaskType type) const; |
| 539 | uint32_t notifyExpandVecNum; | 539 | uint32_t notifyExpandVecNum; |
| 540 | uint32_t notifyExpandCubeNum; | 540 | uint32_t notifyExpandCubeNum; |
| @@ -594,14 +594,14 @@ class SuperKernelKernelNode : public SuperKernelBaseNode { | |||
| 594 | 594 | ||
| 595 | private: | 595 | private: |
| 596 | void IdentifyAndHandleSimtKernel(const SuperKernelOptionsManager *opts); | 596 | void IdentifyAndHandleSimtKernel(const SuperKernelOptionsManager *opts); |
| 597 | - bool SetupLaunchKernelCfgWithDynUbuf(size_t minAvailableUbufSize); | 597 | + bool SetupLaunchKernelCfg(aclrtFuncHandle funcHandle, size_t skMaxDcacheSize, |
| 598 | + std::vector<aclrtLaunchKernelAttr> &launchKernelAttrs, | ||
| 599 | + aclrtLaunchKernelCfg &launchKernelCfg) const; | ||
| 598 | 600 | ||
| 599 | bool isScopeBegin = false; | 601 | bool isScopeBegin = false; |
| 600 | bool isScopeEnd = false; | 602 | bool isScopeEnd = false; |
| 601 | bool isPlaceholder = false; | 603 | bool isPlaceholder = false; |
| 602 | std::string scopeName; | 604 | std::string scopeName; |
| 603 | - std::vector<aclrtLaunchKernelAttr> launchKernelAttrs_; | ||
| 604 | - aclrtLaunchKernelCfg launchKernelCfg_{}; | ||
| 605 | }; | 605 | }; |
| 606 | 606 | ||
| 607 | class SuperKernelMemoryNode : public SuperKernelBaseNode { | 607 | class SuperKernelMemoryNode : public SuperKernelBaseNode { |
| @@ -281,8 +281,11 @@ bool SuperKernelOptimizer::Schedule(SuperKernelScopeInfo &scopeInfo, SuperKernel | |||
| 281 | SK_LOGE("schedule failed: build launch info failed"); | 281 | SK_LOGE("schedule failed: build launch info failed"); |
| 282 | return false; | 282 | return false; |
| 283 | } | 283 | } |
| 284 | - SK_LOGI("schedule scope: build finished, entryType=%s, entryFuncHandle=%p, skFuncName=%s", | 284 | + SK_LOGI( |
| 285 | - to_string(launchInfo.entryInfo.entryType), launchInfo.entryInfo.skEntryFunc, launchInfo.skFuncName.c_str()); | 285 | + "schedule scope: build finished, entryType=%s, entryFuncHandle=%p, skFuncName=%s, useSimtEntry=%d, " |
| 286 | + "skMaxDcacheSize=%zu", | ||
| 287 | + to_string(launchInfo.entryInfo.entryType), launchInfo.entryInfo.skEntryFunc, launchInfo.skFuncName.c_str(), | ||
| 288 | + static_cast<int>(launchInfo.useSimtEntry), launchInfo.skMaxDcacheSize); | ||
| 286 | 289 | ||
| 287 | if (!Update(scopeInfo, graph, launchInfo)) { | 290 | if (!Update(scopeInfo, graph, launchInfo)) { |
| 288 | SK_LOGE("schedule failed: scope update failed"); | 291 | SK_LOGE("schedule failed: scope update failed"); |
| @@ -131,39 +131,23 @@ const DefaultOptionFactoryEntry *FindDefaultOptionFactory(aclskOptionType optTyp | |||
| 131 | return nullptr; | 131 | return nullptr; |
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | -using DefaultInnerOptionFactory = std::unique_ptr<OptOptionBase> (*)(); | 134 | +struct InnerOptionInfo { |
| 135 | - | 135 | + SkInnerOptionType optionType; |
| 136 | -struct DefaultInnerOptionFactoryEntry { | 136 | + std::unique_ptr<OptOptionBase> (*factory)(); |
| 137 | - SkInnerOptionType optType; | ||
| 138 | - DefaultInnerOptionFactory factory; | ||
| 139 | }; | 137 | }; |
| 140 | 138 | ||
| 141 | -const std::array<DefaultInnerOptionFactoryEntry, static_cast<size_t>(SkInnerOptionType::SK_INNER_OPTION_MAX)> | 139 | +const std::array<InnerOptionInfo, static_cast<size_t>(SkInnerOptionType::SK_INNER_OPTION_MAX)> DEFAULT_INNER_OPTIONS = { |
| 142 | - DEFAULT_INNER_OPTION_FACTORIES = {{ | 140 | + { |
| 143 | - {SkInnerOptionType::ENABLE_MIX_KERNEL_SPLIT, | 141 | + {SkInnerOptionType::MIX_KERNEL_SPLIT, |
| 144 | []() -> std::unique_ptr<OptOptionBase> { | 142 | []() -> std::unique_ptr<OptOptionBase> { |
| 145 | - return std::make_unique<NumberOptOption>("enable_mix_kernel_split", aclskOptionType::SK_OPTION_MAX, 0, 0, 1); | 143 | + return std::make_unique<NumberOptOption>("mix_kernel_split", aclskOptionType::SK_OPTION_MAX, 0, 0, 1); |
| 146 | }}, | 144 | }}, |
| 147 | - {SkInnerOptionType::ENABLE_SIMT_OP_CHECK, | 145 | + {SkInnerOptionType::SIMT_OP_SUPPORT, |
| 148 | []() -> std::unique_ptr<OptOptionBase> { | 146 | []() -> std::unique_ptr<OptOptionBase> { |
| 149 | - return std::make_unique<NumberOptOption>("enable_simt_op_check", aclskOptionType::SK_OPTION_MAX, 0, 0, 1); | 147 | + return std::make_unique<NumberOptOption>("simt_op_support", aclskOptionType::SK_OPTION_MAX, 0, 0, 1); |
| 150 | - }}, | ||
| 151 | - {SkInnerOptionType::ENABLE_SET_DYN_UBUF_SIZE, | ||
| 152 | - []() -> std::unique_ptr<OptOptionBase> { | ||
| 153 | - return std::make_unique<NumberOptOption>("enable_set_dyn_ubuf_size", aclskOptionType::SK_OPTION_MAX, 0, 0, | ||
| 154 | - 1); | ||
| 155 | }}, | 148 | }}, |
| 156 | }}; | 149 | }}; |
| 157 | 150 | ||
| 158 | -const DefaultInnerOptionFactoryEntry *FindDefaultInnerOptionFactory(SkInnerOptionType optType) { | ||
| 159 | - for (const auto &entry : DEFAULT_INNER_OPTION_FACTORIES) { | ||
| 160 | - if (entry.optType == optType) { | ||
| 161 | - return &entry; | ||
| 162 | - } | ||
| 163 | - } | ||
| 164 | - return nullptr; | ||
| 165 | -} | ||
| 166 | - | ||
| 167 | uint32_t GetValidatedUintValue(const std::string &optionName, uint32_t value, uint32_t defaultValue, uint32_t minValue, | 151 | uint32_t GetValidatedUintValue(const std::string &optionName, uint32_t value, uint32_t defaultValue, uint32_t minValue, |
| 168 | uint32_t maxValue) { | 152 | uint32_t maxValue) { |
| 169 | if (value < minValue || value > maxValue) { | 153 | if (value < minValue || value > maxValue) { |
| @@ -378,20 +362,9 @@ const OptOptionBase *SuperKernelOptionsManager::GetOption(aclskOptionType optTyp | |||
| 378 | return iter->second.get(); | 362 | return iter->second.get(); |
| 379 | } | 363 | } |
| 380 | 364 | ||
| 381 | -OptOptionBase *SuperKernelOptionsManager::GetOption(SkInnerOptionType optType) { | 365 | +bool SuperKernelOptionsManager::IsInnerOptionEnabled(SkInnerOptionType optionType) const { |
| 382 | - auto iter = innerOptionMap.find(optType); | 366 | + const auto iter = innerOptionMap.find(optionType); |
| 383 | - if (iter == innerOptionMap.end()) { | 367 | + return iter != innerOptionMap.end() && iter->second != nullptr && iter->second->GetIntValue() == 1; |
| 384 | - return nullptr; | ||
| 385 | - } | ||
| 386 | - return iter->second.get(); | ||
| 387 | -} | ||
| 388 | - | ||
| 389 | -const OptOptionBase *SuperKernelOptionsManager::GetOption(SkInnerOptionType optType) const { | ||
| 390 | - auto iter = innerOptionMap.find(optType); | ||
| 391 | - if (iter == innerOptionMap.end()) { | ||
| 392 | - return nullptr; | ||
| 393 | - } | ||
| 394 | - return iter->second.get(); | ||
| 395 | } | 368 | } |
| 396 | 369 | ||
| 397 | bool SuperKernelOptionsManager::MatchKernelNameInList(const std::vector<std::string> &kernelList, | 370 | bool SuperKernelOptionsManager::MatchKernelNameInList(const std::vector<std::string> &kernelList, |
| @@ -507,58 +480,41 @@ void SuperKernelOptionsManager::RegisterDefaultSkOptions() { | |||
| 507 | } | 480 | } |
| 508 | 481 | ||
| 509 | void SuperKernelOptionsManager::RegisterDefaultInnerOptions() { | 482 | void SuperKernelOptionsManager::RegisterDefaultInnerOptions() { |
| 510 | - for (int32_t i = 0; i < static_cast<int32_t>(SkInnerOptionType::SK_INNER_OPTION_MAX); ++i) { | 483 | + for (const auto &option : DEFAULT_INNER_OPTIONS) { |
| 511 | - auto type = static_cast<SkInnerOptionType>(i); | 484 | + if (innerOptionMap.find(option.optionType) == innerOptionMap.end()) { |
| 512 | - if (innerOptionMap.find(type) != innerOptionMap.end()) { | 485 | + innerOptionMap[option.optionType] = option.factory(); |
| 513 | - continue; | ||
| 514 | } | 486 | } |
| 515 | - const auto *entry = FindDefaultInnerOptionFactory(type); | ||
| 516 | - if (entry == nullptr) { | ||
| 517 | - continue; | ||
| 518 | - } | ||
| 519 | - innerOptionMap[type] = entry->factory(); | ||
| 520 | } | 487 | } |
| 521 | } | 488 | } |
| 522 | 489 | ||
| 523 | -void SuperKernelOptionsManager::ApplySoCSpecificOptions() { | 490 | +void SuperKernelOptionsManager::ApplyArchSpecificOptions() { |
| 524 | - std::string socName = GetSocName(); | 491 | + const SkKernelArch kernelArch = GetCurrentSkKernelArch(); |
| 525 | - bool isDav3510 = GetCurrentSkKernelArch() == SkKernelArch::DAV_3510; | 492 | + const auto enableOption = [this](SkInnerOptionType optionType) { |
| 526 | - if (isDav3510) { | 493 | + const auto iter = innerOptionMap.find(optionType); |
| 527 | - auto *mixSplitOpt = GetOption(SkInnerOptionType::ENABLE_MIX_KERNEL_SPLIT); | 494 | + if (iter != innerOptionMap.end() && iter->second != nullptr) { |
| 528 | - if (mixSplitOpt != nullptr) { | 495 | + iter->second->SetValue(1); |
| 529 | - mixSplitOpt->SetValue(1); | ||
| 530 | } | 496 | } |
| 497 | + }; | ||
| 531 | 498 | ||
| 532 | - auto *simtCheckOpt = GetOption(SkInnerOptionType::ENABLE_SIMT_OP_CHECK); | 499 | + switch (kernelArch) { |
| 533 | - if (simtCheckOpt != nullptr) { | 500 | + case SkKernelArch::DAV_3510: |
| 534 | - simtCheckOpt->SetValue(1); | 501 | + enableOption(SkInnerOptionType::MIX_KERNEL_SPLIT); |
| 535 | - } | 502 | + enableOption(SkInnerOptionType::SIMT_OP_SUPPORT); |
| 536 | - | 503 | + break; |
| 537 | - auto *setDynUbufSizeOpt = GetOption(SkInnerOptionType::ENABLE_SET_DYN_UBUF_SIZE); | 504 | + case SkKernelArch::DAV_2201: |
| 538 | - if (setDynUbufSizeOpt != nullptr) { | 505 | + default: |
| 539 | - setDynUbufSizeOpt->SetValue(1); | 506 | + break; |
| 540 | - } | ||
| 541 | } | 507 | } |
| 542 | 508 | ||
| 543 | - SK_LOGI( | 509 | + SK_LOGI("ApplyArchSpecificOptions: kernelArch=%s, mixKernelSplit=%d, simtOpSupport=%d", to_string(kernelArch), |
| 544 | - "ApplySoCSpecificOptions: socName=%s, " | 510 | + static_cast<int>(IsInnerOptionEnabled(SkInnerOptionType::MIX_KERNEL_SPLIT)), |
| 545 | - "enableMixKernelSplit=%u, enableSimtOpCheck=%u, enableSetDynUbufSize=%u", | 511 | + static_cast<int>(IsInnerOptionEnabled(SkInnerOptionType::SIMT_OP_SUPPORT))); |
| 546 | - socName.c_str(), | ||
| 547 | - GetOption(SkInnerOptionType::ENABLE_MIX_KERNEL_SPLIT) != nullptr | ||
| 548 | - ? GetOption(SkInnerOptionType::ENABLE_MIX_KERNEL_SPLIT)->GetIntValue() | ||
| 549 | - : 0, | ||
| 550 | - GetOption(SkInnerOptionType::ENABLE_SIMT_OP_CHECK) != nullptr | ||
| 551 | - ? GetOption(SkInnerOptionType::ENABLE_SIMT_OP_CHECK)->GetIntValue() | ||
| 552 | - : 0, | ||
| 553 | - GetOption(SkInnerOptionType::ENABLE_SET_DYN_UBUF_SIZE) != nullptr | ||
| 554 | - ? GetOption(SkInnerOptionType::ENABLE_SET_DYN_UBUF_SIZE)->GetIntValue() | ||
| 555 | - : 0); | ||
| 556 | } | 512 | } |
| 557 | 513 | ||
| 558 | void SuperKernelOptionsManager::RegisterDefaultOptions() { | 514 | void SuperKernelOptionsManager::RegisterDefaultOptions() { |
| 559 | RegisterDefaultSkOptions(); | 515 | RegisterDefaultSkOptions(); |
| 560 | RegisterDefaultInnerOptions(); | 516 | RegisterDefaultInnerOptions(); |
| 561 | - ApplySoCSpecificOptions(); | 517 | + ApplyArchSpecificOptions(); |
| 562 | } | 518 | } |
| 563 | 519 | ||
| 564 | void SuperKernelOptionsManager::SetOptOptionValue(const aclskOption *option) { | 520 | void SuperKernelOptionsManager::SetOptOptionValue(const aclskOption *option) { |
| @@ -833,30 +789,18 @@ nlohmann::ordered_json SuperKernelOptionsManager::ToJson() const { | |||
| 833 | } | 789 | } |
| 834 | 790 | ||
| 835 | nlohmann::ordered_json innerOptionsJson = nlohmann::ordered_json::object(); | 791 | nlohmann::ordered_json innerOptionsJson = nlohmann::ordered_json::object(); |
| 836 | - for (int32_t i = 0; i < static_cast<int32_t>(SkInnerOptionType::SK_INNER_OPTION_MAX); ++i) { | 792 | + for (const auto &option : DEFAULT_INNER_OPTIONS) { |
| 837 | - auto type = static_cast<SkInnerOptionType>(i); | 793 | + const auto iter = innerOptionMap.find(option.optionType); |
| 838 | - const auto iter = innerOptionMap.find(type); | ||
| 839 | if (iter == innerOptionMap.end() || iter->second == nullptr) { | 794 | if (iter == innerOptionMap.end() || iter->second == nullptr) { |
| 840 | continue; | 795 | continue; |
| 841 | } | 796 | } |
| 842 | 797 | ||
| 843 | - const OptOptionBase *opt = iter->second.get(); | 798 | + const OptOptionBase *innerOption = iter->second.get(); |
| 844 | - nlohmann::ordered_json optJson; | 799 | + nlohmann::ordered_json optionJson; |
| 845 | - optJson["name"] = opt->GetName(); | 800 | + optionJson["name"] = innerOption->GetName(); |
| 846 | - optJson["type"] = static_cast<int>(type); | 801 | + optionJson["type"] = static_cast<int>(option.optionType); |
| 847 | - | 802 | + optionJson["value"] = IsInnerOptionEnabled(option.optionType); |
| 848 | - switch (type) { | 803 | + innerOptionsJson[innerOption->GetName()] = optionJson; |
| 849 | - case SkInnerOptionType::ENABLE_MIX_KERNEL_SPLIT: | ||
| 850 | - case SkInnerOptionType::ENABLE_SIMT_OP_CHECK: | ||
| 851 | - case SkInnerOptionType::ENABLE_SET_DYN_UBUF_SIZE: | ||
| 852 | - optJson["value"] = opt->GetIntValue(); | ||
| 853 | - break; | ||
| 854 | - default: | ||
| 855 | - optJson["value"] = nullptr; | ||
| 856 | - break; | ||
| 857 | - } | ||
| 858 | - | ||
| 859 | - innerOptionsJson[opt->GetName()] = optJson; | ||
| 860 | } | 804 | } |
| 861 | optionsJson["inner_options"] = innerOptionsJson; | 805 | optionsJson["inner_options"] = innerOptionsJson; |
| 862 | 806 | ||
| @@ -240,12 +240,11 @@ class SuperKernelOptionsManager { | |||
| 240 | bool EnableDebug() const; | 240 | bool EnableDebug() const; |
| 241 | 241 | ||
| 242 | /*! | 242 | /*! |
| 243 | - * \brief Get an inner option by its type | 243 | + * \brief Check whether an internal option is enabled |
| 244 | - * \param optType The inner option type to retrieve | 244 | + * \param optionType Internal option type |
| 245 | - * \return Pointer to the option, or nullptr if not found | 245 | + * \return True if the option is enabled |
| 246 | */ | 246 | */ |
| 247 | - OptOptionBase *GetOption(SkInnerOptionType optType); | 247 | + bool IsInnerOptionEnabled(SkInnerOptionType optionType) const; |
| 248 | - const OptOptionBase *GetOption(SkInnerOptionType optType) const; | ||
| 249 | 248 | ||
| 250 | /*! | 249 | /*! |
| 251 | * \brief Set option value from an aclskOption structure | 250 | * \brief Set option value from an aclskOption structure |
| @@ -269,7 +268,7 @@ class SuperKernelOptionsManager { | |||
| 269 | void RegisterDefaultOptions(); | 268 | void RegisterDefaultOptions(); |
| 270 | void RegisterDefaultSkOptions(); | 269 | void RegisterDefaultSkOptions(); |
| 271 | void RegisterDefaultInnerOptions(); | 270 | void RegisterDefaultInnerOptions(); |
| 272 | - void ApplySoCSpecificOptions(); | 271 | + void ApplyArchSpecificOptions(); |
| 273 | 272 | ||
| 274 | std::unordered_map<aclskOptionType, std::unique_ptr<OptOptionBase>> optionMap; | 273 | std::unordered_map<aclskOptionType, std::unique_ptr<OptOptionBase>> optionMap; |
| 275 | std::unordered_map<SkInnerOptionType, std::unique_ptr<OptOptionBase>> innerOptionMap; | 274 | std::unordered_map<SkInnerOptionType, std::unique_ptr<OptOptionBase>> innerOptionMap; |
| @@ -131,15 +131,15 @@ SkQueueType InferFirstKernelEventQueueType(const std::vector<SuperKernelBaseNode | |||
| 131 | return SkQueueType::UNKNOWN; | 131 | return SkQueueType::UNKNOWN; |
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | -struct SimtAvailableUbufInfo { | 134 | +struct SimtDcacheSizeResult { |
| 135 | - bool success = true; | 135 | + bool isValid = true; |
| 136 | - bool hasMinAvailableUbufSize = false; | 136 | + bool hasSimtTask = false; |
| 137 | - size_t minAvailableUbufSize = 0; | 137 | + size_t skMaxDcacheSize = 0; |
| 138 | }; | 138 | }; |
| 139 | 139 | ||
| 140 | -SimtAvailableUbufInfo GetMinSimtAvailableUbufSize(const std::vector<SuperKernelBaseNode *> &tasks) { | 140 | +SimtDcacheSizeResult CalculateSimtDcacheSize(const std::vector<SuperKernelBaseNode *> &tasks) { |
| 141 | - SimtAvailableUbufInfo availableUbufInfo; | 141 | + SimtDcacheSizeResult dcacheSizeResult; |
| 142 | - size_t minAvailableUbufSize = SK_TOTAL_UB_SIZE; | 142 | + size_t skMaxDcacheSize = SK_TOTAL_UB_SIZE; |
| 143 | for (const auto *task : tasks) { | 143 | for (const auto *task : tasks) { |
| 144 | if (task == nullptr || task->GetNodeType() != SkNodeType::NODE_KERNEL) { | 144 | if (task == nullptr || task->GetNodeType() != SkNodeType::NODE_KERNEL) { |
| 145 | continue; | 145 | continue; |
| @@ -148,11 +148,12 @@ SimtAvailableUbufInfo GetMinSimtAvailableUbufSize(const std::vector<SuperKernelB | |||
| 148 | if (!kernelInfo.isSimtOp) { | 148 | if (!kernelInfo.isSimtOp) { |
| 149 | continue; | 149 | continue; |
| 150 | } | 150 | } |
| 151 | + dcacheSizeResult.hasSimtTask = true; | ||
| 151 | if (!kernelInfo.hasDynUbufSize || !kernelInfo.hasAllocUbufSize) { | 152 | if (!kernelInfo.hasDynUbufSize || !kernelInfo.hasAllocUbufSize) { |
| 152 | SK_LOGE("SIMT kernel lacks ubuf size info, nodeId=%lu, hasDynUbufSize=%d, hasAllocUbufSize=%d", task->GetNodeId(), | 153 | SK_LOGE("SIMT kernel lacks ubuf size info, nodeId=%lu, hasDynUbufSize=%d, hasAllocUbufSize=%d", task->GetNodeId(), |
| 153 | kernelInfo.hasDynUbufSize, kernelInfo.hasAllocUbufSize); | 154 | kernelInfo.hasDynUbufSize, kernelInfo.hasAllocUbufSize); |
| 154 | - availableUbufInfo.success = false; | 155 | + dcacheSizeResult.isValid = false; |
| 155 | - return availableUbufInfo; | 156 | + return dcacheSizeResult; |
| 156 | } | 157 | } |
| 157 | if (kernelInfo.dynUbufSize > SK_TOTAL_UB_SIZE || | 158 | if (kernelInfo.dynUbufSize > SK_TOTAL_UB_SIZE || |
| 158 | kernelInfo.allocUbufSize > SK_TOTAL_UB_SIZE - kernelInfo.dynUbufSize) { | 159 | kernelInfo.allocUbufSize > SK_TOTAL_UB_SIZE - kernelInfo.dynUbufSize) { |
| @@ -160,17 +161,16 @@ SimtAvailableUbufInfo GetMinSimtAvailableUbufSize(const std::vector<SuperKernelB | |||
| 160 | "SIMT kernel ubuf size exceeds total ub size, nodeId=%lu, dynUbufSize=%zu, " | 161 | "SIMT kernel ubuf size exceeds total ub size, nodeId=%lu, dynUbufSize=%zu, " |
| 161 | "allocUbufSize=%zu, totalUbSize=%zu", | 162 | "allocUbufSize=%zu, totalUbSize=%zu", |
| 162 | task->GetNodeId(), kernelInfo.dynUbufSize, kernelInfo.allocUbufSize, SK_TOTAL_UB_SIZE); | 163 | task->GetNodeId(), kernelInfo.dynUbufSize, kernelInfo.allocUbufSize, SK_TOTAL_UB_SIZE); |
| 163 | - availableUbufInfo.success = false; | 164 | + dcacheSizeResult.isValid = false; |
| 164 | - return availableUbufInfo; | 165 | + return dcacheSizeResult; |
| 165 | } | 166 | } |
| 166 | - availableUbufInfo.hasMinAvailableUbufSize = true; | 167 | + size_t taskMaxDcacheSize = SK_TOTAL_UB_SIZE - kernelInfo.dynUbufSize - kernelInfo.allocUbufSize; |
| 167 | - minAvailableUbufSize = | 168 | + skMaxDcacheSize = std::min(skMaxDcacheSize, taskMaxDcacheSize); |
S | |||
| 168 | - std::min(minAvailableUbufSize, SK_TOTAL_UB_SIZE - kernelInfo.dynUbufSize - kernelInfo.allocUbufSize); | ||
| 169 | } | 169 | } |
| 170 | - if (availableUbufInfo.hasMinAvailableUbufSize) { | 170 | + if (dcacheSizeResult.hasSimtTask) { |
| 171 | - availableUbufInfo.minAvailableUbufSize = minAvailableUbufSize; | 171 | + dcacheSizeResult.skMaxDcacheSize = skMaxDcacheSize; |
| 172 | } | 172 | } |
| 173 | - return availableUbufInfo; | 173 | + return dcacheSizeResult; |
| 174 | } | 174 | } |
| 175 | 175 | ||
| 176 | bool MatchKernelOption(const SuperKernelOptionsManager &opts, const std::vector<std::string> &kernelList, | 176 | bool MatchKernelOption(const SuperKernelOptionsManager &opts, const std::vector<std::string> &kernelList, |
| @@ -2412,8 +2412,7 @@ SkBuildResult SkTaskBuilder::Build(std::string skFuncName, const std::vector<Sup | |||
| 2412 | splitBinCount = splitOptions->GetIntValue(); | 2412 | splitBinCount = splitOptions->GetIntValue(); |
| 2413 | } | 2413 | } |
| 2414 | 2414 | ||
| 2415 | - auto *mixSplitOpt = opts.GetOption(SkInnerOptionType::ENABLE_MIX_KERNEL_SPLIT); | 2415 | + if (opts.IsInnerOptionEnabled(SkInnerOptionType::MIX_KERNEL_SPLIT)) { |
| 2416 | - if (mixSplitOpt != nullptr && mixSplitOpt->GetIntValue() == 1) { | ||
| 2417 | if (!PrecomputeSyncRelationsByMixGroups(tasks)) { | 2416 | if (!PrecomputeSyncRelationsByMixGroups(tasks)) { |
| 2418 | SK_LOGE("Build failed: precompute sync relations with mix kernel split failed"); | 2417 | SK_LOGE("Build failed: precompute sync relations with mix kernel split failed"); |
| 2419 | return {}; | 2418 | return {}; |
| @@ -2644,16 +2643,15 @@ SkBuildResult SkTaskBuilder::Build(std::string skFuncName, const std::vector<Sup | |||
| 2644 | } | 2643 | } |
| 2645 | 2644 | ||
| 2646 | bool useSimtEntry = false; | 2645 | bool useSimtEntry = false; |
| 2647 | - size_t minAvailableUbufSize = 0; | 2646 | + size_t skMaxDcacheSize = 0; |
| 2648 | - const auto *setDynUbufSizeOpt = opts.GetOption(SkInnerOptionType::ENABLE_SET_DYN_UBUF_SIZE); | 2647 | + if (opts.IsInnerOptionEnabled(SkInnerOptionType::SIMT_OP_SUPPORT)) { |
| 2649 | - if (setDynUbufSizeOpt != nullptr && setDynUbufSizeOpt->GetIntValue() == 1) { | 2648 | + const SimtDcacheSizeResult dcacheSizeResult = CalculateSimtDcacheSize(tasks); |
| 2650 | - const SimtAvailableUbufInfo availableUbufInfo = GetMinSimtAvailableUbufSize(tasks); | 2649 | + if (!dcacheSizeResult.isValid) { |
| 2651 | - if (!availableUbufInfo.success) { | 2650 | + SK_LOGE("Build failed: SIMT ubuf size validation failed"); |
| 2652 | - SK_LOGE("Build failed: get SIMT min available ubuf size failed"); | ||
| 2653 | return {}; | 2651 | return {}; |
| 2654 | } | 2652 | } |
| 2655 | - useSimtEntry = availableUbufInfo.hasMinAvailableUbufSize; | 2653 | + useSimtEntry = dcacheSizeResult.hasSimtTask; |
| 2656 | - minAvailableUbufSize = availableUbufInfo.minAvailableUbufSize; | 2654 | + skMaxDcacheSize = dcacheSizeResult.skMaxDcacheSize; |
| 2657 | } | 2655 | } |
| 2658 | 2656 | ||
| 2659 | SK_LOGI("Get entry info..."); | 2657 | SK_LOGI("Get entry info..."); |
| @@ -2677,11 +2675,8 @@ SkBuildResult SkTaskBuilder::Build(std::string skFuncName, const std::vector<Sup | |||
| 2677 | launchInfo.entryInfo = std::move(entryInfo); | 2675 | launchInfo.entryInfo = std::move(entryInfo); |
| 2678 | launchInfo.devArgs = std::move(devArgs); | 2676 | launchInfo.devArgs = std::move(devArgs); |
| 2679 | launchInfo.skFuncName = skFuncName; | 2677 | launchInfo.skFuncName = skFuncName; |
| 2680 | - launchInfo.hasMinAvailableUbufSize = useSimtEntry; | 2678 | + launchInfo.useSimtEntry = useSimtEntry; |
| 2681 | - launchInfo.minAvailableUbufSize = minAvailableUbufSize; | 2679 | + launchInfo.skMaxDcacheSize = skMaxDcacheSize; |
| 2682 | - if (useSimtEntry) { | ||
| 2683 | - SK_LOGI("Build launch info with SIMT min available ubuf size, minAvailableUbufSize=%zu", minAvailableUbufSize); | ||
| 2684 | - } | ||
| 2685 | 2680 | ||
| 2686 | // Generate task queue JSON for aggregation | 2681 | // Generate task queue JSON for aggregation |
| 2687 | SK_LOGI("SkTaskToQueueJson: generating task queue JSON for scopeId=%u", scopeId); | 2682 | SK_LOGI("SkTaskToQueueJson: generating task queue JSON for scopeId=%u", scopeId); |
| @@ -212,7 +212,7 @@ struct SkTask { | |||
| 212 | return sizeof(TaskQue) + queue->taskCnt * sizeof(TaskInfo); | 212 | return sizeof(TaskQue) + queue->taskCnt * sizeof(TaskInfo); |
| 213 | } | 213 | } |
| 214 | 214 | ||
| 215 | - SkTask() : numBlocks(0), funcCnt(0){}; | 215 | + SkTask() : numBlocks(0), funcCnt(0) {}; |
| 216 | SkTask(const SkTask &) = delete; | 216 | SkTask(const SkTask &) = delete; |
| 217 | SkTask &operator=(const SkTask &) = delete; | 217 | SkTask &operator=(const SkTask &) = delete; |
| 218 | SkTask(SkTask &&) = default; | 218 | SkTask(SkTask &&) = default; |
| @@ -258,11 +258,11 @@ struct SkHostEntryInfo { | |||
| 258 | struct CacheopInfoBasic { | 258 | struct CacheopInfoBasic { |
| 259 | uint32_t taskType; // 算子的任务类型 | 259 | uint32_t taskType; // 算子的任务类型 |
| 260 | uint32_t numBlocks; // blockdim | 260 | uint32_t numBlocks; // blockdim |
| 261 | - uint64_t nodeId; //算子名的hashid | 261 | + uint64_t nodeId; // 算子名的hashid |
| 262 | - uint64_t opType; //算子类型的hashid | 262 | + uint64_t opType; // 算子类型的hashid |
| 263 | uint64_t attrId{0}; // 本次attr拼接放这里 | 263 | uint64_t attrId{0}; // 本次attr拼接放这里 |
| 264 | uint64_t reserve2{0}; // 不做处理 | 264 | uint64_t reserve2{0}; // 不做处理 |
| 265 | - uint32_t opFlag; //记录op属性标记的bitmap,bit0代表是否使能了HF32 | 265 | + uint32_t opFlag; // 记录op属性标记的bitmap,bit0代表是否使能了HF32 |
| 266 | uint32_t tensorNum; // tensor个数 | 266 | uint32_t tensorNum; // tensor个数 |
| 267 | MsrofTensorData tensorData[0]; | 267 | MsrofTensorData tensorData[0]; |
| 268 | }; | 268 | }; |
| @@ -273,8 +273,8 @@ struct SkLaunchInfo { | |||
| 273 | void * | 273 | void * |
| 274 | cacheInfo; // sk融合算子的shape信息,由sk_optimizer.cpp在构建launchInfo时填充,实际类型是CacheopInfoBasic,包含一个可变长度的tensorData数组 | 274 | cacheInfo; // sk融合算子的shape信息,由sk_optimizer.cpp在构建launchInfo时填充,实际类型是CacheopInfoBasic,包含一个可变长度的tensorData数组 |
| 275 | size_t cacheopInfoSize; | 275 | size_t cacheopInfoSize; |
| 276 | - size_t minAvailableUbufSize = 0; | 276 | + size_t skMaxDcacheSize = 0; // 所有 SIMT 子任务共同允许的最大 DCache 大小 |
| 277 | - bool hasMinAvailableUbufSize = false; | 277 | + bool useSimtEntry = false; // 是否选择 SIMT entry 并配置对应的动态 UBUF |
| 278 | void *eventGmAddr; // 事件记录 GM 地址 | 278 | void *eventGmAddr; // 事件记录 GM 地址 |
| 279 | uint64_t modelIdIndex{0}; // modelId index registered on host | 279 | uint64_t modelIdIndex{0}; // modelId index registered on host |
| 280 | uint32_t skId; // SK 标识 | 280 | uint32_t skId; // SK 标识 |
| @@ -47,6 +47,10 @@ std::unique_ptr<aclmdlRITask> MakeTaskHandle(TestRITask &task) { | |||
| 47 | return std::make_unique<aclmdlRITask>(reinterpret_cast<aclmdlRITask>(&task)); | 47 | return std::make_unique<aclmdlRITask>(reinterpret_cast<aclmdlRITask>(&task)); |
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | +void SetSimtOpSupportCapability(SuperKernelOptionsManager &options, uint32_t value) { | ||
| 51 | + options.innerOptionMap[SkInnerOptionType::SIMT_OP_SUPPORT]->SetValue(value); | ||
| 52 | +} | ||
| 53 | + | ||
| 50 | } // namespace | 54 | } // namespace |
| 51 | 55 | ||
| 52 | class SkNodeTest : public testing::Test { | 56 | class SkNodeTest : public testing::Test { |
| @@ -624,6 +628,9 @@ TEST_F(SkNodeTest, KernelUpdate_LaunchInfoDynUbufAppendsLaunchCfg) { | |||
| 624 | task.params.type = ACL_MODEL_RI_TASK_KERNEL; | 628 | task.params.type = ACL_MODEL_RI_TASK_KERNEL; |
| 625 | task.params.kernelTaskParams.funcHandle = reinterpret_cast<aclrtFuncHandle>(0x3018); | 629 | task.params.kernelTaskParams.funcHandle = reinterpret_cast<aclrtFuncHandle>(0x3018); |
| 626 | task.params.kernelTaskParams.numBlocks = 1; | 630 | task.params.kernelTaskParams.numBlocks = 1; |
| 631 | + task.params.reserved0[0] = 0x12; | ||
| 632 | + task.params.reserved1[0] = 0x34; | ||
| 633 | + task.params.kernelTaskParams.rsv[0] = 0x56; | ||
| 627 | 634 | ||
| 628 | aclrtLaunchKernelAttr originAttr{}; | 635 | aclrtLaunchKernelAttr originAttr{}; |
| 629 | originAttr.id = ACL_RT_LAUNCH_KERNEL_ATTR_SCHEM_MODE; | 636 | originAttr.id = ACL_RT_LAUNCH_KERNEL_ATTR_SCHEM_MODE; |
| @@ -644,22 +651,33 @@ TEST_F(SkNodeTest, KernelUpdate_LaunchInfoDynUbufAppendsLaunchCfg) { | |||
| 644 | launchInfo.entryInfo.numBlocks = 2; | 651 | launchInfo.entryInfo.numBlocks = 2; |
| 645 | ASSERT_TRUE(launchInfo.devArgs.Init(sizeof(SkDeviceEntryArgs))); | 652 | ASSERT_TRUE(launchInfo.devArgs.Init(sizeof(SkDeviceEntryArgs))); |
| 646 | launchInfo.devArgs.Get()->skHeader.totalSize = sizeof(SkDeviceEntryArgs); | 653 | launchInfo.devArgs.Get()->skHeader.totalSize = sizeof(SkDeviceEntryArgs); |
| 647 | - launchInfo.hasMinAvailableUbufSize = true; | 654 | + launchInfo.useSimtEntry = true; |
| 648 | - launchInfo.minAvailableUbufSize = 32768; | 655 | + launchInfo.skMaxDcacheSize = 32768; |
| 649 | SetFunctionAllocUbufSize(4096); | 656 | SetFunctionAllocUbufSize(4096); |
| 650 | 657 | ||
| 658 | + std::vector<aclrtLaunchKernelAttr> launchKernelAttrs; | ||
| 659 | + aclrtLaunchKernelCfg launchKernelCfg{}; | ||
| 660 | + ASSERT_TRUE(node.SetupLaunchKernelCfg(task.params.kernelTaskParams.funcHandle, launchInfo.skMaxDcacheSize, | ||
| 661 | + launchKernelAttrs, launchKernelCfg)); | ||
| 662 | + ASSERT_EQ(launchKernelCfg.numAttrs, 2U); | ||
| 663 | + ASSERT_NE(launchKernelCfg.attrs, nullptr); | ||
| 664 | + EXPECT_EQ(launchKernelCfg.attrs[0].id, ACL_RT_LAUNCH_KERNEL_ATTR_SCHEM_MODE); | ||
| 665 | + EXPECT_EQ(launchKernelCfg.attrs[0].value.schemMode, 1U); | ||
| 666 | + EXPECT_EQ(launchKernelCfg.attrs[1].id, ACL_RT_LAUNCH_KERNEL_ATTR_DYN_UBUF_SIZE); | ||
| 667 | + EXPECT_EQ(launchKernelCfg.attrs[1].value.dynUBufSize, SK_TOTAL_UB_SIZE - 32768U - 4096U); | ||
| 668 | + | ||
| 651 | UpdateContext ctx{}; | 669 | UpdateContext ctx{}; |
| 652 | ctx.launchInfo = &launchInfo; | 670 | ctx.launchInfo = &launchInfo; |
| 653 | EXPECT_TRUE(node.Update(ctx)); | 671 | EXPECT_TRUE(node.Update(ctx)); |
| 654 | 672 | ||
| 655 | const auto ¶ms = node.GetTaskParams(); | 673 | const auto ¶ms = node.GetTaskParams(); |
| 656 | - ASSERT_NE(params.kernelTaskParams.cfg, nullptr); | 674 | + EXPECT_EQ(params.kernelTaskParams.cfg, &originCfg); |
| 657 | - ASSERT_EQ(params.kernelTaskParams.cfg->numAttrs, 2U); | 675 | + EXPECT_EQ(params.reserved0[0], 0x12U); |
| 658 | - ASSERT_NE(params.kernelTaskParams.cfg->attrs, nullptr); | 676 | + EXPECT_EQ(params.reserved1[0], 0x34U); |
| 659 | - EXPECT_EQ(params.kernelTaskParams.cfg->attrs[0].id, ACL_RT_LAUNCH_KERNEL_ATTR_SCHEM_MODE); | 677 | + EXPECT_EQ(params.kernelTaskParams.rsv[0], 0x56U); |
| 660 | - EXPECT_EQ(params.kernelTaskParams.cfg->attrs[0].value.schemMode, 1U); | 678 | + EXPECT_EQ(task.params.reserved0[0], 0x12U); |
| 661 | - EXPECT_EQ(params.kernelTaskParams.cfg->attrs[1].id, ACL_RT_LAUNCH_KERNEL_ATTR_DYN_UBUF_SIZE); | 679 | + EXPECT_EQ(task.params.reserved1[0], 0x34U); |
| 662 | - EXPECT_EQ(params.kernelTaskParams.cfg->attrs[1].value.dynUBufSize, SK_TOTAL_UB_SIZE - 32768U - 4096U); | 680 | + EXPECT_EQ(task.params.kernelTaskParams.rsv[0], 0x56U); |
| 663 | } | 681 | } |
| 664 | 682 | ||
| 665 | TEST_F(SkNodeTest, MemoryUpdate_CustomParamsSyncTaskParamsForDump) { | 683 | TEST_F(SkNodeTest, MemoryUpdate_CustomParamsSyncTaskParamsForDump) { |
| @@ -1998,7 +2016,7 @@ aclError FakeAclrtGetFunctionAttributeMix12(aclrtFuncHandle funcHandle, aclrtFun | |||
| 1998 | return ACL_SUCCESS; | 2016 | return ACL_SUCCESS; |
| 1999 | } | 2017 | } |
| 2000 | 2018 | ||
| 2001 | -TEST_F(SkNodeTest, IdentifyAndHandleSimtKernel_NullOpts_SkipCheck) { | 2019 | +TEST_F(SkNodeTest, IdentifyAndHandleSimtKernel_NullOptions_SkipCheck) { |
| 2002 | UtSkNodeRITaskInternal task{}; | 2020 | UtSkNodeRITaskInternal task{}; |
| 2003 | task.taskId = 2001; | 2021 | task.taskId = 2001; |
| 2004 | task.type = ACL_MODEL_RI_TASK_KERNEL; | 2022 | task.type = ACL_MODEL_RI_TASK_KERNEL; |
| @@ -2015,7 +2033,7 @@ TEST_F(SkNodeTest, IdentifyAndHandleSimtKernel_NullOpts_SkipCheck) { | |||
| 2015 | EXPECT_FALSE(node.nodeInfos.kernelInfos.isSimtOp); | 2033 | EXPECT_FALSE(node.nodeInfos.kernelInfos.isSimtOp); |
| 2016 | } | 2034 | } |
| 2017 | 2035 | ||
| 2018 | -TEST_F(SkNodeTest, IdentifyAndHandleSimtKernel_SimtCheckDisabled_SkipCheck) { | 2036 | +TEST_F(SkNodeTest, IdentifyAndHandleSimtKernel_SimtOpSupportDisabled_SkipAnalysis) { |
| 2019 | UtSkNodeRITaskInternal task{}; | 2037 | UtSkNodeRITaskInternal task{}; |
| 2020 | task.taskId = 2002; | 2038 | task.taskId = 2002; |
| 2021 | task.type = ACL_MODEL_RI_TASK_KERNEL; | 2039 | task.type = ACL_MODEL_RI_TASK_KERNEL; |
| @@ -2025,9 +2043,7 @@ TEST_F(SkNodeTest, IdentifyAndHandleSimtKernel_SimtCheckDisabled_SkipCheck) { | |||
| 2025 | 2043 | ||
| 2026 | SuperKernelOptionsManager opts; | 2044 | SuperKernelOptionsManager opts; |
| 2027 | opts.RegisterDefaultOptions(); | 2045 | opts.RegisterDefaultOptions(); |
| 2028 | - auto *simtOpt = opts.GetOption(SkInnerOptionType::ENABLE_SIMT_OP_CHECK); | 2046 | + SetSimtOpSupportCapability(opts, 0); |
| 2029 | - ASSERT_NE(simtOpt, nullptr); | ||
| 2030 | - simtOpt->SetValue(0); | ||
| 2031 | 2047 | ||
| 2032 | MOCKER(aclrtGetFunctionName).stubs().will(invoke(FakeAclrtGetFunctionNameRegular)); | 2048 | MOCKER(aclrtGetFunctionName).stubs().will(invoke(FakeAclrtGetFunctionNameRegular)); |
| 2033 | MOCKER(aclrtGetFunctionAttribute).stubs().will(invoke(FakeAclrtGetFunctionAttributeAivOnly)); | 2049 | MOCKER(aclrtGetFunctionAttribute).stubs().will(invoke(FakeAclrtGetFunctionAttributeAivOnly)); |
| @@ -2048,10 +2064,7 @@ TEST_F(SkNodeTest, IdentifyAndHandleSimtKernel_AicOnly_SkipCheck) { | |||
| 2048 | 2064 | ||
| 2049 | SuperKernelOptionsManager opts; | 2065 | SuperKernelOptionsManager opts; |
| 2050 | opts.RegisterDefaultOptions(); | 2066 | opts.RegisterDefaultOptions(); |
| 2051 | - auto *simtOpt = opts.GetOption(SkInnerOptionType::ENABLE_SIMT_OP_CHECK); | 2067 | + SetSimtOpSupportCapability(opts, 1); |
| 2052 | - ASSERT_NE(simtOpt, nullptr); | ||
| 2053 | - simtOpt->SetValue(1); | ||
| 2054 | - | ||
| 2055 | MOCKER(aclrtGetFunctionName).stubs().will(invoke(FakeAclrtGetFunctionNameRegular)); | 2068 | MOCKER(aclrtGetFunctionName).stubs().will(invoke(FakeAclrtGetFunctionNameRegular)); |
| 2056 | MOCKER(aclrtGetFunctionAttribute).stubs().will(invoke(FakeAclrtGetFunctionAttributeAicOnly)); | 2069 | MOCKER(aclrtGetFunctionAttribute).stubs().will(invoke(FakeAclrtGetFunctionAttributeAicOnly)); |
| 2057 | MOCKER(aclrtFunctionGetBinary).stubs().will(invoke(FakeAclrtFunctionGetBinaryNonNull)); | 2070 | MOCKER(aclrtFunctionGetBinary).stubs().will(invoke(FakeAclrtFunctionGetBinaryNonNull)); |
| @@ -2072,10 +2085,7 @@ TEST_F(SkNodeTest, IdentifyAndHandleSimtKernel_MixAic10_SkipCheck) { | |||
| 2072 | 2085 | ||
| 2073 | SuperKernelOptionsManager opts; | 2086 | SuperKernelOptionsManager opts; |
| 2074 | opts.RegisterDefaultOptions(); | 2087 | opts.RegisterDefaultOptions(); |
| 2075 | - auto *simtOpt = opts.GetOption(SkInnerOptionType::ENABLE_SIMT_OP_CHECK); | 2088 | + SetSimtOpSupportCapability(opts, 1); |
| 2076 | - ASSERT_NE(simtOpt, nullptr); | ||
| 2077 | - simtOpt->SetValue(1); | ||
| 2078 | - | ||
| 2079 | MOCKER(aclrtGetFunctionName).stubs().will(invoke(FakeAclrtGetFunctionNameRegular)); | 2089 | MOCKER(aclrtGetFunctionName).stubs().will(invoke(FakeAclrtGetFunctionNameRegular)); |
| 2080 | MOCKER(aclrtGetFunctionAttribute).stubs().will(invoke(FakeAclrtGetFunctionAttributeMixAic10)); | 2090 | MOCKER(aclrtGetFunctionAttribute).stubs().will(invoke(FakeAclrtGetFunctionAttributeMixAic10)); |
| 2081 | MOCKER(aclrtFunctionGetBinary).stubs().will(invoke(FakeAclrtFunctionGetBinaryNonNull)); | 2091 | MOCKER(aclrtFunctionGetBinary).stubs().will(invoke(FakeAclrtFunctionGetBinaryNonNull)); |
| @@ -2096,10 +2106,7 @@ TEST_F(SkNodeTest, IdentifyAndHandleSimtKernel_AivOnly_NotSimtType) { | |||
| 2096 | 2106 | ||
| 2097 | SuperKernelOptionsManager opts; | 2107 | SuperKernelOptionsManager opts; |
| 2098 | opts.RegisterDefaultOptions(); | 2108 | opts.RegisterDefaultOptions(); |
| 2099 | - auto *simtOpt = opts.GetOption(SkInnerOptionType::ENABLE_SIMT_OP_CHECK); | 2109 | + SetSimtOpSupportCapability(opts, 1); |
| 2100 | - ASSERT_NE(simtOpt, nullptr); | ||
| 2101 | - simtOpt->SetValue(1); | ||
| 2102 | - | ||
| 2103 | SetSimtAivType(0); | 2110 | SetSimtAivType(0); |
| 2104 | 2111 | ||
| 2105 | MOCKER(aclrtGetFunctionName).stubs().will(invoke(FakeAclrtGetFunctionNameRegular)); | 2112 | MOCKER(aclrtGetFunctionName).stubs().will(invoke(FakeAclrtGetFunctionNameRegular)); |
| @@ -2122,10 +2129,7 @@ TEST_F(SkNodeTest, IdentifyAndHandleSimtKernel_AivOnly_SimtType3) { | |||
| 2122 | 2129 | ||
| 2123 | SuperKernelOptionsManager opts; | 2130 | SuperKernelOptionsManager opts; |
| 2124 | opts.RegisterDefaultOptions(); | 2131 | opts.RegisterDefaultOptions(); |
| 2125 | - auto *simtOpt = opts.GetOption(SkInnerOptionType::ENABLE_SIMT_OP_CHECK); | 2132 | + SetSimtOpSupportCapability(opts, 1); |
| 2126 | - ASSERT_NE(simtOpt, nullptr); | ||
| 2127 | - simtOpt->SetValue(1); | ||
| 2128 | - | ||
| 2129 | SetSimtAivType(3); | 2133 | SetSimtAivType(3); |
| 2130 | SkUtSetAclrtFunctionAvailDynUbufSize(4096); | 2134 | SkUtSetAclrtFunctionAvailDynUbufSize(4096); |
| 2131 | SetFunctionAllocUbufSize(1024); | 2135 | SetFunctionAllocUbufSize(1024); |
| @@ -2161,10 +2165,7 @@ TEST_F(SkNodeTest, IdentifyAndHandleSimtKernel_AivOnly_SimtType4) { | |||
| 2161 | 2165 | ||
| 2162 | SuperKernelOptionsManager opts; | 2166 | SuperKernelOptionsManager opts; |
| 2163 | opts.RegisterDefaultOptions(); | 2167 | opts.RegisterDefaultOptions(); |
| 2164 | - auto *simtOpt = opts.GetOption(SkInnerOptionType::ENABLE_SIMT_OP_CHECK); | 2168 | + SetSimtOpSupportCapability(opts, 1); |
| 2165 | - ASSERT_NE(simtOpt, nullptr); | ||
| 2166 | - simtOpt->SetValue(1); | ||
| 2167 | - | ||
| 2168 | SetSimtAivType(4); | 2169 | SetSimtAivType(4); |
| 2169 | SkUtSetAclrtFunctionAvailDynUbufSize(8192); | 2170 | SkUtSetAclrtFunctionAvailDynUbufSize(8192); |
| 2170 | SetFunctionAllocUbufSize(2048); | 2171 | SetFunctionAllocUbufSize(2048); |
| @@ -2200,10 +2201,7 @@ TEST_F(SkNodeTest, IdentifyAndHandleSimtKernel_Mix11_SimtType) { | |||
| 2200 | 2201 | ||
| 2201 | SuperKernelOptionsManager opts; | 2202 | SuperKernelOptionsManager opts; |
| 2202 | opts.RegisterDefaultOptions(); | 2203 | opts.RegisterDefaultOptions(); |
| 2203 | - auto *simtOpt = opts.GetOption(SkInnerOptionType::ENABLE_SIMT_OP_CHECK); | 2204 | + SetSimtOpSupportCapability(opts, 1); |
| 2204 | - ASSERT_NE(simtOpt, nullptr); | ||
| 2205 | - simtOpt->SetValue(1); | ||
| 2206 | - | ||
| 2207 | SetSimtAivType(3); | 2205 | SetSimtAivType(3); |
| 2208 | SkUtSetAclrtFunctionAvailDynUbufSize(12288); | 2206 | SkUtSetAclrtFunctionAvailDynUbufSize(12288); |
| 2209 | SetFunctionAllocUbufSize(4096); | 2207 | SetFunctionAllocUbufSize(4096); |
| @@ -2239,10 +2237,7 @@ TEST_F(SkNodeTest, IdentifyAndHandleSimtKernel_Mix12_SimtType) { | |||
| 2239 | 2237 | ||
| 2240 | SuperKernelOptionsManager opts; | 2238 | SuperKernelOptionsManager opts; |
| 2241 | opts.RegisterDefaultOptions(); | 2239 | opts.RegisterDefaultOptions(); |
| 2242 | - auto *simtOpt = opts.GetOption(SkInnerOptionType::ENABLE_SIMT_OP_CHECK); | 2240 | + SetSimtOpSupportCapability(opts, 1); |
| 2243 | - ASSERT_NE(simtOpt, nullptr); | ||
| 2244 | - simtOpt->SetValue(1); | ||
| 2245 | - | ||
| 2246 | SetSimtAivType(4); | 2241 | SetSimtAivType(4); |
| 2247 | SkUtSetAclrtFunctionAvailDynUbufSize(16384); | 2242 | SkUtSetAclrtFunctionAvailDynUbufSize(16384); |
| 2248 | SetFunctionAllocUbufSize(8192); | 2243 | SetFunctionAllocUbufSize(8192); |
| @@ -2278,10 +2273,7 @@ TEST_F(SkNodeTest, IdentifyAndHandleSimtKernel_DynUbufQueryFailed) { | |||
| 2278 | 2273 | ||
| 2279 | SuperKernelOptionsManager opts; | 2274 | SuperKernelOptionsManager opts; |
| 2280 | opts.RegisterDefaultOptions(); | 2275 | opts.RegisterDefaultOptions(); |
| 2281 | - auto *simtOpt = opts.GetOption(SkInnerOptionType::ENABLE_SIMT_OP_CHECK); | 2276 | + SetSimtOpSupportCapability(opts, 1); |
| 2282 | - ASSERT_NE(simtOpt, nullptr); | ||
| 2283 | - simtOpt->SetValue(1); | ||
| 2284 | - | ||
| 2285 | SetSimtAivType(3); | 2277 | SetSimtAivType(3); |
| 2286 | SkUtSetAclrtFunctionGetAvailDynUbufPerBlockRet(ACL_ERROR_FAILURE); | 2278 | SkUtSetAclrtFunctionGetAvailDynUbufPerBlockRet(ACL_ERROR_FAILURE); |
| 2287 | 2279 | ||
| @@ -2307,10 +2299,7 @@ TEST_F(SkNodeTest, IdentifyAndHandleSimtKernel_AllocUbufQueryFailed) { | |||
| 2307 | 2299 | ||
| 2308 | SuperKernelOptionsManager opts; | 2300 | SuperKernelOptionsManager opts; |
| 2309 | opts.RegisterDefaultOptions(); | 2301 | opts.RegisterDefaultOptions(); |
| 2310 | - auto *simtOpt = opts.GetOption(SkInnerOptionType::ENABLE_SIMT_OP_CHECK); | 2302 | + SetSimtOpSupportCapability(opts, 1); |
| 2311 | - ASSERT_NE(simtOpt, nullptr); | ||
| 2312 | - simtOpt->SetValue(1); | ||
| 2313 | - | ||
| 2314 | SetSimtAivType(3); | 2303 | SetSimtAivType(3); |
| 2315 | SkUtSetAclrtFunctionAvailDynUbufSize(4096); | 2304 | SkUtSetAclrtFunctionAvailDynUbufSize(4096); |
| 2316 | SetRtFunctionGetMetaInfoRet(-1); | 2305 | SetRtFunctionGetMetaInfoRet(-1); |
| @@ -41,6 +41,16 @@ class SuperKernelOptionsManagerTest : public testing::Test { | |||
| 41 | std::unique_ptr<SuperKernelOptionsManager> opts_test; | 41 | std::unique_ptr<SuperKernelOptionsManager> opts_test; |
| 42 | }; | 42 | }; |
| 43 | 43 | ||
| 44 | +namespace { | ||
| 45 | +SkKernelArch FakeGetCurrentSkKernelArchDav3510() { | ||
| 46 | + return SkKernelArch::DAV_3510; | ||
| 47 | +} | ||
| 48 | + | ||
| 49 | +SkKernelArch FakeGetCurrentSkKernelArchDav2201() { | ||
| 50 | + return SkKernelArch::DAV_2201; | ||
| 51 | +} | ||
| 52 | +} // namespace | ||
| 53 | + | ||
| 44 | // ==================== OptOptionBase 基类测试 ==================== | 54 | // ==================== OptOptionBase 基类测试 ==================== |
| 45 | 55 | ||
| 46 | TEST_F(SuperKernelOptionsManagerTest, OptOptionBase_GetName) { | 56 | TEST_F(SuperKernelOptionsManagerTest, OptOptionBase_GetName) { |
| @@ -1409,129 +1419,31 @@ TEST_F(SuperKernelOptionsManagerTest, ToJson_UbufLockIgnoreKernelNullKernelList) | |||
| 1409 | EXPECT_TRUE(json["ubuf_lock_ignore_kernel"]["value"].empty()); | 1419 | EXPECT_TRUE(json["ubuf_lock_ignore_kernel"]["value"].empty()); |
| 1410 | } | 1420 | } |
| 1411 | 1421 | ||
| 1412 | -TEST_F(SuperKernelOptionsManagerTest, GetInnerOption_EnableMixKernelSplit) { | 1422 | +TEST_F(SuperKernelOptionsManagerTest, InnerOptions_Dav2201Disabled) { |
| 1423 | + MOCKER(GetCurrentSkKernelArch).stubs().will(invoke(FakeGetCurrentSkKernelArchDav2201)); | ||
| 1413 | opts_test->RegisterDefaultOptions(); | 1424 | opts_test->RegisterDefaultOptions(); |
| 1414 | - auto *opt = opts_test->GetOption(SkInnerOptionType::ENABLE_MIX_KERNEL_SPLIT); | ||
| 1415 | - ASSERT_NE(opt, nullptr); | ||
| 1416 | - EXPECT_EQ(opt->GetName(), "enable_mix_kernel_split"); | ||
| 1417 | - EXPECT_EQ(opt->GetIntValue(), 0); | ||
| 1418 | -} | ||
| 1419 | 1425 | ||
| 1420 | -TEST_F(SuperKernelOptionsManagerTest, GetInnerOption_EnableSimtOpCheck) { | 1426 | + EXPECT_FALSE(opts_test->IsInnerOptionEnabled(SkInnerOptionType::MIX_KERNEL_SPLIT)); |
| 1421 | - opts_test->RegisterDefaultOptions(); | 1427 | + EXPECT_FALSE(opts_test->IsInnerOptionEnabled(SkInnerOptionType::SIMT_OP_SUPPORT)); |
| 1422 | - auto *opt = opts_test->GetOption(SkInnerOptionType::ENABLE_SIMT_OP_CHECK); | 1428 | + EXPECT_FALSE(opts_test->IsInnerOptionEnabled(static_cast<SkInnerOptionType>(100))); |
| 1423 | - ASSERT_NE(opt, nullptr); | ||
| 1424 | - EXPECT_EQ(opt->GetName(), "enable_simt_op_check"); | ||
| 1425 | - EXPECT_EQ(opt->GetIntValue(), 0); | ||
| 1426 | -} | ||
| 1427 | 1429 | ||
| 1428 | -TEST_F(SuperKernelOptionsManagerTest, GetInnerOption_EnableSetDynUbufSize) { | ||
| 1429 | - opts_test->RegisterDefaultOptions(); | ||
| 1430 | - auto *opt = opts_test->GetOption(SkInnerOptionType::ENABLE_SET_DYN_UBUF_SIZE); | ||
| 1431 | - ASSERT_NE(opt, nullptr); | ||
| 1432 | - EXPECT_EQ(opt->GetName(), "enable_set_dyn_ubuf_size"); | ||
| 1433 | - EXPECT_EQ(opt->GetIntValue(), 0); | ||
| 1434 | -} | ||
| 1435 | - | ||
| 1436 | -TEST_F(SuperKernelOptionsManagerTest, GetInnerOption_InvalidType) { | ||
| 1437 | - opts_test->RegisterDefaultOptions(); | ||
| 1438 | - auto *opt = opts_test->GetOption(static_cast<SkInnerOptionType>(100)); | ||
| 1439 | - EXPECT_EQ(opt, nullptr); | ||
| 1440 | -} | ||
| 1441 | - | ||
| 1442 | -TEST_F(SuperKernelOptionsManagerTest, ToJson_InnerOptionsContent) { | ||
| 1443 | - opts_test->RegisterDefaultOptions(); | ||
| 1444 | nlohmann::ordered_json json = opts_test->ToJson(); | 1430 | nlohmann::ordered_json json = opts_test->ToJson(); |
| 1445 | ASSERT_TRUE(json.contains("inner_options")); | 1431 | ASSERT_TRUE(json.contains("inner_options")); |
| 1446 | - EXPECT_TRUE(json["inner_options"].contains("enable_mix_kernel_split")); | 1432 | + EXPECT_FALSE(json["inner_options"]["mix_kernel_split"]["value"]); |
| 1447 | - EXPECT_TRUE(json["inner_options"].contains("enable_simt_op_check")); | 1433 | + EXPECT_FALSE(json["inner_options"]["simt_op_support"]["value"]); |
| 1448 | - EXPECT_TRUE(json["inner_options"].contains("enable_set_dyn_ubuf_size")); | ||
| 1449 | - EXPECT_EQ(json["inner_options"]["enable_mix_kernel_split"]["value"], 0); | ||
| 1450 | - EXPECT_EQ(json["inner_options"]["enable_simt_op_check"]["value"], 0); | ||
| 1451 | - EXPECT_EQ(json["inner_options"]["enable_set_dyn_ubuf_size"]["value"], 0); | ||
| 1452 | } | 1434 | } |
| 1453 | 1435 | ||
| 1454 | -TEST_F(SuperKernelOptionsManagerTest, ApplySoCSpecificOptions_NonAscend950) { | 1436 | +TEST_F(SuperKernelOptionsManagerTest, InnerOptions_Dav3510Enabled) { |
| 1437 | + MOCKER(GetCurrentSkKernelArch).stubs().will(invoke(FakeGetCurrentSkKernelArchDav3510)); | ||
| 1455 | opts_test->RegisterDefaultOptions(); | 1438 | opts_test->RegisterDefaultOptions(); |
| 1456 | - auto *mixSplitOpt = opts_test->GetOption(SkInnerOptionType::ENABLE_MIX_KERNEL_SPLIT); | ||
| 1457 | - auto *simtCheckOpt = opts_test->GetOption(SkInnerOptionType::ENABLE_SIMT_OP_CHECK); | ||
| 1458 | - auto *setDynUbufSizeOpt = opts_test->GetOption(SkInnerOptionType::ENABLE_SET_DYN_UBUF_SIZE); | ||
| 1459 | - ASSERT_NE(mixSplitOpt, nullptr); | ||
| 1460 | - ASSERT_NE(simtCheckOpt, nullptr); | ||
| 1461 | - ASSERT_NE(setDynUbufSizeOpt, nullptr); | ||
| 1462 | - EXPECT_EQ(mixSplitOpt->GetIntValue(), 0); | ||
| 1463 | - EXPECT_EQ(simtCheckOpt->GetIntValue(), 0); | ||
| 1464 | - EXPECT_EQ(setDynUbufSizeOpt->GetIntValue(), 0); | ||
| 1465 | -} | ||
| 1466 | 1439 | ||
| 1467 | -namespace { | 1440 | + EXPECT_TRUE(opts_test->IsInnerOptionEnabled(SkInnerOptionType::MIX_KERNEL_SPLIT)); |
| 1468 | -const char *FakeSocName_Ascend950ForOptions() { | 1441 | + EXPECT_TRUE(opts_test->IsInnerOptionEnabled(SkInnerOptionType::SIMT_OP_SUPPORT)); |
| 1469 | - return "Ascend950"; | ||
| 1470 | -} | ||
| 1471 | -const char *FakeSocName_Ascend950Variant() { | ||
| 1472 | - return "Ascend950PG"; | ||
| 1473 | -} | ||
| 1474 | - | ||
| 1475 | -void ExpectAscend950OptionsEnabled(const char *(*socNameStub)()) { | ||
| 1476 | - MOCKER(aclrtGetSocName).stubs().will(invoke(socNameStub)); | ||
| 1477 | - InitSkRuntimeConfig(); | ||
| 1478 | - | ||
| 1479 | - SuperKernelOptionsManager opts; | ||
| 1480 | - opts.RegisterDefaultOptions(); | ||
| 1481 | - auto *mixSplitOpt = opts.GetOption(SkInnerOptionType::ENABLE_MIX_KERNEL_SPLIT); | ||
| 1482 | - auto *simtCheckOpt = opts.GetOption(SkInnerOptionType::ENABLE_SIMT_OP_CHECK); | ||
| 1483 | - auto *setDynUbufSizeOpt = opts.GetOption(SkInnerOptionType::ENABLE_SET_DYN_UBUF_SIZE); | ||
| 1484 | - ASSERT_NE(mixSplitOpt, nullptr); | ||
| 1485 | - ASSERT_NE(simtCheckOpt, nullptr); | ||
| 1486 | - ASSERT_NE(setDynUbufSizeOpt, nullptr); | ||
| 1487 | - EXPECT_EQ(mixSplitOpt->GetIntValue(), 1); | ||
| 1488 | - EXPECT_EQ(simtCheckOpt->GetIntValue(), 1); | ||
| 1489 | - EXPECT_EQ(setDynUbufSizeOpt->GetIntValue(), 1); | ||
| 1490 | - | ||
| 1491 | - nlohmann::ordered_json json = opts.ToJson(); | ||
| 1492 | - ASSERT_TRUE(json.contains("inner_options")); | ||
| 1493 | - EXPECT_EQ(json["inner_options"]["enable_mix_kernel_split"]["value"], 1); | ||
| 1494 | - EXPECT_EQ(json["inner_options"]["enable_simt_op_check"]["value"], 1); | ||
| 1495 | - EXPECT_EQ(json["inner_options"]["enable_set_dyn_ubuf_size"]["value"], 1); | ||
| 1496 | -} | ||
| 1497 | - | ||
| 1498 | -void ExitIsolatedOptionsTest() { | ||
| 1499 | - GlobalMockObject::verify(); | ||
| 1500 | - fflush(nullptr); | ||
| 1501 | - _exit(::testing::Test::HasFailure() ? 1 : 0); | ||
| 1502 | -} | ||
| 1503 | -} // namespace | ||
| 1504 | - | ||
| 1505 | -TEST_F(SuperKernelOptionsManagerTest, ApplySoCSpecificOptions_Ascend950EnablesDav3510InnerOptions) { | ||
| 1506 | - ::testing::FLAGS_gtest_death_test_style = "threadsafe"; | ||
| 1507 | - ASSERT_EXIT( | ||
| 1508 | - { | ||
| 1509 | - ExpectAscend950OptionsEnabled(FakeSocName_Ascend950ForOptions); | ||
| 1510 | - ExitIsolatedOptionsTest(); | ||
| 1511 | - }, | ||
| 1512 | - ::testing::ExitedWithCode(0), ""); | ||
| 1513 | -} | ||
| 1514 | - | ||
| 1515 | -TEST_F(SuperKernelOptionsManagerTest, ApplySoCSpecificOptions_Ascend950SuffixVariantStillEnables) { | ||
| 1516 | - // 防回归:未来如果 GetSocName 返回带后缀的 "Ascend950XXX",仍应命中 | ||
| 1517 | - ::testing::FLAGS_gtest_death_test_style = "threadsafe"; | ||
| 1518 | - ASSERT_EXIT( | ||
| 1519 | - { | ||
| 1520 | - ExpectAscend950OptionsEnabled(FakeSocName_Ascend950Variant); | ||
| 1521 | - ExitIsolatedOptionsTest(); | ||
| 1522 | - }, | ||
| 1523 | - ::testing::ExitedWithCode(0), ""); | ||
| 1524 | -} | ||
| 1525 | - | ||
| 1526 | -TEST_F(SuperKernelOptionsManagerTest, SetInnerOptionValue) { | ||
| 1527 | - opts_test->RegisterDefaultOptions(); | ||
| 1528 | - auto *opt = opts_test->GetOption(SkInnerOptionType::ENABLE_MIX_KERNEL_SPLIT); | ||
| 1529 | - ASSERT_NE(opt, nullptr); | ||
| 1530 | - opt->SetValue(1); | ||
| 1531 | - EXPECT_EQ(opt->GetIntValue(), 1); | ||
| 1532 | 1442 | ||
| 1533 | nlohmann::ordered_json json = opts_test->ToJson(); | 1443 | nlohmann::ordered_json json = opts_test->ToJson(); |
| 1534 | - EXPECT_EQ(json["inner_options"]["enable_mix_kernel_split"]["value"], 1); | 1444 | + ASSERT_TRUE(json.contains("inner_options")); |
| 1445 | + EXPECT_TRUE(json["inner_options"]["mix_kernel_split"]["value"]); | ||
| 1446 | + EXPECT_TRUE(json["inner_options"]["simt_op_support"]["value"]); | ||
| 1535 | } | 1447 | } |
| 1536 | 1448 | ||
| 1537 | // ==================== SetOptOptionValue: DEBUG_PER_OP_MAX_CORE_NUM 测试 ==================== | 1449 | // ==================== SetOptOptionValue: DEBUG_PER_OP_MAX_CORE_NUM 测试 ==================== |
| @@ -1,6 +1,6 @@ | |||
| 1 | /** | 1 | /** |
| 2 | * Copyright (c) 2025 Huawei Technologies Co., Ltd. | 2 | * Copyright (c) 2025 Huawei Technologies Co., Ltd. |
| 3 | - * This program is free software, you can redistribute it and/or modify it under terms and conditions of | 3 | + * This program is free software, you can redistribute it and/or modify it under the terms and conditions of |
| 4 | * CANN Open Software License Agreement Version 2.0 (the "License"). | 4 | * CANN Open Software License Agreement Version 2.0 (the "License"). |
| 5 | * Please refer to the License for details. You may not use this file except in compliance with the License. | 5 | * Please refer to the License for details. You may not use this file except in compliance with the License. |
| 6 | * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, | 6 | * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, |
| @@ -22,6 +22,15 @@ | |||
| 22 | 22 | ||
| 23 | 23 | ||
| 24 | 24 | ||
| 25 | +namespace { | ||
| 26 | + | ||
| 27 | +void SetInnerOption(SuperKernelOptionsManager &options, SkInnerOptionType optionType, uint32_t value) { | ||
| 28 | + options.RegisterDefaultInnerOptions(); | ||
| 29 | + options.innerOptionMap[optionType]->SetValue(value); | ||
| 30 | +} | ||
| 31 | + | ||
| 32 | +} // namespace | ||
| 33 | + | ||
| 25 | class SkTaskBuilderTest : public testing::Test { | 34 | class SkTaskBuilderTest : public testing::Test { |
| 26 | protected: | 35 | protected: |
| 27 | void SetUp() override { | 36 | void SetUp() override { |
| @@ -769,6 +778,7 @@ TEST_F(SkTaskBuilderTest, SyncOptimizationAndDispatchSyncBranches) { | |||
| 769 | 778 | ||
| 770 | TEST_F(SkTaskBuilderTest, Build_WithCustomNotifyWaitReset_Success) { | 779 | TEST_F(SkTaskBuilderTest, Build_WithCustomNotifyWaitReset_Success) { |
| 771 | opts->AddOption(std::make_unique<NumberOptOption>("split_mode", aclskOptionType::SPLIT_MODE, 1, 1, 4)); | 780 | opts->AddOption(std::make_unique<NumberOptOption>("split_mode", aclskOptionType::SPLIT_MODE, 1, 1, 4)); |
| 781 | + SetInnerOption(*opts, SkInnerOptionType::MIX_KERNEL_SPLIT, 1); | ||
| 772 | 782 | ||
| 773 | auto *k0 = CreateKernelNodeEx(7001, 0, INVALID_TASK_ID, INVALID_TASK_ID, SkKernelType::MIX_AIC_1_1); | 783 | auto *k0 = CreateKernelNodeEx(7001, 0, INVALID_TASK_ID, INVALID_TASK_ID, SkKernelType::MIX_AIC_1_1); |
| 774 | auto *k1 = CreateKernelNodeEx(7002, 1, INVALID_TASK_ID, INVALID_TASK_ID, SkKernelType::MIX_AIC_1_2); | 784 | auto *k1 = CreateKernelNodeEx(7002, 1, INVALID_TASK_ID, INVALID_TASK_ID, SkKernelType::MIX_AIC_1_2); |
| @@ -788,14 +798,12 @@ TEST_F(SkTaskBuilderTest, Build_WithCustomNotifyWaitReset_Success) { | |||
| 788 | EXPECT_NE(launchInfo.devArgs.Get(), nullptr); | 798 | EXPECT_NE(launchInfo.devArgs.Get(), nullptr); |
| 789 | } | 799 | } |
| 790 | 800 | ||
| 791 | -TEST_F(SkTaskBuilderTest, Build_WithSimtTasks_RecordsMinAvailableUbufSize) { | 801 | +TEST_F(SkTaskBuilderTest, Build_WithSimtTasks_RecordsMaxDcacheSize) { |
| 792 | opts->RegisterDefaultOptions(); | 802 | opts->RegisterDefaultOptions(); |
| 793 | auto *splitOpt = opts->GetOption(aclskOptionType::SPLIT_MODE); | 803 | auto *splitOpt = opts->GetOption(aclskOptionType::SPLIT_MODE); |
| 794 | ASSERT_NE(splitOpt, nullptr); | 804 | ASSERT_NE(splitOpt, nullptr); |
| 795 | splitOpt->SetValue(1); | 805 | splitOpt->SetValue(1); |
| 796 | - auto *setDynUbufSizeOpt = opts->GetOption(SkInnerOptionType::ENABLE_SET_DYN_UBUF_SIZE); | 806 | + SetInnerOption(*opts, SkInnerOptionType::SIMT_OP_SUPPORT, 1); |
| 797 | - ASSERT_NE(setDynUbufSizeOpt, nullptr); | ||
| 798 | - setDynUbufSizeOpt->SetValue(1); | ||
| 799 | 807 | ||
| 800 | auto *k0 = CreateKernelNodeEx(7051, 0, INVALID_TASK_ID, 7052, SkKernelType::AIV_ONLY); | 808 | auto *k0 = CreateKernelNodeEx(7051, 0, INVALID_TASK_ID, 7052, SkKernelType::AIV_ONLY); |
| 801 | auto *k1 = CreateKernelNodeEx(7052, 0, 7051, 7053, SkKernelType::AIV_ONLY); | 809 | auto *k1 = CreateKernelNodeEx(7052, 0, 7051, 7053, SkKernelType::AIV_ONLY); |
| @@ -822,19 +830,17 @@ TEST_F(SkTaskBuilderTest, Build_WithSimtTasks_RecordsMinAvailableUbufSize) { | |||
| 822 | SkLaunchInfo &launchInfo = buildResult.launchInfo; | 830 | SkLaunchInfo &launchInfo = buildResult.launchInfo; |
| 823 | 831 | ||
| 824 | EXPECT_NE(launchInfo.entryInfo.skEntryFunc, nullptr); | 832 | EXPECT_NE(launchInfo.entryInfo.skEntryFunc, nullptr); |
| 825 | - EXPECT_TRUE(launchInfo.hasMinAvailableUbufSize); | 833 | + EXPECT_TRUE(launchInfo.useSimtEntry); |
| 826 | - EXPECT_EQ(launchInfo.minAvailableUbufSize, SK_TOTAL_UB_SIZE - 24576U - 8192U); | 834 | + EXPECT_EQ(launchInfo.skMaxDcacheSize, SK_TOTAL_UB_SIZE - 24576U - 8192U); |
| 827 | EXPECT_STREQ(SkUtGetLastBinaryGetFunctionName(), "sk_entry_mix11_simt"); | 835 | EXPECT_STREQ(SkUtGetLastBinaryGetFunctionName(), "sk_entry_mix11_simt"); |
| 828 | } | 836 | } |
| 829 | 837 | ||
| 830 | -TEST_F(SkTaskBuilderTest, Build_WithSimtTasks_DynUbufOptionDisabledSkipsRecord) { | 838 | +TEST_F(SkTaskBuilderTest, Build_WithSimtTasks_SimtOpSupportDisabledSkipsRecord) { |
| 831 | opts->RegisterDefaultOptions(); | 839 | opts->RegisterDefaultOptions(); |
| 832 | auto *splitOpt = opts->GetOption(aclskOptionType::SPLIT_MODE); | 840 | auto *splitOpt = opts->GetOption(aclskOptionType::SPLIT_MODE); |
| 833 | ASSERT_NE(splitOpt, nullptr); | 841 | ASSERT_NE(splitOpt, nullptr); |
| 834 | splitOpt->SetValue(1); | 842 | splitOpt->SetValue(1); |
| 835 | - auto *setDynUbufSizeOpt = opts->GetOption(SkInnerOptionType::ENABLE_SET_DYN_UBUF_SIZE); | 843 | + SetInnerOption(*opts, SkInnerOptionType::SIMT_OP_SUPPORT, 0); |
| 836 | - ASSERT_NE(setDynUbufSizeOpt, nullptr); | ||
| 837 | - EXPECT_EQ(setDynUbufSizeOpt->GetIntValue(), 0); | ||
| 838 | 844 | ||
| 839 | auto *k0 = CreateKernelNodeEx(7061, 0, INVALID_TASK_ID, 7062, SkKernelType::AIV_ONLY); | 845 | auto *k0 = CreateKernelNodeEx(7061, 0, INVALID_TASK_ID, 7062, SkKernelType::AIV_ONLY); |
| 840 | auto *k1 = CreateKernelNodeEx(7062, 0, 7061, INVALID_TASK_ID, SkKernelType::AIV_ONLY); | 846 | auto *k1 = CreateKernelNodeEx(7062, 0, 7061, INVALID_TASK_ID, SkKernelType::AIV_ONLY); |
| @@ -855,8 +861,8 @@ TEST_F(SkTaskBuilderTest, Build_WithSimtTasks_DynUbufOptionDisabledSkipsRecord) | |||
| 855 | SkLaunchInfo &launchInfo = buildResult.launchInfo; | 861 | SkLaunchInfo &launchInfo = buildResult.launchInfo; |
| 856 | 862 | ||
| 857 | EXPECT_NE(launchInfo.entryInfo.skEntryFunc, nullptr); | 863 | EXPECT_NE(launchInfo.entryInfo.skEntryFunc, nullptr); |
| 858 | - EXPECT_FALSE(launchInfo.hasMinAvailableUbufSize); | 864 | + EXPECT_FALSE(launchInfo.useSimtEntry); |
| 859 | - EXPECT_EQ(launchInfo.minAvailableUbufSize, 0U); | 865 | + EXPECT_EQ(launchInfo.skMaxDcacheSize, 0U); |
| 860 | EXPECT_STREQ(SkUtGetLastBinaryGetFunctionName(), "sk_entry_aiv"); | 866 | EXPECT_STREQ(SkUtGetLastBinaryGetFunctionName(), "sk_entry_aiv"); |
| 861 | } | 867 | } |
| 862 | 868 | ||
| @@ -865,9 +871,7 @@ TEST_F(SkTaskBuilderTest, Build_WithSimtTaskMissingAllocUbufSize_ReturnsEmpty) { | |||
| 865 | auto *splitOpt = opts->GetOption(aclskOptionType::SPLIT_MODE); | 871 | auto *splitOpt = opts->GetOption(aclskOptionType::SPLIT_MODE); |
| 866 | ASSERT_NE(splitOpt, nullptr); | 872 | ASSERT_NE(splitOpt, nullptr); |
| 867 | splitOpt->SetValue(1); | 873 | splitOpt->SetValue(1); |
| 868 | - auto *setDynUbufSizeOpt = opts->GetOption(SkInnerOptionType::ENABLE_SET_DYN_UBUF_SIZE); | 874 | + SetInnerOption(*opts, SkInnerOptionType::SIMT_OP_SUPPORT, 1); |
| 869 | - ASSERT_NE(setDynUbufSizeOpt, nullptr); | ||
| 870 | - setDynUbufSizeOpt->SetValue(1); | ||
| 871 | 875 | ||
| 872 | auto *k0 = CreateKernelNodeEx(7071, 0, INVALID_TASK_ID, INVALID_TASK_ID, SkKernelType::AIV_ONLY); | 876 | auto *k0 = CreateKernelNodeEx(7071, 0, INVALID_TASK_ID, INVALID_TASK_ID, SkKernelType::AIV_ONLY); |
| 873 | k0->nodeInfos.kernelInfos.isSimtOp = true; | 877 | k0->nodeInfos.kernelInfos.isSimtOp = true; |
| @@ -878,7 +882,7 @@ TEST_F(SkTaskBuilderTest, Build_WithSimtTaskMissingAllocUbufSize_ReturnsEmpty) { | |||
| 878 | SkBuildResult buildResult = builder->Build("Unknown", tasks, {}, 0); | 882 | SkBuildResult buildResult = builder->Build("Unknown", tasks, {}, 0); |
| 879 | 883 | ||
| 880 | EXPECT_EQ(buildResult.launchInfo.entryInfo.skEntryFunc, nullptr); | 884 | EXPECT_EQ(buildResult.launchInfo.entryInfo.skEntryFunc, nullptr); |
| 881 | - EXPECT_FALSE(buildResult.launchInfo.hasMinAvailableUbufSize); | 885 | + EXPECT_FALSE(buildResult.launchInfo.useSimtEntry); |
| 882 | } | 886 | } |
| 883 | 887 | ||
| 884 | TEST_F(SkTaskBuilderTest, Build_WithSimtTaskUbufSizeOverflow_ReturnsEmpty) { | 888 | TEST_F(SkTaskBuilderTest, Build_WithSimtTaskUbufSizeOverflow_ReturnsEmpty) { |
| @@ -886,9 +890,7 @@ TEST_F(SkTaskBuilderTest, Build_WithSimtTaskUbufSizeOverflow_ReturnsEmpty) { | |||
| 886 | auto *splitOpt = opts->GetOption(aclskOptionType::SPLIT_MODE); | 890 | auto *splitOpt = opts->GetOption(aclskOptionType::SPLIT_MODE); |
| 887 | ASSERT_NE(splitOpt, nullptr); | 891 | ASSERT_NE(splitOpt, nullptr); |
| 888 | splitOpt->SetValue(1); | 892 | splitOpt->SetValue(1); |
| 889 | - auto *setDynUbufSizeOpt = opts->GetOption(SkInnerOptionType::ENABLE_SET_DYN_UBUF_SIZE); | 893 | + SetInnerOption(*opts, SkInnerOptionType::SIMT_OP_SUPPORT, 1); |
| 890 | - ASSERT_NE(setDynUbufSizeOpt, nullptr); | ||
| 891 | - setDynUbufSizeOpt->SetValue(1); | ||
| 892 | 894 | ||
| 893 | auto *k0 = CreateKernelNodeEx(7072, 0, INVALID_TASK_ID, INVALID_TASK_ID, SkKernelType::AIV_ONLY); | 895 | auto *k0 = CreateKernelNodeEx(7072, 0, INVALID_TASK_ID, INVALID_TASK_ID, SkKernelType::AIV_ONLY); |
| 894 | k0->nodeInfos.kernelInfos.isSimtOp = true; | 896 | k0->nodeInfos.kernelInfos.isSimtOp = true; |
| @@ -901,7 +903,7 @@ TEST_F(SkTaskBuilderTest, Build_WithSimtTaskUbufSizeOverflow_ReturnsEmpty) { | |||
| 901 | SkBuildResult buildResult = builder->Build("Unknown", tasks, {}, 0); | 903 | SkBuildResult buildResult = builder->Build("Unknown", tasks, {}, 0); |
| 902 | 904 | ||
| 903 | EXPECT_EQ(buildResult.launchInfo.entryInfo.skEntryFunc, nullptr); | 905 | EXPECT_EQ(buildResult.launchInfo.entryInfo.skEntryFunc, nullptr); |
| 904 | - EXPECT_FALSE(buildResult.launchInfo.hasMinAvailableUbufSize); | 906 | + EXPECT_FALSE(buildResult.launchInfo.useSimtEntry); |
| 905 | } | 907 | } |
| 906 | 908 | ||
| 907 | TEST_F(SkTaskBuilderTest, Build_WithResetTask_Success) { | 909 | TEST_F(SkTaskBuilderTest, Build_WithResetTask_Success) { |
这个语义看起来很奇怪啊,叫的是max, 求得是min