aclnn_operation_base.h

 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#ifndef ACLNN_OPERATION_BASE_H
#define ACLNN_OPERATION_BASE_H

#include <acl/acl.h>
#include <aclnn/acl_meta.h>
#include <atb/atb_infer.h>
#include <atb/types.h>
#include <atb/utils.h>
#include "atb/infer_op_params.h"

// Wrapper around atb::tensor.
struct AclnnTensor
{
public:
    atb::Tensor atbTensor; 
    aclTensor *tensor = nullptr;
    int tensorIdx = -1; // Index of the aclTensor in the aclExecutor.
    bool needUpdateTensorDataPtr = false;
    atb::SVector<int64_t> strides = {};
};

// Keep the unified API call with the atb operator.
class AclnnBaseOperation : public atb::Operation
{
public:
    explicit AclnnBaseOperation(const std::string &opName);
    ~AclnnBaseOperation() override;
    std::string GetName() const override;

    // Simulate the atb API to obtain the workspace size.
    atb::Status Setup(const atb::VariantPack &variantPack, uint64_t &workspaceSize, atb::Context *context) override;

    // Simulate the atb API to execute the operator.
    atb::Status Execute(const atb::VariantPack &variantPack, uint8_t *workspace, uint64_t workspaceSize,
                        atb::Context *context) override;

    // Create an input aclnnTensor.
    virtual atb::Status CreateAclnnVariantPack(const atb::VariantPack &variantPack) = 0;

    // Calculate the workspace size.
    virtual atb::Status SetAclnnWorkspaceExecutor() = 0;

    // Execute aclnn op.
    virtual atb::Status ExecuteAclnnOp(uint8_t *workspace, aclrtStream &stream) = 0;

    // Update the addresses of the aclnn input and output tensors.
    atb::Status UpdateAclnnVariantPack(const atb::VariantPack &variantPack);

    std::string opName_;
    aclOpExecutor *aclExecutor_ = nullptr;
    atb::SVector<std::shared_ptr<AclnnTensor>> aclInTensors_;
    atb::SVector<std::shared_ptr<AclnnTensor>> aclOutTensors_;
    uint64_t workspaceSize_;
    int workspaceBlockId_ = -1;
};

#endif