已开启
ACL_ACLGRAPH_PATH_0002用例问题 #17
guo-yanjun创建于  15 天前
guo-yanjun成员
15 天前 创建

#include "common.h"
#include "../api/acl/feature_aclrt.hpp"
#include "testcase.h"
#include
#include

enum AclgraphGenLaunchType {
LAUNCH_ARGS_ARRAY = 0,
LAUNCH_HOST_ARGS_2P,
LAUNCH_HOST_ARGS_3P,
LAUNCH_HOST_ARGS_RAW,
LAUNCH_FUSION,
};

static const uint32_t ACLGRAPH_GEN_MAX_OPS = 10;

struct AclgraphGenKernelInit {
uint32_t aicoreType;
uint32_t blockDim;
uint64_t sizeAic;
uint32_t argsSize;
uint32_t initData;
uint32_t expectData;
bool hasDataCheck;
AclgraphGenLaunchType launchType;
TcAclKernel knl;
TcAclMemory mem;
TcAclBase base;
aclrtFuncHandle funcHandle;
aclrtBinHandle binhandle;
aclrtBinaryLoadOptions optionalCfg;
aclrtBinaryLoadOption options[1];
aclrtLaunchKernelAttr attrs[2];
aclrtLaunchKernelCfg launchCfg;
Ascendc_AddCustomTilingData_t tiling;
void *workspace;
void *tilingDevice;
void *argsArray[5];
uint32_t *argsHost[4];
uint8_t *aDevice;
uint8_t *bDevice;
uint8_t *biasDevice;
uint8_t *cDevice;
size_t sizeA;
size_t sizeB;
size_t sizeBias;
size_t sizeC;
TcSink sink;
rtFunsionTaskInfo_t fusionInfo;
rtLaunchConfig_t fusionLaunchCfg;
rtLaunchAttribute_t fusionAttrs[1];
};

// Override parameters for TaskUpdate: when non-null, the corresponding flag
// transforms the original kInit value during aclgraphGenLaunchKernel.
// Uses relative transforms (divisor/multiplier) so they work per-op regardless
// of each op's individual blockDim/argsSize.
// type=2 (change address) uses newDevAddrIn/Out arrays indexed by opIdx % count.
struct AclgraphGenLaunchOverride {
bool halveBlockDim = false; // launch with kInit.blockDim / 2
bool doubleArgsSize = false; // launch with kInit.argsSize * 2
bool overrideDevAddr = false; // launch with newDevAddrs[opIdx % count]
void **newDevAddrIn = nullptr; // array[count]
void *newDevAddrOut = nullptr; // array[count]
// Per-op argsHost override for LAUNCH_HOST_ARGS_RAW path.
// newArgsHost[k] is a uint32_t
[4] allocated by the caller.
bool overrideArgsHost = false;
uint32_t *(newArgsHost)[4] = nullptr; // points to array of uint32_t[4]
uint32_t count = 0;
};

static void aclgraphGenInitKernel(AclgraphGenKernelInit &kInit, uint32_t opType)
{
kInit.aicoreType = opType;
kInit.funcHandle = nullptr;
kInit.binhandle = nullptr;
kInit.workspace = nullptr;
kInit.tilingDevice = nullptr;
kInit.blockDim = 1;
kInit.sizeAic = 0;
kInit.argsSize = 0;
kInit.initData = 0;
kInit.expectData = 0;
kInit.hasDataCheck = false;
kInit.launchType = LAUNCH_ARGS_ARRAY;
kInit.aDevice = nullptr;
kInit.bDevice = nullptr;
kInit.biasDevice = nullptr;
kInit.cDevice = nullptr;
kInit.sizeA = 0;
kInit.sizeB = 0;
kInit.sizeBias = 0;
kInit.sizeC = 0;
kInit.optionalCfg.numOpt = 1;
kInit.options[0].type = ACL_RT_BINARY_LOAD_OPT_MAGIC;
kInit.optionalCfg.options = kInit.options;
kInit.launchCfg.numAttrs = 1;
kInit.launchCfg.attrs = kInit.attrs;

TcAclMemory memop;
bool isDavid = (Global_SocVersion == SOCType_ASCEND910D || Global_SocVersion == SOCType_ASCEND910_96);

if (kInit.aicoreType == 0) {
    kInit.blockDim = isDavid ? 1 : 8;
    kInit.sizeAic = kInit.blockDim * 512;
    kInit.launchType = LAUNCH_ARGS_ARRAY;
    kInit.initData = 1;
    kInit.expectData = 2;
    kInit.hasDataCheck = true;
    if (isDavid) {
        RUN_API(memop.initCuda4HostAddrByReadFile("./rttest_data/AddCustom_param_torino.o"));
    } else {
        RUN_API(memop.initCuda4HostAddrByReadFile("./rttest_data/AddCustom_param.o"));
    }
    RUN_API(kInit.knl.testAclrtBinaryLoadFromData(memop.hostAddr, memop.fileSize, nullptr, &kInit.binhandle));
    RUN_API(kInit.knl.testAclrtBinaryGetFunction(kInit.binhandle, "AddCustom_abb92e6cc02c9b4223dafd43dbacd6e8_1", &kInit.funcHandle));
    RUN_API(kInit.mem.applyAddrPairAndInitbyData(kInit.sizeAic, kInit.initData));
    kInit.tiling.totalLength = kInit.sizeAic;
    kInit.tiling.mask[0] = 0;
    kInit.tiling.mask[1] = 0;
    kInit.tiling.repeatTimes = 1;
    kInit.tiling.dstBlkStride = 1;
    kInit.tiling.src0BlkStride = 1;
    kInit.tiling.src1BlkStride = 1;
    kInit.tiling.dstRepStride = 8;
    kInit.tiling.src0RepStride = 8;
    kInit.tiling.src1RepStride = 8;
    kInit.tiling.dataSize = kInit.sizeAic / sizeof(uint32_t);
    kInit.tiling.memory = 0;
    RUN_API(kInit.mem.testAclrtMalloc(&kInit.workspace, 1024, ACL_MEM_MALLOC_HUGE_FIRST));
    RUN_API(kInit.mem.testAclrtMalloc(&kInit.tilingDevice, sizeof(kInit.tiling), ACL_MEM_MALLOC_HUGE_FIRST));
    RUN_API(kInit.mem.testAclrtMemcpy(kInit.tilingDevice, &kInit.tiling, sizeof(kInit.tiling), ACL_MEMCPY_HOST_TO_DEVICE));
    kInit.argsArray[0] = &kInit.mem.devAddrIn;
    kInit.argsArray[1] = &kInit.mem.devAddrIn;
    kInit.argsArray[2] = &kInit.mem.devAddrOut;
    kInit.argsArray[3] = &kInit.workspace;
    kInit.argsArray[4] = &kInit.tilingDevice;
} else if (kInit.aicoreType == 1) {
    kInit.blockDim = 8;
    kInit.sizeAic = 0;
    kInit.launchType = LAUNCH_ARGS_ARRAY;
    kInit.hasDataCheck = false;
    if (isDavid) {
        RUN_API(memop.initCuda4HostAddrByReadFile("./rttest_data/zero_param_torino.o"));
    } else {
        RUN_API(memop.initCuda4HostAddrByReadFile("./rttest_data/zero_param.o"));
    }
    RUN_API(kInit.knl.testAclrtBinaryLoadFromData(memop.hostAddr, memop.fileSize, nullptr, &kInit.binhandle));
    RUN_API(kInit.knl.testAclrtBinaryGetFunction(kInit.binhandle, "_Z10add_customv", &kInit.funcHandle));
} else if (kInit.aicoreType == 2) {
    kInit.blockDim = 16;
    kInit.sizeAic = kInit.blockDim * 512;
    kInit.argsSize = 24;
    kInit.launchType = LAUNCH_HOST_ARGS_3P;
    kInit.initData = MatAddScaIn;
    kInit.expectData = MatAddScaOut;
    kInit.hasDataCheck = true;
    kInit.options[0].value.magic = ACL_RT_BINARY_MAGIC_ELF_AICORE;
    if (isDavid) {
        RUN_API(memop.initCuda4HostAddrByReadFile("./rttest_data/matmul910d.o"));
    } else {
        RUN_API(memop.initCuda4HostAddrByReadFile("./rttest_data/matmul910b.o"));
    }
    RUN_API(kInit.knl.testAclrtBinaryLoadFromData(memop.hostAddr, memop.fileSize, &kInit.optionalCfg, &kInit.binhandle));
    RUN_API(kInit.knl.testAclrtBinaryGetFunction(kInit.binhandle, "_Z6MatMulPDhS_Pf", &kInit.funcHandle));
    RUN_API(kInit.mem.applyAddrPairAndInitbyData(kInit.sizeAic, kInit.initData));
    kInit.attrs[0].id = ACL_RT_LAUNCH_KERNEL_ATTR_SCHEM_MODE;
    kInit.attrs[0].value.schemMode = 0;
} else if (kInit.aicoreType == 3 || kInit.aicoreType == 4) {
    if (!isDavid) { return; }
    kInit.blockDim = 1;
    kInit.sizeAic = kInit.blockDim * 512;
    kInit.argsSize = 24;
    kInit.launchType = LAUNCH_HOST_ARGS_2P;
    kInit.initData = MatAddScaIn;
    kInit.hasDataCheck = false;
    kInit.options[0].value.magic = ACL_RT_BINARY_MAGIC_ELF_VECTOR_CORE;
    if (kInit.aicoreType == 3) {
        RUN_API(memop.initCuda4HostAddrByReadFile("./rttest_data/bit34_simple_add.o"));
    } else {
        RUN_API(memop.initCuda4HostAddrByReadFile("./rttest_data/bit34_simple_add_stacksize.o"));
    }
    RUN_API(kInit.knl.testAclrtBinaryLoadFromData(memop.hostAddr, memop.fileSize, &kInit.optionalCfg, &kInit.binhandle));
    RUN_API(kInit.knl.testAclrtBinaryGetFunction(kInit.binhandle, "as_strided_add", &kInit.funcHandle));
    RUN_API(kInit.mem.applyAddrPairAndInitbyData(kInit.sizeAic, kInit.initData));
    kInit.attrs[0].id = ACL_RT_LAUNCH_KERNEL_ATTR_DYN_UBUF_SIZE;
    kInit.attrs[0].value.dynUBufSize = 2048;
} else if (kInit.aicoreType == 5) {
    kInit.blockDim = 32;
    kInit.sizeAic = 256 * sizeof(uint32_t) * 1024;
    kInit.argsSize = 32;
    kInit.launchType = LAUNCH_HOST_ARGS_RAW;
    kInit.hasDataCheck = false;
    kInit.options[0].value.magic = ACL_RT_BINARY_MAGIC_ELF_VECTOR_CORE;
    if (isDavid) {
        RUN_API(memop.initCuda4HostAddrByReadFile("./rttest_data/syncall_workspace_aiv_david.o"));
    } else {
        RUN_API(memop.initCuda4HostAddrByReadFile("./rttest_data/syncall_workspace_aiv.o"));
    }
    RUN_API(kInit.knl.testAclrtBinaryLoadFromData(memop.hostAddr, memop.fileSize, &kInit.optionalCfg, &kInit.binhandle));
    RUN_API(kInit.knl.testAclrtBinaryGetFunction(kInit.binhandle, "_Z20SyncAll_workspace_Y1PhS_S_S_", &kInit.funcHandle));
    kInit.attrs[0].id = ACL_RT_LAUNCH_KERNEL_ATTR_SCHEM_MODE;
    kInit.attrs[0].value.schemMode = 1;
    size_t inputSize = kInit.sizeAic;
    kInit.sizeA = inputSize;
    kInit.sizeB = inputSize;
    kInit.sizeC = inputSize;
    kInit.sizeBias = inputSize;
    RUN_API(kInit.mem.testAclrtMalloc((void **)&kInit.aDevice, inputSize, ACL_MEM_MALLOC_HUGE_FIRST));
    RUN_API(kInit.mem.testAclrtMalloc((void **)&kInit.bDevice, inputSize, ACL_MEM_MALLOC_HUGE_FIRST));
    RUN_API(kInit.mem.testAclrtMalloc((void **)&kInit.cDevice, inputSize, ACL_MEM_MALLOC_HUGE_FIRST));
    RUN_API(kInit.mem.testAclrtMalloc((void **)&kInit.biasDevice, inputSize, ACL_MEM_MALLOC_HUGE_FIRST));
    uint8_t *aHost = nullptr;
    RUN_API(kInit.mem.testAclrtMallocHost((void **)&aHost, inputSize));
    kInit.base.ReadFile("./rttest_data/input_a.bin", inputSize, aHost, inputSize);
    RUN_API(kInit.mem.testAclrtMemcpy(kInit.aDevice, aHost, inputSize, ACL_MEMCPY_HOST_TO_DEVICE));
    RUN_API(kInit.mem.testAclrtMemset(kInit.bDevice, inputSize, 0, inputSize));
    RUN_API(kInit.mem.testAclrtMemset(kInit.biasDevice, inputSize, 0, inputSize));
    kInit.argsHost[0] = (uint32_t *)kInit.aDevice;
    kInit.argsHost[1] = (uint32_t *)kInit.cDevice;
    kInit.argsHost[2] = (uint32_t *)kInit.bDevice;
    kInit.argsHost[3] = (uint32_t *)kInit.biasDevice;
} else if (kInit.aicoreType == 6 || kInit.aicoreType == 7) {
    kInit.blockDim = 16;
    kInit.sizeAic = 32 * 32 * sizeof(float);
    kInit.argsSize = 32;
    kInit.launchType = LAUNCH_HOST_ARGS_RAW;
    kInit.hasDataCheck = false;
    if (kInit.aicoreType == 6) {
        kInit.options[0].value.magic = ACL_RT_BINARY_MAGIC_ELF_CUBE_CORE;
        if (isDavid) {
            RUN_API(memop.initCuda4HostAddrByReadFile("./rttest_data/mmad_custom_aic_david.o"));
        } else {
            RUN_API(memop.initCuda4HostAddrByReadFile("./rttest_data/mmad_custom_aic.o"));
        }
    } else {
        kInit.options[0].value.magic = ACL_RT_BINARY_MAGIC_ELF_AICORE;
        if (isDavid) {
            RUN_API(memop.initCuda4HostAddrByReadFile("./rttest_data/mmad_custom_mix_david.o"));
        } else {
            RUN_API(memop.initCuda4HostAddrByReadFile("./rttest_data/mmad_custom_mix.o"));
        }
    }
    RUN_API(kInit.knl.testAclrtBinaryLoadFromData(memop.hostAddr, memop.fileSize, &kInit.optionalCfg, &kInit.binhandle));
    RUN_API(kInit.knl.testAclrtBinaryGetFunction(kInit.binhandle, "_Z11mmad_customPhS_S_S_", &kInit.funcHandle));
    kInit.attrs[0].id = ACL_RT_LAUNCH_KERNEL_ATTR_SCHEM_MODE;
    kInit.attrs[0].value.schemMode = 1;
    uint32_t M = 32, N = 32, K = 32;
    size_t aFileSize = M * K * sizeof(int16_t);
    size_t bFileSize = K * N * sizeof(int16_t);
    size_t biasFileSize = N * sizeof(int16_t);
    size_t cFileSize = M * N * sizeof(float);
    kInit.sizeA = aFileSize;
    kInit.sizeB = bFileSize;
    kInit.sizeBias = biasFileSize;
    kInit.sizeC = cFileSize;
    RUN_API(kInit.mem.testAclrtMalloc((void **)&kInit.aDevice, aFileSize, ACL_MEM_MALLOC_HUGE_FIRST));
    RUN_API(kInit.mem.testAclrtMalloc((void **)&kInit.bDevice, bFileSize, ACL_MEM_MALLOC_HUGE_FIRST));
    RUN_API(kInit.mem.testAclrtMalloc((void **)&kInit.biasDevice, biasFileSize, ACL_MEM_MALLOC_HUGE_FIRST));
    RUN_API(kInit.mem.testAclrtMalloc((void **)&kInit.cDevice, cFileSize, ACL_MEM_MALLOC_HUGE_FIRST));
    uint8_t *aHost = nullptr, *bHost = nullptr, *biasHost = nullptr;
    RUN_API(kInit.mem.testAclrtMallocHost((void **)&aHost, aFileSize));
    RUN_API(kInit.mem.testAclrtMallocHost((void **)&bHost, bFileSize));
    RUN_API(kInit.mem.testAclrtMallocHost((void **)&biasHost, biasFileSize));
    kInit.base.ReadFile("./rttest_data/input_x_aic.bin", aFileSize, aHost, aFileSize);
    kInit.base.ReadFile("./rttest_data/input_y_aic.bin", bFileSize, bHost, bFileSize);
    kInit.base.ReadFile("./rttest_data/input_bias_aic.bin", biasFileSize, biasHost, biasFileSize);
    RUN_API(kInit.mem.testAclrtMemcpy(kInit.aDevice, aHost, aFileSize, ACL_MEMCPY_HOST_TO_DEVICE));
    RUN_API(kInit.mem.testAclrtMemcpy(kInit.bDevice, bHost, bFileSize, ACL_MEMCPY_HOST_TO_DEVICE));
    RUN_API(kInit.mem.testAclrtMemcpy(kInit.biasDevice, biasHost, biasFileSize, ACL_MEMCPY_HOST_TO_DEVICE));
    kInit.argsHost[0] = (uint32_t *)kInit.aDevice;
    kInit.argsHost[1] = (uint32_t *)kInit.bDevice;
    kInit.argsHost[2] = (uint32_t *)kInit.biasDevice;
    kInit.argsHost[3] = (uint32_t *)kInit.cDevice;
} else if (kInit.aicoreType == 8) {
    kInit.blockDim = 32;
    kInit.sizeAic = 256 * sizeof(uint32_t) * 1024;
    kInit.argsSize = 32;
    kInit.launchType = LAUNCH_HOST_ARGS_RAW;
    kInit.hasDataCheck = false;
    kInit.options[0].value.magic = ACL_RT_BINARY_MAGIC_ELF_AICORE;
    if (isDavid) {
        RUN_API(memop.initCuda4HostAddrByReadFile("./rttest_data/syncall_workspace_mix_aic_david.o"));
    } else {
        RUN_API(memop.initCuda4HostAddrByReadFile("./rttest_data/syncall_workspace_mix_aiv.o"));
    }
    RUN_API(kInit.knl.testAclrtBinaryLoadFromData(memop.hostAddr, memop.fileSize, &kInit.optionalCfg, &kInit.binhandle));
    RUN_API(kInit.knl.testAclrtBinaryGetFunction(kInit.binhandle, "_Z20SyncAll_workspace_Y1PhS_S_S_", &kInit.funcHandle));
    kInit.attrs[0].id = ACL_RT_LAUNCH_KERNEL_ATTR_SCHEM_MODE;
    kInit.attrs[0].value.schemMode = 1;
    size_t inputSize = kInit.sizeAic;
    kInit.sizeA = inputSize;
    kInit.sizeB = inputSize;
    kInit.sizeC = inputSize;
    kInit.sizeBias = inputSize;
    RUN_API(kInit.mem.testAclrtMalloc((void **)&kInit.aDevice, inputSize, ACL_MEM_MALLOC_HUGE_FIRST));
    RUN_API(kInit.mem.testAclrtMalloc((void **)&kInit.bDevice, inputSize, ACL_MEM_MALLOC_HUGE_FIRST));
    RUN_API(kInit.mem.testAclrtMalloc((void **)&kInit.cDevice, inputSize, ACL_MEM_MALLOC_HUGE_FIRST));
    RUN_API(kInit.mem.testAclrtMalloc((void **)&kInit.biasDevice, inputSize, ACL_MEM_MALLOC_HUGE_FIRST));
    uint8_t *aHost = nullptr;
    RUN_API(kInit.mem.testAclrtMallocHost((void **)&aHost, inputSize));
    kInit.base.ReadFile("./rttest_data/input_a.bin", inputSize, aHost, inputSize);
    RUN_API(kInit.mem.testAclrtMemcpy(kInit.aDevice, aHost, inputSize, ACL_MEMCPY_HOST_TO_DEVICE));
    RUN_API(kInit.mem.testAclrtMemset(kInit.bDevice, inputSize, 0, inputSize));
    RUN_API(kInit.mem.testAclrtMemset(kInit.biasDevice, inputSize, 0, inputSize));
    kInit.argsHost[0] = (uint32_t *)kInit.aDevice;
    kInit.argsHost[1] = (uint32_t *)kInit.cDevice;
    kInit.argsHost[2] = (uint32_t *)kInit.bDevice;
    kInit.argsHost[3] = (uint32_t *)kInit.biasDevice;
} else if (kInit.aicoreType == 9) {
    if (!isDavid) { return; }
    kInit.blockDim = 100;
    kInit.sizeAic = kInit.blockDim * sizeof(uint32_t);
    kInit.launchType = LAUNCH_FUSION;
    kInit.hasDataCheck = false;
    kInit.knl.isArgsHost = true;
    RUN_API(memop.initCuda4HostAddrByReadFile("./rttest_data/syncall_workspace_aiv_david.o"));
    RUN_API(kInit.knl.testDevAndFuncRegister(RT_DEV_BINARY_MAGIC_ELF_AIVEC, memop.hostAddr, memop.fileSize,
        "_Z20SyncAll_workspace_Y1PhS_S_S_", "_Z20SyncAll_workspace_Y1PhS_S_S_"));
    RUN_API(kInit.mem.applyAddrPairAndInitbyData(kInit.sizeAic, 10));
    uint32_t offset = 32U;
    uint32_t flag = RT_KERNEL_CUSTOM_AICPU;
    uint32_t kernelType = KERNEL_TYPE_AICPU;
    kInit.fusionInfo = {};
    kInit.fusionInfo.subTaskNum = 2U;
    kInit.fusionInfo.subTask[0].type = RT_FUSION_AICPU;
    kInit.fusionInfo.subTask[0].task.aicpuInfo.blockDim = 2U;
    kInit.fusionInfo.subTask[0].task.aicpuInfo.flags = flag;
    kInit.fusionInfo.subTask[0].task.aicpuInfo.kernelType = kernelType;
    kInit.fusionAttrs[0].id = RT_LAUNCH_ATTRIBUTE_BLOCKDIM;
    kInit.fusionAttrs[0].value.blockDim = kInit.blockDim;
    kInit.fusionLaunchCfg = {};
    kInit.fusionLaunchCfg.numAttrs = 1;
    kInit.fusionLaunchCfg.attrs = kInit.fusionAttrs;
    kInit.fusionInfo.subTask[1].type = RT_FUSION_AICORE;
    kInit.fusionInfo.subTask[1].task.aicoreInfo.hdl = nullptr;
    kInit.fusionInfo.subTask[1].task.aicoreInfo.tilingKey = 0ULL;
    kInit.fusionInfo.subTask[1].task.aicoreInfo.config = &kInit.fusionLaunchCfg;
    kInit.fusionInfo.subTask[1].task.aicoreInfo.stubFunc = kInit.knl.funcAddr;
}

}

struct AclgraphGenKernelSet {
AclgraphGenKernelInit ops[ACLGRAPH_GEN_MAX_OPS];
uint32_t count;
};

static void aclgraphGenInitKernelSet(AclgraphGenKernelSet &kSet)
{
kSet.count = 0;
if (Global_aicore_type == 99) {
bool isDavid = (Global_SocVersion == SOCType_ASCEND910D || Global_SocVersion == SOCType_ASCEND910_96);
for (uint32_t t = 0; t <= 8; t++) {
if (t == 3 || t == 4) {
if (!isDavid) { continue; }
}
aclgraphGenInitKernel(kSet.ops[kSet.count], t);
if (kSet.ops[kSet.count].funcHandle != nullptr) {
kSet.count++;
}
}
} else {
aclgraphGenInitKernel(kSet.ops[0], Global_aicore_type);
kSet.count = 1;
}
}

static void aclgraphTaskUpdateInitKernelSet(AclgraphGenKernelSet &kSet)
{
kSet.count = 0;
bool isDavid = (Global_SocVersion == SOCType_ASCEND910D || Global_SocVersion == SOCType_ASCEND910_96);
uint32_t allowedTypes[] = {2, 4, 5, 7, 9};
if (Global_aicore_type == 99) {
for (uint32_t i = 0; i < sizeof(allowedTypes) / sizeof(allowedTypes[0]); i++) {
uint32_t t = allowedTypes[i];
if (t == 4 && !isDavid) { continue; }
if (t == 9 && !isDavid) { continue; }
aclgraphGenInitKernel(kSet.ops[kSet.count], t);
if (kSet.ops[kSet.count].funcHandle != nullptr) {
kSet.count++;
}
}
} else {
uint32_t t = Global_aicore_type;
if ((t == 4 || t == 9) && !isDavid) {
RTS_SLOG("RTS_ACL_ACLGRAPH_PATH_0002", "aicore_type=%u not supported on this platform, skip", t);
} else {
aclgraphGenInitKernel(kSet.ops[kSet.count], t);
if (kSet.ops[kSet.count].funcHandle != nullptr) {
kSet.count++;
}
}
}
}

static void aclgraphGenSyncStream(TcAclStream &strm, TcAclDevice &dev)
{
if (Global_intf_type == 1) {
RUN_API(strm.testAclrtSynchronizeStreamWithTimeout(strm.stream, -1));
} else {
RUN_API(strm.testAclrtSynchronizeStream());
}
}

static void aclgraphGenLaunchKernel(AclgraphGenKernelInit &kInit, aclrtStream stream, uint32_t opIdx,
const AclgraphGenLaunchOverride *ovrd = nullptr)
{
uint32_t blockDim = kInit.blockDim;
uint32_t argsSize = kInit.argsSize;
void *devAddrIn = (void *)kInit.mem.devAddrIn;
void *devAddrOut = (void *)kInit.mem.devAddrOut;

if (ovrd && ovrd->halveBlockDim) {
    blockDim = (kInit.blockDim / 2 == 0) ? 1 : (kInit.blockDim / 2);
}
if (ovrd && ovrd->doubleArgsSize) {
    argsSize = kInit.argsSize * 2;
}
if (ovrd && ovrd->overrideDevAddr && ovrd->count > 0) {
    uint32_t idx = opIdx % ovrd->count;
    devAddrIn = ovrd->newDevAddrIn[idx];
    devAddrOut = ovrd->newDevAddrOut[idx];
}

if (kInit.launchType == LAUNCH_ARGS_ARRAY) {
    if (kInit.aicoreType == 1) {
        RUN_API(kInit.knl.testAclrtLaunchKernelWithArgsArray(kInit.funcHandle, blockDim, stream, nullptr, nullptr));
    } else {
        void *argsArray[5];
        for (int a = 0; a < 5; a++) {
            argsArray[a] = kInit.argsArray[a];
        }
        if (ovrd && ovrd->overrideDevAddr) {
            argsArray[0] = &devAddrIn;
            argsArray[1] = &devAddrIn;
            argsArray[2] = &devAddrOut;
        }
        RUN_API(kInit.knl.testAclrtLaunchKernelWithArgsArray(kInit.funcHandle, blockDim, stream, nullptr, argsArray));
    }
} else if (kInit.launchType == LAUNCH_HOST_ARGS_2P) {
    RUN_API(kInit.knl.testAclrtLaunchKernelWithHostArgs(kInit.funcHandle, blockDim,
        devAddrIn, devAddrOut, argsSize, stream, &kInit.launchCfg));
} else if (kInit.launchType == LAUNCH_HOST_ARGS_3P) {
    RUN_API(kInit.knl.testAclrtLaunchKernelWithHostArgs(kInit.funcHandle, blockDim, argsSize, stream,
        devAddrIn, devAddrIn, devAddrOut, &kInit.launchCfg));
} else if (kInit.launchType == LAUNCH_HOST_ARGS_RAW) {
    uint32_t *argsHost[4];
    if (ovrd && ovrd->overrideArgsHost && ovrd->count > 0) {
        uint32_t idx = opIdx % ovrd->count;
        for (int a = 0; a < 4; a++) {
            argsHost[a] = ovrd->newArgsHost[idx][a];
        }
    } else {
        for (int a = 0; a < 4; a++) {
            argsHost[a] = kInit.argsHost[a];
        }
    }
    RUN_API(kInit.knl.testAclrtLaunchKernelWithHostArgs(kInit.funcHandle, blockDim, stream,
        &kInit.launchCfg, argsHost, argsSize, nullptr, 0));
} else if (kInit.launchType == LAUNCH_FUSION) {
    uint32_t offset = 32U;
    uint32_t flag = RT_KERNEL_CUSTOM_AICPU;
    uint32_t kernelType = KERNEL_TYPE_AICPU;
    RUN_API(kInit.sink.FillFusionKernelForAicpuAic(blockDim, stream, devAddrIn, devAddrOut,
        flag, kernelType, true, offset));
    RUN_API(kInit.knl.testRtFusionLaunch(&kInit.fusionInfo, stream, &(kInit.sink.fusionArgsInfo)));
}

}

static void aclgraphGenLaunchKernelSet(AclgraphGenKernelSet &kSet, uint32_t opIdx, aclrtStream stream,
const AclgraphGenLaunchOverride *ovrd = nullptr)
{
aclgraphGenLaunchKernel(kSet.ops[opIdx % kSet.count], stream, opIdx, ovrd);
}

static void testAclgraphGeneralizeThread(TcAclContext *ctx, AclgraphGenKernelSet *kSet)
{
RUN_API(ctx->testAclrtSetCurrentContext(ctx->context));
TcAclModel mdl;
TcAclDevice dev(0, 0, 0);

uint32_t strmNum = Global_stream_num;
if (strmNum == 0) { strmNum = 1; }

TcRelease<TcAclStream> relStrm;
TcAclStream **strm = new TcAclStream*[strmNum];
for (uint32_t i = 0; i < strmNum; i++) {
    strm[i] = new TcAclStream(0, true, 0, Global_stream_flag);
    RUN_API(strm[i]->testAclrtCreateStreamWithConfig(&(strm[i]->stream), 0, Global_stream_flag));
    relStrm.pushit(strm[i]);
}

for (uint32_t i = 0; i < strmNum; i++) {
    uint64_t failureMode = (Global_fault_stop == 1) ? ACL_STOP_ON_FAILURE : ACL_CONTINUE_ON_FAILURE;
    RUN_API(strm[i]->testAclrtSetStreamFailureMode(strm[i]->stream, failureMode));
}

TcAclMemory cpyMem;
RUN_API(cpyMem.applyAddrPairAndInitbyData(Global_copy_size, MatAddScaIn));

uint32_t numDerive = 0;
uint32_t numAdd = 0;
if (Global_capture_method == 0) {
    numDerive = strmNum - 1;
    numAdd = 0;
} else if (Global_capture_method == 1) {
    numDerive = 0;
    numAdd = strmNum - 1;
} else if (Global_capture_method == 2) {
    numDerive = (strmNum - 1 + 1) / 2;
    numAdd = strmNum - 1 - numDerive;
}

TcRelease<TcAclEvent> relEvnt;
TcAclEvent **evntBegin = nullptr;
TcAclEvent **evntEnd = nullptr;
if (numDerive > 0) {
    evntBegin = new TcAclEvent*[numDerive];
    evntEnd = new TcAclEvent*[numDerive];
    for (uint32_t i = 0; i < numDerive; i++) {
        evntBegin[i] = new TcAclEvent(0, 1);
        evntEnd[i] = new TcAclEvent(0, 1);
        RUN_API(evntBegin[i]->testAclrtCreateEventExWithFlag(ACL_EVENT_SYNC));
        RUN_API(evntEnd[i]->testAclrtCreateEventExWithFlag(ACL_EVENT_SYNC));
        relEvnt.pushit(evntBegin[i]);
        relEvnt.pushit(evntEnd[i]);
    }
}

aclmdlRICaptureMode captureMode = static_cast<aclmdlRICaptureMode>(Global_capture_mode_1);
aclmdlRICaptureStatus status;
aclmdlRI modelRI = nullptr;
RUN_API(strm[0]->testAclmdlRICaptureBegin(strm[0]->stream, captureMode));
RUN_API(mdl.testAclmdlRICaptureGetInfo(strm[0]->stream, &status, &modelRI));

uint32_t deriveIdx = 0;
uint32_t addIdx = 0;
for (uint32_t i = 1; i < strmNum; i++) {
    if (deriveIdx < numDerive) {
        RUN_API(evntBegin[deriveIdx]->testAclrtRecordEvent(strm[0]->stream));
        RUN_API(evntBegin[deriveIdx]->testAclrtStreamWaitEvent(strm[i]->stream, evntBegin[deriveIdx]->event));
        deriveIdx++;
    } else {
        RUN_API(strm[0]->testRtStreamAddToModel(strm[i]->stream, modelRI));
        addIdx++;
    }
}

uint32_t kernelTaskNum = (Global_task_count / 100) * 100;
if (kernelTaskNum == 0) { kernelTaskNum = 100; }
uint32_t memcpyTaskNum = Global_task_count / 100;
if (memcpyTaskNum == 0) { memcpyTaskNum = 1; }

uint32_t memcpyTypeIdx = 0;
uint32_t opIdx = 0;
deriveIdx = 0;
for (uint32_t i = 0; i < strmNum; i++) {
    uint32_t kernelCount = 0;
    uint32_t memcpyCount = 0;
    uint32_t totalTasks = kernelTaskNum + memcpyTaskNum;
    for (uint32_t j = 0; j < totalTasks; j++) {
        if (memcpyCount < memcpyTaskNum && (kernelCount >= 100 || kernelCount >= kernelTaskNum)) {
            RUN_API(cpyMem.testAclrtMemcpyAsync(cpyMem.devAddrIn, Global_copy_size, cpyMem.hostAddrIn, Global_copy_size, ACL_MEMCPY_HOST_TO_DEVICE, strm[i]->stream));
            RUN_API(cpyMem.testAclrtMemcpyAsync(cpyMem.devAddrOut, Global_copy_size, cpyMem.devAddrIn, Global_copy_size, ACL_MEMCPY_DEVICE_TO_DEVICE, strm[i]->stream));
            RUN_API(cpyMem.testAclrtMemcpyAsync(cpyMem.hostAddrOut, Global_copy_size, cpyMem.devAddrOut, Global_copy_size, ACL_MEMCPY_DEVICE_TO_HOST, strm[i]->stream));
            memcpyCount++;
        } else if (kernelCount < kernelTaskNum) {
            aclgraphGenLaunchKernelSet(*kSet, opIdx, strm[i]->stream);
            opIdx++;
            kernelCount++;
        }
    }
    if (i > 0 && i <= numDerive) {
        RUN_API(evntEnd[i - 1]->testAclrtRecordEvent(strm[i]->stream));
        RUN_API(evntEnd[i - 1]->testAclrtStreamWaitEvent(strm[0]->stream, evntEnd[i - 1]->event));
    }
}

RUN_API(strm[0]->testAclmdlRICaptureEnd(strm[0]->stream, &modelRI));
ASSERT_NE(modelRI, nullptr);

uint32_t numStreams = 0;
RUN_API(mdl.testAclmdlRIGetStreams(modelRI, nullptr, &numStreams));
RTS_EVENTLOG("GetStreams: expected=%u actual=%u", strmNum, numStreams);
ASSERT_EQ(strmNum, numStreams);

uint32_t memcpyTaskActual = memcpyTaskNum * 3;
uint32_t expectedTasksPerStream = kernelTaskNum + memcpyTaskActual;

aclrtStream *modelStreams = new aclrtStream[numStreams];
RUN_API(mdl.testAclmdlRIGetStreams(modelRI, modelStreams, &numStreams));
for (uint32_t i = 0; i < numStreams; i++) {
    uint32_t numTasks = 0;
    RUN_API(mdl.testAclmdlRIGetTasksByStream(modelStreams[i], nullptr, &numTasks));
    RTS_EVENTLOG("GetTasksByStream(modelStream[%u]): expected>=%u actual=%u", i, expectedTasksPerStream, numTasks);
    ASSERT_GE(numTasks, expectedTasksPerStream);
}
delete[] modelStreams;

for (uint32_t loop = 0; loop < Global_Loop; loop++) {
    RUN_API(mdl.testAclmdlRIExecuteAsync(modelRI, strm[0]->stream));
    aclgraphGenSyncStream(*strm[0], dev);
    for (uint32_t k = 0; k < kSet->count; k++) {
        if (kSet->ops[k].hasDataCheck && kSet->ops[k].sizeAic > 0) {
            RUN_API(kSet->ops[k].mem.memcpyAddrAndCheckData(kSet->ops[k].sizeAic, kSet->ops[k].expectData));
        }
    }
}

RUN_API(mdl.testAclmdlRIDestroy(modelRI));

delete[] evntBegin;
delete[] evntEnd;
delete[] strm;

}

TEST_F(RTS, ACL_ACLGRAPH_PATH_0001)
{
if (Global_ChipType != Chip_MILAN) { return; }
RTS_EVENTLOG("multi-thread generalize: each thread independent capture model lifecycle");

TcAclDevice dev;
TcAclContext ctx(true, true, dev.device);
RUN_API(ctx.testAclrtSetCurrentContext(ctx.context));

AclgraphGenKernelSet kSet;
aclgraphGenInitKernelSet(kSet);
if (kSet.count == 0 || kSet.ops[0].funcHandle == nullptr) { return; }

TcMultiP multi(NUM_PERF_THREAD);
multi.commit(testAclgraphGeneralizeThread, &ctx, &kSet);
RUN_CHECK(multi.runThread(1));

RTS_EVENTLOG("multi-thread generalize done, NUM_PERF_THREAD=%u", NUM_PERF_THREAD);

}

static void testAclgraphTaskUpdateThread(TcAclContext *ctx, AclgraphGenKernelSet *kSet)
{
RUN_API(ctx->testAclrtSetCurrentContext(ctx->context));
TcAclModel mdl;
TcAclDevice dev(0, 0, 0);

uint32_t strmNum = Global_stream_num;
if (strmNum == 0) { strmNum = 1; }

TcRelease<TcAclStream> relStrm;
TcAclStream **strm = new TcAclStream*[strmNum];
for (uint32_t i = 0; i < strmNum; i++) {
    strm[i] = new TcAclStream(0, true, 0, Global_stream_flag);
    RUN_API(strm[i]->testAclrtCreateStreamWithConfig(&(strm[i]->stream), 0, Global_stream_flag));
    relStrm.pushit(strm[i]);
}

for (uint32_t i = 0; i < strmNum; i++) {
    uint64_t failureMode = (Global_fault_stop == 1) ? ACL_STOP_ON_FAILURE : ACL_CONTINUE_ON_FAILURE;
    RUN_API(strm[i]->testAclrtSetStreamFailureMode(strm[i]->stream, failureMode));
}

uint32_t numDerive = 0;
uint32_t numAdd = 0;
if (Global_capture_method == 0) {
    numDerive = strmNum - 1;
    numAdd = 0;
} else if (Global_capture_method == 1) {
    numDerive = 0;
    numAdd = strmNum - 1;
} else if (Global_capture_method == 2) {
    numDerive = (strmNum - 1 + 1) / 2;
    numAdd = strmNum - 1 - numDerive;
}

TcRelease<TcAclEvent> relEvnt;
TcAclEvent **evntBegin = nullptr;
TcAclEvent **evntEnd = nullptr;
if (numDerive > 0) {
    evntBegin = new TcAclEvent*[numDerive];
    evntEnd = new TcAclEvent*[numDerive];
    for (uint32_t i = 0; i < numDerive; i++) {
        evntBegin[i] = new TcAclEvent(0, 1);
        evntEnd[i] = new TcAclEvent(0, 1);
        RUN_API(evntBegin[i]->testAclrtCreateEventExWithFlag(ACL_EVENT_SYNC));
        RUN_API(evntEnd[i]->testAclrtCreateEventExWithFlag(ACL_EVENT_SYNC));
        relEvnt.pushit(evntBegin[i]);
        relEvnt.pushit(evntEnd[i]);
    }
}

aclmdlRICaptureMode captureMode = static_cast<aclmdlRICaptureMode>(Global_capture_mode_1);
aclmdlRICaptureStatus status;
aclmdlRI modelRI = nullptr;
RUN_API(strm[0]->testAclmdlRICaptureBegin(strm[0]->stream, captureMode));
RUN_API(mdl.testAclmdlRICaptureGetInfo(strm[0]->stream, &status, &modelRI));

uint32_t deriveIdx = 0;
uint32_t addIdx = 0;
for (uint32_t i = 1; i < strmNum; i++) {
    if (deriveIdx < numDerive) {
        RUN_API(evntBegin[deriveIdx]->testAclrtRecordEvent(strm[0]->stream));
        RUN_API(evntBegin[deriveIdx]->testAclrtStreamWaitEvent(strm[i]->stream, evntBegin[deriveIdx]->event));
        deriveIdx++;
    } else {
        RUN_API(strm[0]->testRtStreamAddToModel(strm[i]->stream, modelRI));
        addIdx++;
    }
}

uint32_t taskNum = Global_task_count;
if (taskNum == 0) { taskNum = 100; }

aclrtTaskGrp *taskGrpHandles = new aclrtTaskGrp[strmNum];
for (uint32_t i = 0; i < strmNum; i++) {
    taskGrpHandles[i] = nullptr;
}

uint32_t opIdx = 0;
for (uint32_t i = 0; i < strmNum; i++) {
    RUN_API(mdl.testAclmdlRICaptureTaskGrpBegin(strm[i]->stream));
    for (uint32_t j = 0; j < taskNum; j++) {
        aclgraphGenLaunchKernelSet(*kSet, opIdx, strm[i]->stream);
        opIdx++;
    }
    RUN_API(mdl.testAclmdlRICaptureTaskGrpEnd(strm[i]->stream, &taskGrpHandles[i]));
}

for (uint32_t i = 1; i <= numDerive; i++) {
    RUN_API(evntEnd[i - 1]->testAclrtRecordEvent(strm[i]->stream));
    RUN_API(evntEnd[i - 1]->testAclrtStreamWaitEvent(strm[0]->stream, evntEnd[i - 1]->event));
}

RUN_API(strm[0]->testAclmdlRICaptureEnd(strm[0]->stream, &modelRI));
ASSERT_NE(modelRI, nullptr);

// Stream/task count validation skipped: when NUM_TASK exceeds 32K, runtime
// auto-cascades extra streams into the model, so numStreams > strmNum and
// per-stream task counts vary. Asserting exact values would false-fail.
uint32_t numStreams = 0;
RUN_API(mdl.testAclmdlRIGetStreams(modelRI, nullptr, &numStreams));
RTS_EVENTLOG("GetStreams: expected=%u actual=%u", strmNum, numStreams);

// Prepare override parameters for TaskUpdate.
// - type=0/1: use override flags (halveBlockDim / doubleArgsSize)
// - type=2: allocate new device addresses into arrays, pass via override.
//   Original kSet is NEVER modified — all new addresses go into override arrays.
AclgraphGenLaunchOverride ovrd;
void *newDevAddrInArr[ACLGRAPH_GEN_MAX_OPS] = {nullptr};
void *newDevAddrOutArr[ACLGRAPH_GEN_MAX_OPS] = {nullptr};
// Per-op argsHost override for RAW path: newArgsHostStorage[k][4]
uint32_t *newArgsHostStorage[ACLGRAPH_GEN_MAX_OPS][4] = {{nullptr}};

if (Global_ModelTaskUpdate_type == 0) {
    ovrd.halveBlockDim = true;
} else if (Global_ModelTaskUpdate_type == 1) {
    ovrd.doubleArgsSize = true;
}

// pre-execute model once before TaskUpdate to verify capture model is correct
RTS_EVENTLOG("pre-execute model before TaskUpdate");
RUN_API(mdl.testAclmdlRIExecuteAsync(modelRI, strm[0]->stream));
aclgraphGenSyncStream(*strm[0], dev);
for (uint32_t k = 0; k < kSet->count; k++) {
    if (kSet->ops[k].hasDataCheck && kSet->ops[k].sizeAic > 0) {
        RUN_API(kSet->ops[k].mem.memcpyAddrAndCheckData(kSet->ops[k].sizeAic, kSet->ops[k].expectData));
    }
}
RTS_EVENTLOG("pre-execute model before TaskUpdate PASSED");

// type=2: allocate new device addresses into arrays for override.
// Done AFTER pre-execute so original addresses are intact for pre-execute check.
// Original kSet is never touched — all new data goes into override arrays.
if (Global_ModelTaskUpdate_type == 2) {
    ovrd.overrideDevAddr = true;
    ovrd.newDevAddrIn = newDevAddrInArr;
    ovrd.newDevAddrOut = newDevAddrOutArr;
    ovrd.count = kSet->count;
    for (uint32_t k = 0; k < kSet->count; k++) {
        AclgraphGenKernelInit &op = kSet->ops[k];
        if (op.launchType == LAUNCH_ARGS_ARRAY || op.launchType == LAUNCH_FUSION ||
            op.launchType == LAUNCH_HOST_ARGS_2P || op.launchType == LAUNCH_HOST_ARGS_3P) {
            RUN_API(op.mem.testAclrtMalloc(&newDevAddrInArr[k], op.sizeAic, ACL_MEM_MALLOC_HUGE_FIRST));
            RUN_API(op.mem.testAclrtMalloc(&newDevAddrOutArr[k], op.sizeAic, ACL_MEM_MALLOC_HUGE_FIRST));
            op.mem.testAclrtMemset(newDevAddrInArr[k], op.sizeAic, op.initData, op.sizeAic);
            op.mem.testAclrtMemset(newDevAddrOutArr[k], op.sizeAic, op.initData, op.sizeAic);
        } else if (op.launchType == LAUNCH_HOST_ARGS_RAW) {
            // RAW path: allocate new device buffers, build new argsHost array
            // WITHOUT modifying original kSet->ops[k].
            // Use per-buffer sizes (sizeA/sizeB/sizeBias/sizeC) instead of
            // unified sizeAic — aicoreType=7 has different buffer sizes
            // (aDevice=2048, bDevice=2048, biasDevice=64, cDevice=4096).
            uint8_t *newADevice = nullptr;
            uint8_t *newBDevice = nullptr;
            uint8_t *newCDevice = nullptr;
            uint8_t *newBiasDevice = nullptr;
            RUN_API(op.mem.testAclrtMalloc((void **)&newADevice, op.sizeA, ACL_MEM_MALLOC_HUGE_FIRST));
            RUN_API(op.mem.testAclrtMalloc((void **)&newBDevice, op.sizeB, ACL_MEM_MALLOC_HUGE_FIRST));
            RUN_API(op.mem.testAclrtMalloc((void **)&newCDevice, op.sizeC, ACL_MEM_MALLOC_HUGE_FIRST));
            RUN_API(op.mem.testAclrtMalloc((void **)&newBiasDevice, op.sizeBias, ACL_MEM_MALLOC_HUGE_FIRST));
            RUN_API(op.mem.testAclrtMemcpy(newADevice, op.aDevice, op.sizeA, ACL_MEMCPY_DEVICE_TO_DEVICE));
            RUN_API(op.mem.testAclrtMemcpy(newBDevice, op.bDevice, op.sizeB, ACL_MEMCPY_DEVICE_TO_DEVICE));
            RUN_API(op.mem.testAclrtMemcpy(newCDevice, op.cDevice, op.sizeC, ACL_MEMCPY_DEVICE_TO_DEVICE));
            RUN_API(op.mem.testAclrtMemcpy(newBiasDevice, op.biasDevice, op.sizeBias, ACL_MEMCPY_DEVICE_TO_DEVICE));
            // Build new argsHost by mapping old device pointers to new ones.
            for (int h = 0; h < 4; h++) {
                if (op.argsHost[h] == (uint32_t *)op.aDevice) {
                    newArgsHostStorage[k][h] = (uint32_t *)newADevice;
                } else if (op.argsHost[h] == (uint32_t *)op.bDevice) {
                    newArgsHostStorage[k][h] = (uint32_t *)newBDevice;
                } else if (op.argsHost[h] == (uint32_t *)op.cDevice) {
                    newArgsHostStorage[k][h] = (uint32_t *)newCDevice;
                } else if (op.argsHost[h] == (uint32_t *)op.biasDevice) {
                    newArgsHostStorage[k][h] = (uint32_t *)newBiasDevice;
                } else {
                    newArgsHostStorage[k][h] = op.argsHost[h];
                }
            }
        }
    }
    // Enable argsHost override only if any RAW op exists.
    bool hasRaw = false;
    for (uint32_t k = 0; k < kSet->count; k++) {
        if (kSet->ops[k].launchType == LAUNCH_HOST_ARGS_RAW) { hasRaw = true; break; }
    }
    if (hasRaw) {
        ovrd.overrideArgsHost = true;
        ovrd.newArgsHost = newArgsHostStorage;
    }
}

for (uint32_t i = 0; i < strmNum; i++) {
    RUN_API(mdl.testAclmdlRICaptureTaskUpdateBegin(strm[i]->stream, taskGrpHandles[i]));
    for (uint32_t j = 0; j < taskNum; j++) {
        aclgraphGenLaunchKernelSet(*kSet, opIdx, strm[i]->stream, &ovrd);
        opIdx++;
    }
    RUN_API(mdl.testAclmdlRICaptureTaskUpdateEnd(strm[i]->stream));
}

for (uint32_t loop = 0; loop < Global_Loop; loop++) {
    RUN_API(mdl.testAclmdlRIExecuteAsync(modelRI, strm[0]->stream));
    aclgraphGenSyncStream(*strm[0], dev);
    for (uint32_t k = 0; k < kSet->count; k++) {
        if (kSet->ops[k].hasDataCheck && kSet->ops[k].sizeAic > 0) {
            RUN_API(kSet->ops[k].mem.memcpyAddrAndCheckData(kSet->ops[k].sizeAic, kSet->ops[k].expectData));
        }
    }
}

delete[] taskGrpHandles;
delete[] evntBegin;
delete[] evntEnd;
delete[] strm;

}

TEST_F(RTS, ACL_ACLGRAPH_PATH_0002)
{
if (Global_ChipType != Chip_MILAN) { return; }
RTS_EVENTLOG("task update generalize: capture TaskGrp -> TaskUpdate -> execute");

TcAclDevice dev;
TcAclContext ctx(true, true, dev.device);
RUN_API(ctx.testAclrtSetCurrentContext(ctx.context));

AclgraphGenKernelSet kSet;
aclgraphTaskUpdateInitKernelSet(kSet);
if (kSet.count == 0 || kSet.ops[0].funcHandle == nullptr) { return; }

TcMultiP multi(NUM_PERF_THREAD);
multi.commit(testAclgraphTaskUpdateThread, &ctx, &kSet);
RUN_CHECK(multi.runThread(1));

RTS_EVENTLOG("task update generalize done, NUM_PERF_THREAD=%u", NUM_PERF_THREAD);

}

likedislike
guo-yanjun成员
15 天前 评论:
guo-yanjun成员
15 天前 评论:
guo-yanjun成员
15 天前 评论:

./rtstest_host rts_acl_aclgraph_path_0002 NUM_THR=100 STREAM_FLAG=6 STREAM_NUM=9 FAULT_STOP=1 CAPTURE_METHOD=1 NUM_TASK=2048 AICORE_TYPE=5 CAPTURE_MODE_1=2 INTF_TYPE=0 NUM_LOOP=10 TASKUPDATE_TYPE=0 DEVID=9 报错的用例参数是这样的

likedislike
guo-yanjun成员
15 天前 评论:
guo-yanjun成员
13 天前 评论:

./rtstest_host rts_acl_aclgraph_path_0002 NUM_THR=2 STREAM_FLAG=6 STREAM_NUM=9 FAULT_STOP=1 CAPTURE_METHOD=1 NUM_TASK=20 AICORE_TYPE=5 CAPTURE_MODE_1=2 INTF_TYPE=0 NUM_LOOP=10 TASKUPDATE_TYPE=0 DEVID=9

likedislike
guo-yanjun成员
13 天前 评论:
guo-yanjun成员
13 天前 评论:

已核对 GitCode v5 官方接口并在当前PR完成实际验证:行内评论接口只要求传入 body/path/position,无需客户端携带 base/start/head。使用当前 post_pr_inline_comment.py 在 pr-review.md:216 发布测试评论后,GitCode 正确创建了 DiffNote,文件、行号及服务端自动补齐的三个 diff refs 均与当前 patchset 一致,未出现降级为普通评论或错挂,测试评论当前已删除。

likedislike