Xilinx も攻めてきましたね。
エッジでは、Zynq UltraScale+ MPSoC用のソリューションとして、CHaiDNNとはちょっと違う。
下記の図は、引用です。
ランタイムも勿論、バイナリ
C++のサンプルコードを見てみると。
引用します。 int main() { //string xclbin = "kernel.xclbin"; string xclbin = "xdnn_v1_ku115_8b.xclbin"; string kernelName = "kernelSxdnn_0"; string netCfgFile = "/proj/xsjhdstaff1/aaronn/HEAD_work/OPENCL_APPS_DEV/src/ristretto_fpga/pyxdnn_test/googlenet_v1_16b_115/googlenet.fpgaaddr.64.txt"; string quantCfgFile = "googlenet_v1.json"; string dataDir = "/proj/xsjhdstaff1/aaronn/HEAD_work/OPENCL_APPS_DEV/src/ristretto_fpga/pyxdnn_test/googlenet_v1_16b_115/data"; string labelFile = "synset_words.txt"; const int fpgaOutputSize = 1024 * EXECUTOR_MAX_BATCH_SZ; const int netOutputSize = 1000; // imagenet XBLASHandle *handle = NULL; int ret = xblasCreate(handle, xclbin.c_str(), kernelName.c_str()); assert(ret == 0); vector<float> input = loadInput(dataDir); vector<float> output(fpgaOutputSize); float *inputPtr = &(input[0]); float *outputPtr = &(output[0]); // make FPGA pointer for output (inputs are auto-created) XMemPtr *cFpgaPtr = xMalloc(*handle, output.size()*sizeof(float), true); xMemcpy(*handle, outputPtr, cFpgaPtr, output.size()*sizeof(float));// load XDNN weights & create Executor XDNNScriptExecutor<float> *executor = loadExecutor( handle, dataDir, netCfgFile, quantCfgFile); // load FC weights int unused; std::string unusedStr; std::vector<float> fcWeight, fcBias; ret = readFromFile(dataDir+"/fc", unusedStr, unused, unused, unused, unused, fcWeight, false); assert(ret == 0); ret = readFromFile(dataDir+"/fc_bias", unusedStr, unused, unused, unused, unused, fcBias, false); assert(ret == 0); // run on FPGA executor->execute(inputPtr, outputPtr, /*batch_size*/1); // run FC std::vector<float> netOutput(netOutputSize); computeFC(&(fcWeight[0]), &(fcBias[0]), outputPtr, 1, netOutputSize, fpgaOutputSize, &(netOutput[0])); // run softmax softmax(netOutput); // get labels std::vector<std::string> labels = getLabels(labelFile);
の感じで、loadExecutorでウェイトをロードし、Executorを生成、その後、executeメソッドで実行。
FCとsoftmaxは、CPUで実行しているようですね。 => computeFC(これは、xdnnのライブラリ) & softmax
FCとsoftmaxは、CPUで実行しているようですね。 => computeFC(これは、xdnnのライブラリ) & softmax