Polaris Project
Polaris Manual

Introduction

Polaris是一个基于FPGA的深度学习计算库,提供了高性能的计算接口, 能够帮助开发者开发高效的深度神经网络系统。

Quick Reference

Programming Model

计算上下文(Context)

使用Polaris接口必须首先通过polaris_create_context()接口创建一个 上下文对象 (Context), 所有的Polaris接口在调用时都必须显式地指定该对象。 创建上下文对象时,用户必须指定一个 设备号 (Polaris给每一个FPGA设备分配了一个惟一的设备id,从0开始,依次递增), 用户可以通过polaris_get_devices()接口来获取满足自己需求的设备id列表,并选择一个来创建Context。

内存管理

FPGA内存与CPU内存相互独立,Polaris计算接口中所输入和输出的数据均要求是FPGA内存上的数据。

Polaris提供polaris_malloc()polaris_free()接口来进行FPGA内存的分配与释放, 同时提供polaris_memcpy()接口用来进行CPU与FPGA之间、FPGA内存之间的数据拷贝。

开发者可以选用标准GLIBC malloc()接口来分配CPU内存,但是为了获得更好的数据拷贝性能, 我们推荐使用Polaris提供的polaris_malloc_host()接口来进行CPU内存的分配。 应当注意的是,polaris_malloc_host()接口分配的内存不如标准库分配的内存灵活、便于系统管理, 因此对于不需同步的CPU内存,应当避免使用该接口。

计算接口

当前提供基础DNN模型计算的支持,具体如下:

后续计划12月份开放CNN模型计算的支持,功能如下:

返回值

设备计算函数的返回值均为PolarisStatus,正常情况下会返回POLARIS_OK

代码样例

简单的矩阵计算

#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "polaris.h"
#define CHECK_STATUS(exp) do { \
if ((exp) != POLARIS_OK) { \
assert(false); \
} \
} while(0)
int main() {
const size_t M = 512;
const size_t N = 128;
const size_t K = 1024;
// 在设备fpga0上创建Context
float* a_cpu;
float* b_cpu;
float* c_cpu;
void* a_fpga;
void* b_fpga;
void* c_fpga;
CHECK_STATUS(polaris_malloc(ctxt, M * K * sizeof(float), &a_fpga));
CHECK_STATUS(polaris_malloc(ctxt, N * K * sizeof(float), &b_fpga));
CHECK_STATUS(polaris_malloc(ctxt, M * N * sizeof(float), &c_fpga));
// 这里也可以使用polaris_malloc_host()获得更好的DMA性能
a_cpu = (float*)malloc(M * K * sizeof(float));
b_cpu = (float*)malloc(N * K * sizeof(float));
c_cpu = (float*)malloc(M * N * sizeof(float));
// 初始化 a_cpu 和 b_cpu 的值
// ...
// 将数据拷贝到fpga上
a_fpga, a_cpu, M * K * sizeof(float)));
b_fpga, b_cpu, N * K * sizeof(float)));
// SGEMM 计算
CHECK_STATUS(polaris_gemm(ctxt, POLARIS_NO_TRANS, POLARIS_TRANS, M, N, K,
1.0f,
a_fpga, POLARIS_FP32, M,
b_fpga, POLARIS_FP32, N,
0.0f,
c_fpga, POLARIS_FP32, M,
// C 矩阵拷回CPU
c_cpu, c_fpga, M * N * sizeof(float)));
// 打印 c_cpu 的内容
// ...
// 内存释放、Context销毁
CHECK_STATUS(polaris_free(ctxt, a_fpga));
CHECK_STATUS(polaris_free(ctxt, b_fpga));
CHECK_STATUS(polaris_free(ctxt, c_fpga));
free(a_cpu);
free(b_cpu);
free(c_cpu);
}

Authors

INF ISA Team isa@b.nosp@m.aidu.nosp@m..com

Copyright (C) 2017 Baidu, Inc.