c/c++
c/c++开发
FPGA硅农
数字IC设计,FPGA开发
展开
-
频域抽取FFT(DIF-FFT)的C语言实现
此处以基2频域抽取FFT为例,讲述频域抽取FFT的原理。假设FFT的长度为N2m,我们将序列xXkn0∑N/2−1xnWNnknN/2∑N−1xnWNnknnN/2Xkn0∑N/2−1xnWNnkn0∑N/2−1xnN/2WNknN/2由于WNknN/2WNkn⋅WNN/2−WNnkXk。原创 2023-04-23 13:28:15 · 1655 阅读 · 0 评论 -
C++实现彩色bmp图片转灰度图
BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。原创 2022-12-02 14:47:56 · 2369 阅读 · 0 评论 -
基于C++的Winograd卷积实现(分片+乒乓)
#include<stdio.h>#include<iostream>#define M 2#define R 3#define N (M+R-1)#define Tm 8#define Tn 4#define Tr 8#define Tc 8using namespace std;typedef float data_t;/*A^T = [1 1 1 00 1 - 1 1]G = [1 0 00.5 0.5 0.5原创 2021-09-04 16:50:56 · 749 阅读 · 0 评论 -
C语言中的字节对齐
在硬件开发中,有时为了提高系统性能,需要数组等数据结构按照指定字节对齐,在这里对字节对齐作一个简单总结:1.__declspec(align(#))该方法可以指定定义的数据按照#字节对齐,#必须是2的幂,例如__declspec(align(32)) char p1[1000];cout<<((int64_t)p1)%32<<endl;上面的数组p1,其起始地址就是32字节对齐的,可以预见,打印结果应为02._aligned_malloc(或者memalign原创 2021-08-20 20:11:26 · 1095 阅读 · 0 评论 -
2D FFT、RFFT的C语言实现
#include<iostream>#include<complex.h>#include<math.h>#define PI 3.14159#define N 8#define STAGE ((int)(log(N)/log(2)))using namespace std;typedef complex<double> data_t;void FFT(data_t Xin[N],data_t Xout[N]){ //旋转因子原创 2021-05-31 23:54:31 · 1869 阅读 · 7 评论 -
C语言实现FFT(非递归蝶形运算版)
蝶形算法可参考链接代码如下:#include<iostream>#include<complex.h>#include<math.h>#define PI 3.14159#define N 32#define STAGE ((int)(log(N)/log(2)))using namespace std;typedef complex<double> data_t;void FFT(data_t Xin[N],data_t Xout[N]原创 2021-05-28 21:41:18 · 1354 阅读 · 0 评论 -
C语言实现FFT(递归版)
#include<iostream>#include<complex.h>#include<math.h>#define PI 3.14159#define FFT_LENGTH 16using namespace std;void FFT(complex<double>* Xin,complex<double> *Xout,int N){ if(N<2) Xout[0]=Xin[0]; els原创 2021-05-28 20:31:33 · 774 阅读 · 0 评论 -
基于C++的BNN推理
BNN的训练由pytorch完成,权重和激活均被量化为-1和1,padding时补-1,为了能在硬件上进行部署,推理时作了如下变换:-1由0代替,1由1代替,乘法由同或运算代替,为了使乘累加的和不变(之前-1x-1=1,1x1=1,1x-1=-1,但是现在1 xnor 1=1,0 xnor 0=1,1 xnor 0=0),需要对最后卷积的结果进行修改:conv_out=2∗xnor_conv(x,w)−ch_in∗k∗k+biasconv\_out=2*xnor\_conv(x,w)-ch\_in*k*原创 2021-02-22 15:34:21 · 725 阅读 · 1 评论 -
基于c++的int8量化推理
训练代码:from __future__ import absolute_importfrom __future__ import divisionfrom __future__ import print_functionimport torchimport torch.nn as nnimport torch.nn.functional as Ffrom torch.nn import initfrom torch.nn.parameter import Parameterfrom t原创 2021-02-18 11:43:25 · 1079 阅读 · 3 评论 -
卷积运算的im2col实现
#include <stdio.h>#include <windows.h>#include<iostream>using namespace std;typedef double dtype;void kernel_reshape(dtype* weight_in,dtype* weight_out,int K,int C,int N) //N*K*K*C->(K*K*C)*N{ for(int i=0;i<N;i++)原创 2021-02-10 23:40:51 · 745 阅读 · 0 评论 -
素数的测定
强伪素数的定义,如下:则容易知道,满足条件的n有可能是素数也有可能是合数(强伪素数),但是不满足条件的一定是合数。我们又有以下定理所以当返回为真时,它为合数错误的概率小于1/4,当返回为假时,必为合数,那么重复调用k次返回为真时,该数为合数的概率应该小于14k\dfrac{1}{4^k}4k1,只要k取10,错误概率就小于百万分之一。整个代码如下:#include<iostream>#include<cstdlib>#include<ctime>#in原创 2020-11-02 20:45:18 · 270 阅读 · 0 评论 -
矩阵乘法脉动阵列的C++模拟
自从谷歌的TPU问世以后,被人们遗忘很久的脉动阵列又再次火了一把。矩阵乘法就可以用脉动阵列进行计算,而脉动阵列这种数据流又特别适合用硬件进行实现。下面是用脉动阵列进行矩阵乘法的示意图。可以看到,A的每一行不是同时进入脉动阵列的,而B的每一列也不是同时进入脉动阵列的,相邻行或列进入脉动阵列的时间恰好相差一个时钟周期。以下是用c++模拟脉动阵列的代码:#include <iostream>#include <cstdlib>#include <ctime>原创 2020-10-30 20:57:13 · 1095 阅读 · 1 评论 -
ShiDianNao的c++实现
#include"cfg.h"#include<iostream>#include<cstdlib>#include<ctime>using namespace std;class PE{public: int weight; int feature; int acc;public: void calc(){ acc+=weight*feature; return; }};class原创 2020-10-27 11:01:29 · 246 阅读 · 0 评论 -
N皇后问题的拉斯维加斯算法和回溯算法
#include<iostream>#include<cstdlib>#include<ctime>#define N 8using namespace std;int T[100]; //(i,T[i])指放在第i行第T[i]�?int k=0; //当前已经放置了多少行bool place(int j);void backtrace(){ //当前已经放置完第1,2,3...k行,从第k+1行开始回�?原创 2020-10-22 15:50:40 · 1080 阅读 · 0 评论 -
EIE稀疏矩阵乘法硬件模拟
#include<iostream>#include<cstdlib>#include<ctime>#include <iomanip>using namespace std;typedef int dtype;typedef struct CSC{ int a; //存储非零元素个数 int n; //存储列数 dtype* v; //存储非零值原创 2020-10-19 16:17:38 · 353 阅读 · 0 评论 -
稀疏矩阵CSR存储的C++实现
实现了稀疏矩阵的生成(指定稀疏程度)、稀疏矩阵转换为CSR、从CSR中恢复出矩阵、稀疏矩阵和向量的乘法等功能。从运行结果来看,稀疏矩阵存储为CSR格式和向量相乘的运行速度快于普通矩阵向量乘法,而且稀疏程度越高,优势越明显。#include<iostream>#include<cstdlib>#include<ctime>#include<stdio.h>typedef int dtype;using namespace std;void csr_原创 2020-10-16 20:53:11 · 4658 阅读 · 2 评论 -
生成不重复的随机数
问题:生成[0,N-1]区间内的n个互不相同的随机数。解决思路:首先,生成一个长度为N的数组,然后将其打乱,取前n个数,即为上述问题的解。为了验证上述方法产生的随机数是符合要求的,我们用下面的方法来检验。每次随机的从[0,N-1]中选取n个数,记它们的和为X,则X的期望可以计算如下:这样选取n个数总共有CNnC_N^nCNn中取法,这么多取法总共取出了CNn∗nC_N^n*nCNn∗n个数,而0,1,2,…N-1这N个数出现的概率是相同的,因此每个数出现了n∗CNnN\dfrac{n*C_N^n原创 2020-10-07 21:38:02 · 1048 阅读 · 0 评论 -
有序表搜索
#include<iostream>#include<algorithm>#include<ctime>#include<cstdlib>#include<set>#pragma GCC optimize("Ofast")using namespace std;int rand_int(int a,int b);void non_repeat(int n,int *a){ set<int> s; wh原创 2020-10-07 19:58:04 · 324 阅读 · 0 评论 -
矩阵乘法在不同平台上的运行时间
出于对并行计算的兴趣,我尝试了CPU、GPU CUDA、GPU CUDA CUBLAS这三种方式进行矩阵乘法的计算。一、CPU#include<stdio.h>#include<stdlib.h>#include<time.h>//#pragma GCC optimize(3)#define R_SIZE 256*8int main(){ int* a=(int*)malloc(R_SIZE*R_SIZE*sizeof(int)); int* b=(原创 2020-08-13 12:14:56 · 893 阅读 · 0 评论