在做神经网络的硬件加速时,经常会涉及浮点数在PS和PL之间的传输,简单粗暴的传输并不能得到预想的结果,如使用如下代码
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xparameters.h"
#include "xil_io.h"
#include "stdlib.h"
int main()
{
int i;
float ft;
init_platform();
for(i=0;i<10;i++){
ft=(rand()%100)/100.0;
printf("%f\n",ft);
Xil_Out32(XPAR_BRAM_0_BASEADDR+i*4,(u32)ft);
}
printf("read from bram:\n");
for(i=0;i<10;i++){
float rev=(float)Xil_In32(XPAR_BRAM_0_BASEADDR+i*4);
//float frev=*((float*)&rev);
printf("%f\n",rev);
}
cleanup_platform();
return 0;
}
运行结果是错误的:
正确方法如下:
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xparameters.h"
#include "xil_io.h"
#include "stdlib.h"
int main()
{
int i;
float ft;
init_platform();
for(i=0;i<10;i++){
ft=(rand()%100)/100.0;
printf("%f\n",ft);
Xil_Out32(XPAR_BRAM_0_BASEADDR+i*4,*((u32*)&ft));
}
printf("read from bram:\n");
for(i=0;i<10;i++){
u32 rev=Xil_In32(XPAR_BRAM_0_BASEADDR+i*4);
float frev=*((float*)&rev);
printf("%f\n",frev);
}
cleanup_platform();
return 0;
}
得到正确的结果: