bmcv_as_strided
该接口可以根据现有矩阵以及给定的步长来创建一个视图矩阵。
处理器型号支持:
该接口仅支持BM1684X。
接口形式:
bm_status_t bmcv_as_strided(bm_handle_t handle, bm_device_mem_t input, bm_device_mem_t output, int input_row, int input_col, int output_row, int output_col, int row_stride, int col_stride);
输入参数说明:
bm_handle_t handle
输入参数。bm_handle 句柄。
bm_device_mem_t input
输入参数。存放输入矩阵 input 数据的设备内存地址。
bm_device_mem_t output
输入参数。存放输出矩阵 output 数据的设备内存地址。
int input_row
输入参数。输入矩阵 input 的行数。
int input_col
输入参数。输入矩阵 input 的列数。
int output_row
输入参数。输出矩阵 output 的行数。
int output_col
输入参数。输出矩阵 output 的列数。
int row_stride
输入参数。输出矩阵行之间的步长。
int col_stride
输入参数。输出矩阵列之间的步长。
返回值说明:
BM_SUCCESS: 成功
其他:失败
示例代码
#define RAND_MAX 2147483647 int loop = 1; int input_row = 5; int input_col = 5; int output_row = 3; int output_col = 3; int row_stride = 1; int col_stride = 2; bm_handle_t handle; bm_status_t ret = BM_SUCCESS; ret = bm_dev_request(&handle, 0); if (BM_SUCCESS != ret){ printf("request dev failed\n"); return BM_ERR_FAILURE; } float* input_data = new float[input_row * input_col]; float* output_data = new float[output_row * output_col]; srand((unsigned int)time(NULL)); for (int i = 0; i < len; i++) { input_data[i] = (float)rand() / (float)RAND_MAX * 100; } bm_device_mem_t input_dev_mem, output_dev_mem; bm_malloc_device_byte(handle, &input_dev_mem, input_row * input_col * sizeof(float)); bm_malloc_device_byte(handle, &output_dev_mem, output_row * output_col * sizeof(float)); bm_memcpy_s2d(handle, input_dev_mem, input_data); struct timeval t1, t2; gettimeofday_(&t1); ret = bmcv_as_strided(handle, input_dev_mem, output_dev_mem, input_row, input_col, output_row, output_col, row_stride, col_stride); gettimeofday_(&t2); std::cout << "as_strided Tensor Computing Processor using time= " << ((t2.tv_sec - t1.tv_sec) * 1000000 + t2.tv_usec - t1.tv_usec) << "(us)" << std::endl; if (ret != BM_SUCCESS) { printf("as_strided failed. ret = %d\n", ret); goto exit; } bm_memcpy_d2s(handle, output_data, output_dev_mem); exit: bm_free_device(handle, input_dev_mem); bm_free_device(handle, output_dev_mem); delete[] output_data; delete[] input_data; bm_dev_free(handle);