bmcv_hm_distance

计算两个向量中各个元素的汉明距离。

接口形式:

bmcv_hamming_distance(
   bm_handle_t handle,
   bm_device_mem_t input1,
   bm_device_mem_t input2,
   bm_device_mem_t output,
   int bits_len,
   int input1_num,
   int input2_num);

参数说明:

  • bm_handle_t handle

    输入参数。 bm_handle 句柄。

  • bm_image input1

    输入参数。向量1数据的设备地址信息。

  • bm_image input2

    输入参数。向量2数据的设备地址信息。

  • bm_image output

    输出参数。output向量数据的设备地址信息。

  • int bits_len

    输入参数。向量中的每个元素的长度

  • int input1_num

    输入参数。向量1的数据个数

  • int input2_num

    输入参数。向量2的数据个数

返回值说明:

  • BM_SUCCESS: 成功

  • 其他:失败

注意:

该接口仅支持BM1684X。

示例代码

int bits_len = 8;
int input1_num = 2;
int input2_num = 2562;

int* input1_data = new int[input1_num * bits_len];
int* input2_data = new int[input2_num * bits_len];
int* output_ref  = new int[input1_num * input2_num];
int* output_tpu  = new int[input1_num * input2_num];

memset(input1_data, 0, input1_num * bits_len * sizeof(int));
memset(input2_data, 0, input2_num * bits_len * sizeof(int));
memset(output_ref,  0,  input1_num * input2_num * sizeof(int));
memset(output_tpu,  0,  input1_num * input2_num * sizeof(int));

// fill data
for(int i = 0; i < input1_num * bits_len; i++) input1_data[i] = rand() % 10;
for(int i = 0; i < input2_num * bits_len; i++) input2_data[i] = rand() % 20 + 1;

bm_device_mem_t input1_dev_mem;
bm_device_mem_t input2_dev_mem;
bm_device_mem_t output_dev_mem;

if(BM_SUCCESS != bm_malloc_device_byte(handle, &input1_dev_mem, input1_num * bits_len * sizeof(int))){
    std::cout << "malloc input fail" << std::endl;
    exit(-1);
}

if(BM_SUCCESS != bm_malloc_device_byte(handle, &input2_dev_mem, input2_num * bits_len * sizeof(int))){
    std::cout << "malloc input fail" << std::endl;
    exit(-1);
}

if(BM_SUCCESS != bm_malloc_device_byte(handle, &output_dev_mem, input1_num * input2_num * sizeof(int))){
    std::cout << "malloc input fail" << std::endl;
    exit(-1);
}

if(BM_SUCCESS != bm_memcpy_s2d(handle, input1_dev_mem, input1_data)){
    std::cout << "copy input1 to device fail" << std::endl;
    exit(-1);
}

if(BM_SUCCESS != bm_memcpy_s2d(handle, input2_dev_mem, input2_data)){
    std::cout << "copy input2 to device fail" << std::endl;
    exit(-1);
}

struct timeval t1, t2;
gettimeofday(&t1, NULL);
bm_status_t status = bmcv_hamming_distance(handle,
                                           input1_dev_mem,
                                           input2_dev_mem,
                                           output_dev_mem,
                                           bits_len,
                                           input1_num,
                                           input2_num);
gettimeofday(&t2, NULL);
cout << "--using time = " << ((t2.tv_sec - t1.tv_sec) * 1000000 + t2.tv_usec - t1.tv_usec) << "(us)--" << endl;

if(status != BM_SUCCESS){
    printf("run bmcv_hamming_distance failed status = %d \n", status);
    bm_free_device(handle, input1_dev_mem);
    bm_free_device(handle, input2_dev_mem);
    bm_free_device(handle, output_dev_mem);
    bm_dev_free(handle);
    exit(-1);
}

if(BM_SUCCESS != bm_memcpy_d2s(handle, output_tpu, output_dev_mem)){
        std::cout << "bm_memcpy_d2s fail" << std::endl;
        exit(-1);
}

delete [] input1_data;
delete [] input2_data;
delete [] output_ref;
delete [] output_tpu;
bm_free_device(handle, input1_dev_mem);
bm_free_device(handle, input2_dev_mem);
bm_free_device(handle, output_dev_mem);