SRA3-40是一款面向高性能计算的RISC-V通用服务器,国产主控具备强劲性能,融合智算,支持强编解码。
SRB3-40是一款高性能的RISC-V存储服务器,多盘位大容量安全存储。
智算服务器SGM7-40,适配主流LLM,单卡可运行70B的大语言模型
SOM1684,搭载算能BM1684,支持16路高清视频分析
Core-1684-JD4,搭载算能BM1684,支持16路高清视频分析
SBC-6841,搭载算能BM1684,支持16路高清视频分析
iCore-1684XQ,搭载算能BM1684X,支持32路高清视频分析
Core-1684XJD4,搭载算能BM1684X,支持32路高清视频分析
Shaolin PI SLKY01,搭载算能BM1684,支持16路高清视频分析
QY-AIM16T-M,搭载算能BM1684,支持16路高清视频分析
QY-AIM16T-M-G,搭载算能BM1684,支持16路高清视频分析
QY-AIM16T-W,搭载算能BM1684,支持16路高清视频分析
AIV02T,PCIE板卡,1684*2,半高半长
IVP03X,搭载算能BM1684X,支持32路高清视频分析
IVP03A,微服务器 被动散热,12GB内存
Coeus-3550T,搭载算能BM1684,支持16路高清视频分析
EC-1684JD4,搭载算能BM1684,支持16路高清视频分析
CSA1-N8S1684,算力集群服务器,BM1684*8,1U
DZFT-ZDFX,ARM+DSP智能封条分析,搭载算能BM1684X
ZNFX-32,搭载算能BM1684,支持16路高清视频分析
ZNFX-8,ARM+DSP架构,隔爆兼本安分析装置符合煤安要求,搭载BM1684X
EC-A1684JD4,微服务器主动散热,16GB内存,32GB eMMC
EC-A1684JD4 FD,搭载算能BM1684,支持16路高清视频分析,16GB内存,32GB eMMC
EC-A1684XJD4 FD,搭载算能BM1684X,支持32路高清视频分析
ECE-S01,搭载算能BM1684,支持16路高清视频分析
IOEHM-AIRC01,微服务器,主动散热,搭载算能BM1684,支持16路高清视频分析
IOEHM-VCAE01,搭载算能BM1684,支持16路高清视频分析
CSA1-N8S1684X,算力集群服务器,BM1684X*8,1U
QY-S1U-16,1U版本BM1684盒子
QY-S1U-192,算力集群服务器,BM1684*12,1U
QY-S1X-384,算力集群服务器,BM1684X*12,1U
为交通拥堵、行车安全、车辆违法和道路污染治理问题赋能
利用深度学习云边结合方式解决全域多家餐饮机构的食品安全监管需求,为政府、企业级公众打造监督闭环
对生产全过程、全方位实时感知与精细化监管,推进应急监测智能化,赋能风险识别预警
以云边协同的新型算力基础设施赋能各类数字城市场景,为数字经济发展提供源动力
以自动化训练推理一体化平台为基础,助力算力/算法整合应用快速、高效工程化落地
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的张量数据。