This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] PROCESSOR-SDK-J784S4:自定义扩展运算符适用于仿真器、但仅在 C7x DSP 上运行第一行

Guru**** 2478765 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1538883/processor-sdk-j784s4-custom-expand-operator-works-on-emulator-but-only-first-row-on-c7x-dsp

部件号:PROCESSOR-SDK-J784S4


工具/软件:

您好:

我正在努力实现定制 增加 TIDL 的调试操作符。 以下是我的设置:

  • 模型 :具有两个输入的 ONNX 图形:

    • "input":形状 [1, 5]

    • 常量"shape"[5, 1](int64)

  • 预期输出形状 :[5, 5] (从 1×5 行广播到 5×5 矩阵)

当我在 PC 仿真器上运行模型时,操作人员工作正常—输出是一个带有重复行的完整 5×5 矩阵。

这是 PC 仿真器上输入和输出的屏幕截图:

在上 C7 DSP 、使用相同的实现、结果为 不正确:

  • 仅填充第一行。

  • 其余行被清零 (NULL)

在屏幕截图中、我尝试使用简单的计数器填充输出缓冲区:

PS:我实施了其他自定义运算符(例如,and、cos)、它们在 DSP 上运行良好、因为它们的输入和输出形状相同。
此问题仅在出现时出现 输出形状各不相同 时钟噪声。

下面是我的 expand 函数的实现

T* outDataPtr  = static_cast<T*>(dst);
for (int i =0; i< params.outDataCount; i++ )
{
    outDataPtr[i] = i;
}

这是我的整形函数

int32_t TIDL_tfOutReshapeCustomLayer(sTIDL_OrgNetwork_t *pOrgTIDLNetStructure,
                                     int32_t layerIndex)
{
    if(TIDL_CUSTOM_TYPE_0 == customParams.customLayerType)
    {
    ...
    }
    else if (TIDL_CUSTOM_TYPE_EXPAND == customParams.customLayerType)
    {
        // These lines are taken from TIDL_tfOutReshapeIdentity
        TIDLPCLayers.outData[0].elementType = TIDLPCLayers.inData[0].elementType;
        TIDLPCLayers.outData[0].numDim = gLayers.weights.bufSize;
        TIDLPCLayers.outData[0].dimValues[TIDL_DIM_BATCH] = TIDLPCLayers.inData[0].dimValues[TIDL_DIM_BATCH];
        TIDLPCLayers.outData[0].dimValues[TIDL_DIM_DIM1] = TIDLPCLayers.inData[0].dimValues[TIDL_DIM_DIM1];
        TIDLPCLayers.outData[0].dimValues[TIDL_DIM_DIM2] = TIDLPCLayers.inData[0].dimValues[TIDL_DIM_DIM2];
        TIDLPCLayers.outData[0].dimValues[TIDL_DIM_NUMCH] = TIDLPCLayers.inData[0].dimValues[TIDL_DIM_NUMCH];
        TIDLPCLayers.outData[0].dimValues[TIDL_DIM_HEIGHT] = TIDLPCLayers.inData[0].dimValues[TIDL_DIM_HEIGHT];
        TIDLPCLayers.outData[0].dimValues[TIDL_DIM_WIDTH] = TIDLPCLayers.inData[0].dimValues[TIDL_DIM_WIDTH];
        
        int64_t *weightsptr = (int64_t*) (gLayers.weights.ptr + gLayers.weights.offset);
        for (int i = 0; i < gLayers.weights.bufSize; i++) {
            TIDLPCLayers.outData[0].dimValues[TIDL_DIM_MAX - 1 - i] = (int32_t) max(weightsptr[gLayers.weights.bufSize -1 - i],(int64_t) TIDLPCLayers.inData[0].dimValues[TIDL_DIM_MAX - 1 - i]);
        }
        TIDLPCLayers.numMacs =
      (int64_t)((int64_t)TIDLPCLayers.outData[0].dimValues[TIDL_DIM_BATCH]* TIDLPCLayers.outData[0].dimValues[TIDL_DIM_DIM1] *TIDLPCLayers.outData[0].dimValues[TIDL_DIM_DIM2] * TIDLPCLayers.outData[0].dimValues[TIDL_DIM_NUMCH] *
      TIDLPCLayers.outData[0].dimValues[TIDL_DIM_HEIGHT] * TIDLPCLayers.outData[0].dimValues[TIDL_DIM_WIDTH]);
    }
    return 0;
}

当输出形状与输入形状不同时、TIDL 中是否存在任何特定于 DSP 的约束?

您能帮助我解决我的问题吗?

感谢任何修改输出形状的定制层的指导、调试提示或示例。

提前感谢您的支持!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ghassen:

    在该器件上、我们仅支持 8 位或 16 位(无浮点)、因此建议在 int 模式下运行时查看是否会出现相同的结果。 我不知道 DSP 的输出形状有什么具体的限制、但我可以仔细检查一下。  

    此外、您是否使用 OSRT 流程或 TIDLRT 流程运行此功能? 如果您能够使用 8/16 位在设备上重新创建、您可以共享您的模型、配置和数据、以及您采取的所有步骤、以便我也可以重新创建。

    此致、

    Christina

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Christina、

    感谢您的反馈和指导。

    我尝试了所有支持的类型 (int 和 float)、得到了相同的结果(仅填充第一行)。

    我也尝试了 8 位和 16 位,但我有相同的结果。

    OSRT 流程运行、但我的操作员将被卸载到 TIDL。
    您可以在此处找到模型:  

    e2e.ti.com/.../expand_5F00_model.zip

    您‑重新检查 DSP 是否施加了任何信号 对输出张量形状或内存对齐的限制 这可能会导致写入完整行、但不会写入后续行?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ghassen:

    这可能是器件和 PC 仿真之间的错误、因为这种性质不存在已知的限制。 我将看到是否可以重新创建、并在提出后续问题时提出任何问题。 您是否还能共享您的配置文件、输入和任何其他必要的文件?

    此致、

    Christina

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ghassen:

    浏览代码后、似乎您已将输出大小设置为与 TIDL 中的输入大小相同、这可能是您获得与输入大小相同的正确数据的原因。   

            TIDLPCLayers.outData[0].dimValues[TIDL_DIM_BATCH] = TIDLPCLayers.inData[0].dimValues[TIDL_DIM_BATCH];
            TIDLPCLayers.outData[0].dimValues[TIDL_DIM_DIM1] = TIDLPCLayers.inData[0].dimValues[TIDL_DIM_DIM1];
            TIDLPCLayers.outData[0].dimValues[TIDL_DIM_DIM2] = TIDLPCLayers.inData[0].dimValues[TIDL_DIM_DIM2];
            TIDLPCLayers.outData[0].dimValues[TIDL_DIM_NUMCH] = TIDLPCLayers.inData[0].dimValues[TIDL_DIM_NUMCH];
            TIDLPCLayers.outData[0].dimValues[TIDL_DIM_HEIGHT] = TIDLPCLayers.inData[0].dimValues[TIDL_DIM_HEIGHT];
            TIDLPCLayers.outData[0].dimValues[TIDL_DIM_WIDTH] = TIDLPCLayers.inData[0].dimValues[TIDL_DIM_WIDTH]
    

    下面的行应乘以膨胀系数、这样可以解决您看到的问题。  

    TIDLPCLayers.outData[0].dimValues[TIDL_DIM_HEIGHT] = TIDLPCLayers.inData[0].dimValues[TIDL_DIM_HEIGHT]; 

    如果您仍有问题、请告诉我。

    此致、

    Christina