[Priority] Medium
[Description] In Ascend C operator projects, the workspace parameter passed when writing the kernel function has been directly assigned the value Workspace. Therefore, you do not need to use SetSysWorkspace and GetUserWorkspace to set and obtain the workspace. After these redundant judgments are reduced, the compiler can further optimize unused workspace variables without using this parameter.
[Negative Example]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | template <uint64_t schMode, uint64_t dType> __global__ __aicore__ void fast_gelu(GM_ADDR x, GM_ADDR y, GM_ADDR workspace, GM_ADDR tiling) { // This is a negative example for redundant judgment. if (workspace == nullptr) { return; } SetSysWorkspace(workspace); GM_ADDR userWS = GetUserWorkspace(workspace); if (userWS == nullptr) { return; } REGISTER_TILING_DEFAULT(EleBaseTilingDataV2); GET_TILING_DATA_WITH_STRUCT(EleBaseTilingDataV2, tilingData, tiling); KERNEL_TASK_TYPE_DEFAULT(KERNEL_TYPE_AIV_ONLY); TPipe pipe; if constexpr (dType == static_cast<uint64_t>(TPL_FP16)) { ElementwiseSch<schMode, FastGeluDag::FastGeluNeedCast<half>::OpDag> sch(&tilingData, &pipe); sch.Init(x, y); sch.Process(); } else if constexpr (dType == static_cast<uint64_t>(TPL_BF16)) { ElementwiseSch<schMode, FastGeluDag::FastGeluNeedCast<bfloat16_t>::OpDag> sch(&tilingData, &pipe); sch.Init(x, y); sch.Process(); } else if constexpr (dType == static_cast<uint64_t>(TPL_FP32)) { ElementwiseSch<schMode, FastGeluDag::FastGeluNoCast<float>::OpDag> sch(&tilingData, &pipe); sch.Init(x, y); sch.Process(); } } |
[Positive Example]
The null pointer check for the workspace parameter is deleted from the fast_gelu function. In addition, you do not need to set SetSysWorkspace or use GetUserWorkspace to obtain the workspace.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | template <uint64_t schMode, uint64_t dType> __global__ __aicore__ void fast_gelu(GM_ADDR x, GM_ADDR y, GM_ADDR workspace, GM_ADDR tiling) { REGISTER_TILING_DEFAULT(EleBaseTilingDataV2); GET_TILING_DATA_WITH_STRUCT(EleBaseTilingDataV2, tilingData, tiling); KERNEL_TASK_TYPE_DEFAULT(KERNEL_TYPE_AIV_ONLY); TPipe pipe; if constexpr (dType == static_cast<uint64_t>(TPL_FP16)) { ElementwiseSch<schMode, FastGeluDag::FastGeluNeedCast<half>::OpDag> sch(&tilingData, &pipe); sch.Init(x, y); sch.Process(); } else if constexpr (dType == static_cast<uint64_t>(TPL_BF16)) { ElementwiseSch<schMode, FastGeluDag::FastGeluNeedCast<bfloat16_t>::OpDag> sch(&tilingData, &pipe); sch.Init(x, y); sch.Process(); } else if constexpr (dType == static_cast<uint64_t>(TPL_FP32)) { ElementwiseSch<schMode, FastGeluDag::FastGeluNoCast<float>::OpDag> sch(&tilingData, &pipe); sch.Init(x, y); sch.Process(); } } |