960路高清视频解码,480路智能解析
576路高清视频解码,288路智能解析
BM1684X,416路高清视频智能解析
X86主控,288路1080p高清视频智能解析
BM1684X,32路高清视频智能解析
BM1684,16路高清视频智能解析
BM1684,192路高清视频智能解析
BM1684,8路高清视频智能解析
CV186AH,8路高清视频智能解析
BM1688,16路高清视频智能解析
72路全高清硬解码与智能分析
96路全高清硬解码,48路智能分析
32路高清硬解码,16路智能分析
32路高清硬解码与智能分析
32路高清硬解码与智能分析
32路高清硬解码,16路智能分析
32路高清硬解码,16路智能分析
深度学习开发者产品组合
视频实时压缩转码上云和监测异常事件,增强道路运行安全事件的发现和处置能力
为交通拥堵、行车安全、车辆违法和道路污染治理问题赋能
以国产化算力支撑海量视频的结构化解析,服务警务应用实战
以数据为中心打造“智能、协同、高效、创新”的步态识别大数据分析系统
为用户快速构建融合人、车、通行等多维数据的业务能力
算能运用自研算力硬件设备SG6/SE5/SE6,搭载SOPHON.TEAM视频分析算法,助力工业安全生产智能化
为粮仓、棉仓等大型仓储园区的办公、质检、磅房、库区等区域提供了违规行为和异常事件的安全监控方案
算能联合SOPHON.TEAM生态伙伴打造烟草行业安全生产深度学习管控解决方案
算能联合SOPHON.TEAM生态伙伴,以自研国产化深度学习算力产品为硬件底座,构建安全生产管理体系,提高白酒企业安全生产管理水平
算能联合SOPHON.TEAM生态伙伴构建智算中心解决方案,建设统一管理和调度的云边协同的智算中心
算能联合SOPHON.TEAM生态共同构建了一套以自研国产化深度学习算力产品为硬件底座,以AutoML零代码自动化深度学习训练平台为基础,实现快速、高效的深度学习工程化落地
transpose所做的工作是将一个数组进行换轴操作。对于多维数组,其包含多个轴,比如常用的四维数据就有四个索引维度,而transpose做的是按照多维数组的轴的索引进行变换。
typedef struct {
int N, C, H, W;
int order[4];
unsigned long long output_addr;
unsigned long long input_addr;
} __attribute__((packed)) param_t;
说明:
N, C, H, W: 指定了四个维度的具体大小;
order[4]: 指定了换轴的参数,例如order={0,2,3,1}则指出了张量从{0, 1, 2, 3}的索引顺序变为(0, 2, 3, 1), 即从N*C*H*W变为N*H*W*C;
output_addr:输出数据的地址(global memory);
input_addr: 输入数据的地址(global memory);
可以参考“okkernel/host/transpose.cpp”中的transpose函数,该函数计算的结果将用于与device端输出结果进行比较,判断device端输出的结果是否正确:
void transpose(const T *input, T *buffer, const int *input_shape, const int *trans_order, const int *trans_shape, const int shape_dims) { for (int n = 0; n < input_shape[0]; n++) { for (int c = 0; c < input_shape[1]; c++) { for (int h = 0; h < input_shape[2]; h++) { for (int w = 0; w < input_shape[3]; w++) { int nchw[4] = {n, c, h, w}; int dst_idx = nchw[trans_order[0]] * trans_shape[1] * trans_shape[2] * trans_shape[3] + nchw[trans_order[1]] * trans_shape[2] * trans_shape[3] + nchw[trans_order[2]] * trans_shape[3] + nchw[trans_order[3]]; int src_idx = n * input_shape[1] * input_shape[2] * input_shape[3] + c * input_shape[2] * input_shape[3] + h * input_shape[3] + w; buffer[dst_idx] = input[src_idx]; } } } } }
数据在内存中按章N-C-H-W维度顺序存放,遍历n*c*h*w个数据,为每个数据 input[src_idx]寻找转换后的索引dst_idx,将其放入buffer的相应位置buffer[dst_idx],完成transpose过程。
比如一个NCHW=(2, 5, h, w)的张量,其送到tpu上示意图如左侧所示,如果order[4]={1, 0, 2, 3},则输出张量为(5, 2, h, w),最简单的思路是先利用gdmaS2L将索引N=0的张量数据送入tpu,再采用gdmaL2S送出,通过设置合理的stride实现合理的输出位置,随后再处理索引N=1的张量数据。