bmcv_sort

该接口可以实现浮点数据的排序(升序/降序),并且支持排序后可以得到原数据所对应的 index。

接口形式:

bm_status_t bmcv_sort(bm_handle_t     handle,
                      bm_device_mem_t src_index_addr,
                      bm_device_mem_t src_data_addr,
                      int             data_cnt,
                      bm_device_mem_t dst_index_addr,
                      bm_device_mem_t dst_data_addr,
                      int             sort_cnt,
                      int             order,
                      bool            index_enable,
                      bool            auto_index);

输入参数说明:

  • bm_handle_t handle

输入参数。输入的 bm_handle 句柄。

  • bm_device_mem_t src_index_addr

输入参数。每个输入数据所对应 index 的地址。如果使能 index_enable 并且不使用 auto_index 时,则该参数有效。bm_device_mem_t 为内置表示地址的数据类型,可以使用函数 bm_mem_from_system(addr) 将普通用户使用的指针或地址转为该类型,用户可参考示例代码中的使用方式。

  • bm_device_mem_t src_data_addr

输入参数。待排序的输入数据所对应的地址。bm_device_mem_t 为内置表示地址的数据类型,可以使用函数 bm_mem_from_system(addr) 将普通用户使用的指针或地址转为该类型,用户可参考示例代码中的使用方式。

  • int data_cnt

输入参数。待排序的输入数据的数量。

  • bm_device_mem_t dst_index_addr

输出参数。排序后输出数据所对应 index 的地址, 如果使能 index_enable 并且不使用 auto_index 时,则该参数有效。bm_device_mem_t 为内置表示地址的数据类型,可以使用函数 bm_mem_from_system(addr) 将普通用户使用的指针或地址转为该类型,用户可参考示例代码中的使用方式。

  • bm_device_mem_t dst_data_addr

输出参数。排序后的输出数据所对应的地址。bm_device_mem_t 为内置表示地址的数据类型,可以使用函数 bm_mem_from_system(addr) 将普通用户使用的指针或地址转为该类型,用户可参考示例代码中的使用方式。

  • int sort_cnt

输入参数。需要排序的数量,也就是输出结果的个数,包括排好序的数据和对应 index 。比如降序排列,如果只需要输出前 3 大的数据,则该参数设置为 3 即可。

  • int order

输入参数。升序还是降序,0 表示升序, 1 表示降序。

  • bool index_enable

输入参数。是否使能 index。如果使能即可输出排序后数据所对应的 index ,否则 src_index_addr 和 dst_index_addr 这两个参数无效。

  • bool auto_index

输入参数。是否使能自动生成 index 功能。使用该功能的前提是 index_enable 参数为 true,如果该参数也为 true 则表示按照输入数据的存储顺序从 0 开始计数作为 index,参数 src_index_addr 便无效,输出结果中排好序数据所对应的 index 即存放于 dst_index_addr 地址中。

返回值说明:

  • BM_SUCCESS: 成功

  • 其他:失败

注意事项:

1、要求 sort_cnt <= data_cnt。

2、若需要使用 auto index 功能,前提是参数 index_enable 为 true。

3、该 api 至多可支持 1MB 数据的全排序。

示例代码

int data_cnt = 100;
int sort_cnt = 50;
float src_data_p[100];
int src_index_p[100];
float dst_data_p[50];
int dst_index_p[50];
for (int i = 0; i < 100; i++) {
    src_data_p[i] = rand() % 1000;
    src_index_p[i] = 100 - i;
}
int order = 0;
bmcv_sort(handle,
          bm_mem_from_system(src_index_p),
          bm_mem_from_system(src_data_p),
          data_cnt,
          bm_mem_from_system(dst_index_p),
          bm_mem_from_system(dst_data_p),
          sort_cnt,
          order,
          true,
          false);