GreaterEqual
=================


逐元素比较两个输入张量，判断 `input1` 的元素是否大于等于 `input2` 的对应元素。支持广播。

.. math::

    \text{output}_i = (\text{input1}_i >= \text{input2}_i)

输出一个布尔张量，如果比较结果为真，则对应元素为 `true`，否则为 `false`。

输入：
    - **input1** - 第一个输入张量的数据地址。
    - **input2** - 第二个输入张量的数据地址。
    - **params** - 参数打包数组，格式如下：
        - **input0_dims** - 第一个输入张量 `input1` 的维度。
        - **input1_dims** - 第二个输入张量 `input2` 的维度。
        - **output_dims** - 输出张量的维度。
        - **strides0** - 第一个输入张量 `input1` 的步长。
        - **strides1** - 第二个输入张量 `input2` 的步长。
        - **strides_output** - 输出张量的步长。
        - **num_dims** - 维度数量。用于广播判断。
    - **core_mask** - 核掩码。

输出：
    - **output** - 写入比较结果的布尔张量。

支持平台：
    ``FT78NE``
    ``MT7004``

.. note::
    - FT78NE 支持fp32, fp64, int8, int16, int32
    - MT7004 支持fp16, fp32, int16, int32


**共享存储版本:**

.. c:function:: void fp_greater_equal_s(float *input1, float* input2, bool *output, long long *params, int core_mask)
.. c:function:: void hp_greater_equal_s(half *input1, half *input2, bool *output, long long *params, int core_mask)
.. c:function:: void dp_greater_equal_s(double *input1, double *input2, bool *output, long long *params, int core_mask)
.. c:function:: void i32_greater_equal_s(int32_t *input1, int32_t *input2, bool *output, long long *params, int core_mask)
.. c:function:: void i16_greater_equal_s(int16_t *input1, int16_t *input2, bool *output, long long *params, int core_mask)
.. c:function:: void i8_greater_equal_s(int8_t *input1, int8_t *input2, bool *output, long long *params, int core_mask)

**C调用示例：**

.. code-block:: c
    :linenos:
    :emphasize-lines: 50

    //FT78NE示例
    #include <stdio.h>
    #include <greater.h>
    int main(int argc, char* argv[]) {
        float *input0 = (float *)0x81000000;
        float *input1 = (float *)0x82000000;
        bool *output = (bool *)0x83000000;
        int *strides0 = (int*)0x85000000;
        int *strides1 = (int*)0x86000000;
        int *strides_output = (int*)0x87000000;

        int i = 0;

        srand(seed++);

        float f_min = -100.0;
        float f_max = 100.0;

        // same shape
        int input0_dims[] = {64, 16, 63};  // 2x2
        int input1_dims[] = {1, 1, 1};  // 2x2
        int output_dims[] = {64, 16, 63};      // 2x2
        int num_dims = 3;

        unsigned long long params[9];
        params[0] = (unsigned long long)input0_dims;
        params[1] = (unsigned long long)input1_dims;
        params[2] = (unsigned long long)output_dims;
        params[3] = (unsigned long long)strides0;
        params[4] = (unsigned long long)strides1;
        params[5] = (unsigned long long)strides_output;
        params[6] = (unsigned long long)num_dims;

        int total_input0 = get_total_elements(num_dims, input0_dims);  
        int total_input1 = get_total_elements(num_dims, input1_dims);
        int total_output = get_total_elements(num_dims, output_dims);
        
        int core_id = get_core_id();
        int logic_core_id = GetLogicCoreId(core_mask, core_id);
        int core_num = GetCoreNum(core_mask);

        for(i = 0;i < total_input0;++i) {
            input0[i] = f_min + ((float)rand() / (float)RAND_MAX) * (f_max - f_min);
        }

        for(i = 0;i < total_input1;++i) {
            input1[i] = f_min + ((float)rand() / (float)RAND_MAX) * (f_max - f_min);
        }

        fp_greater_equal_s(input0, input1, output, params, core_mask);//调用汇编
        return 0;
    }


**私有存储版本:**

.. c:function:: void fp_greater_equal_p(float *input1, float *input2, bool *output, long long *params)
.. c:function:: void hp_greater_equal_p(half *input1, half *input2, bool *output, long long *params)
.. c:function:: void dp_greater_equal_p(double *input1, double *input2, bool *output, long long *params)
.. c:function:: void i32_greater_equal_p(int32_t *input1, int32_t *input2, bool *output, long long *params)
.. c:function:: void i16_greater_equal_p(int16_t *input1, int16_t *input2, bool *output, long long *params)
.. c:function:: void i8_greater_equal_p(int8_t *input1, int8_t *input2, bool *output, long long *params)
    
    
**C调用示例：**

.. code-block:: c
    :linenos:
    :emphasize-lines: 47

    //FT04示例
    #include <stdio.h>
    #include <greater.h>
    int main(int argc, char* argv[]) {
        float *input0 = (float *)0x10010000;
        float *input1 = (float *)0x10020000;
        bool *output = (bool *)0x10030000;
        int *strides0 = (int*)0x10050000;
        int *strides1 = (int*)0x10060000;
        int *strides_output = (int*)0x10070000;

        int i = 0;

        srand(seed++);

        float f_min = -100.0;
        float f_max = 100.0;

            // same shape
        int input0_dims[] = {4, 8, 17};  // 2x2
        int input1_dims[] = {1, 1, 1};  // 2x2
        int output_dims[] = {4, 8, 17};      // 2x2
        int num_dims = 3;

        unsigned long long params[9];
        params[0] = (unsigned long long)input0_dims;
        params[1] = (unsigned long long)input1_dims;
        params[2] = (unsigned long long)output_dims;
        params[3] = (unsigned long long)strides0;
        params[4] = (unsigned long long)strides1;
        params[5] = (unsigned long long)strides_output;
        params[6] = (unsigned long long)num_dims;

        int total_input0 = get_total_elements(num_dims, input0_dims);  
        int total_input1 = get_total_elements(num_dims, input1_dims);
        int total_output = get_total_elements(num_dims, output_dims);
        
        
        for(i = 0;i < total_input0;++i) {
            input0[i] = f_min + ((float)rand() / (float)RAND_MAX) * (f_max - f_min);
        }

        for(i = 0;i < total_input1;++i) {
            input1[i] = f_min + ((float)rand() / (float)RAND_MAX) * (f_max - f_min);
        }
    
        fp_greater_equal_p(input0, input1, output, params);//调用汇编
        return 0;
    }