c++和cuda混合编程 实现传统神经网络
直接放代码了。。。
实现的是x1+x2=y的预测,但梯度下降很慢。。。233333,gpu运行时间很快!!
//
// main.cpp
// bp
//
// Created by jzc on 2018/4/18.
// Copyright © 2018年 jzc. All rights reserved.
//
#include <stdio.h>
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <math.h>
#include <fstream>
#include <cuda_runtime.h>
using namespace std;
#define DATASIZE 10000
#define TESTSIZE 100
#define NEURESIZE 50
#define RW 0.1
#define EPOCH 1000
#define E 2.71828
//打印设备信息
void printDeviceProp(const cudaDeviceProp &prop)
{
printf("Device Name : %s.\n", prop.name);
printf("totalGlobalMem : %ld.\n", prop.totalGlobalMem);
printf("sharedMemPerBlock : %ld.\n", prop.sharedMemPerBlock);
printf("regsPerBlock : %d.\n", prop.regsPerBlock);
printf("warpSize : %d.\n", prop.warpSize);
printf("memPitch : %ld.\n", prop.memPitch);
printf("maxThreadsPerBlock : %d.\n", prop.maxThreadsPerBlock);
printf("maxThreadsDim[0 - 2] : %d %d %d.\n", prop.maxThreadsDim[], prop.maxThreadsDim[], prop.maxThreadsDim[]);
printf("maxGridSize[0 - 2] : %d %d %d.\n", prop.maxGridSize[], prop.maxGridSize[], prop.maxGridSize[]);
printf("totalConstMem : %ld.\n", prop.totalConstMem);
printf("major.minor : %d.%d.\n", prop.major, prop.minor);
printf("clockRate : %d.\n", prop.clockRate);
printf("textureAlignment : %ld.\n", prop.textureAlignment);
printf("deviceOverlap : %d.\n", prop.deviceOverlap);
printf("multiProcessorCount : %d.\n", prop.multiProcessorCount);
} //CUDA 初始化
bool InitCUDA()
{
int count; //取得支持Cuda的装置的数目
cudaGetDeviceCount(&count); if (count == ) {
fprintf(stderr, "There is no device.\n");
return false;
} int i; for (i = ; i < count; i++) { cudaDeviceProp prop;
cudaGetDeviceProperties(&prop, i);
//打印设备信息
printDeviceProp(prop); if (cudaGetDeviceProperties(&prop, i) == cudaSuccess) {
if (prop.major >= ) {
break;
}
}
} if (i == count) {
fprintf(stderr, "There is no device supporting CUDA 1.x.\n");
return false;
} cudaSetDevice(i); return true;
}
void init(int num,int range,double a[],double offset){
for(int i=;i<num;i++){
a[i] = (double)(rand()%(range*)/1000.0) - offset;
}
} void getM(int num,double a[],double m[]){
m[] = m[] = 0.0;
for(int i=;i<num;i++){
if(a[i]<m[]){
m[] = a[i];
}else if(a[i]>m[]){
m[] = a[i];
}
}
} void normalize(int num,double a[],double m[]){
for(int i =;i<num;i++){
a[i] = (a[i]-m[]+)/(m[]-m[]+);
}
} void renorm(int num,double a[],double m[]){
for(int i =;i<num;i++){
a[i] = a[i]*(m[]-m[]+) + m[] - ;
}
} void printArray(int num,double a[]){
for(int i=;i<num;i++){
printf("%6.4lf ",a[i]);
if((i+)%==){
cout<<endl;
}
}
} __global__ static void hidenLayer(double x1,double x2,double w1[],double w2[],double yh[]){
/*for(int i=0;i<NEURESIZE;i++){
yh[i] = w1[i]*x1 + w2[i]*x2;
yh[i] = 1/(1+pow(E,0-yh[i]));
}*/
const int tid = threadIdx.x;
int i =tid;
yh[i] = w1[i]*x1 + w2[i]*x2;
yh[i] = /(+pow(E,-yh[i]));
} double outLayer(double yh[],double v[]){
double y2;
for(int i=;i<NEURESIZE;i++){
y2 += yh[i] * v[i];
}
y2 = /(+pow(E,-y2));
return y2; } __global__ static void update(double x1[],double x2[],double yh[],double v[],double w1[],double w2[],double *loss){
const int tid = threadIdx.x;
int i = tid;
/*for(int i=0;i<NEURESIZE;i++){
w1[i] += x1[i] * (1-x1[i]) * loss * RW;
w2[i] += x2[i] * (1-x2[i]) * loss * RW;
v[i] += yh[i] * loss * RW;
}*/
w1[i] += x1[i] * (-x1[i]) * (*loss) * RW;
w2[i] += x2[i] * (-x2[i]) * (*loss) * RW;
v[i] += yh[i] * (*loss) * RW;
} /*double test(double w1[],double w2[],double v[],double m1[],double m2[],double my[]){
double tx1[TESTSIZE],tx2[TESTSIZE],ty[TESTSIZE],tyh[NEURESIZE],ty2[TESTSIZE];
double avLoss = 0.0; init(TESTSIZE,10,tx1,0.0);
init(TESTSIZE,10,tx2,0.0); for(int i=0;i<TESTSIZE;i++){
ty[i] = tx1[i] + tx2[i];
}
normalize(TESTSIZE,tx1,m1);
normalize(TESTSIZE,tx2,m2);
for(int q=0;q<TESTSIZE;q++){
hidenLayer(tx1[q],tx2[q],w1,w2,tyh);
ty2[q] = outLayer(tyh,v);
} renorm(TESTSIZE,ty2,my);
for(int i=0;i<TESTSIZE;i++){
if(i<10){
printf("%2d y=%2.4f y2=%2.4f\n",i,ty[i],ty2[i]);
}
avLoss += pow(ty[i]-ty2[i],2);
}
avLoss /= TESTSIZE;
//cout<<avLoss<<endl;
return avLoss;
}*/ int main(){
ofstream outf;
outf.open("trainloss.txt");
srand( (unsigned)time(NULL) );
long starttime = clock();
double x1[DATASIZE],x2[DATASIZE],y[DATASIZE],y2[DATASIZE];
double w1[NEURESIZE],w2[NEURESIZE],v[NEURESIZE],yh[NEURESIZE];
double m1[],m2[],my[];
double cLoss,realLoss,minTrainLoss = 1.0,minTestLoss = 1.0;
init(DATASIZE,,x1,0.0);
init(DATASIZE,,x2,0.0);
init(NEURESIZE,,w1,1.0);
init(NEURESIZE,,w2,1.0);
init(NEURESIZE,,v,1.0); for(int i=;i<DATASIZE;i++){
y[i] = x1[i] + x2[i];
} //CUDA 初始化
if (!InitCUDA()) {
return ;
}
//cudaMalloc 取得一块显卡内存
double *x1_g,*x2_g,*y_g,*y2_g;
double *w1_g,*w2_g,*v_g,*yh_g;
double *cLoss_g;
cudaMalloc((void**)&x1_g, sizeof(double)* DATASIZE);
cudaMalloc((void**)&x2_g, sizeof(double)* DATASIZE);
cudaMalloc((void**)&y_g, sizeof(double)* DATASIZE);
cudaMalloc((void**)&y2_g, sizeof(double)* DATASIZE);
cudaMalloc((void**)&w1_g, sizeof(double)* NEURESIZE);
cudaMalloc((void**)&w2_g, sizeof(double)* NEURESIZE);
cudaMalloc((void**)&v_g, sizeof(double)* NEURESIZE);
cudaMalloc((void**)&yh_g, sizeof(double)* NEURESIZE);
cudaMalloc((void**)&cLoss_g, sizeof(double)); //cudaMemcpy 将产生的随机数复制到显卡内存中
//cudaMemcpyHostToDevice - 从内存复制到显卡内存
//cudaMemcpyDeviceToHost - 从显卡内存复制到内存
cudaMemcpy(w1_g,w1, sizeof(double)*NEURESIZE, cudaMemcpyHostToDevice);
cudaMemcpy(w2_g,w2, sizeof(double)*NEURESIZE, cudaMemcpyHostToDevice);
cudaMemcpy(v_g,v, sizeof(double)*NEURESIZE, cudaMemcpyHostToDevice);
cudaMemcpy(x1_g,x1, sizeof(double)*DATASIZE, cudaMemcpyHostToDevice);
cudaMemcpy(x2_g,x2, sizeof(double)*DATASIZE, cudaMemcpyHostToDevice);
cudaMemcpy(y_g,y, sizeof(double)*DATASIZE, cudaMemcpyHostToDevice);
cudaMemcpy(yh_g,yh, sizeof(double)*NEURESIZE, cudaMemcpyHostToDevice);
cudaMemcpy(cLoss_g,&cLoss, sizeof(double), cudaMemcpyHostToDevice); getM(DATASIZE,x1,m1);
getM(DATASIZE,x2,m2);
getM(DATASIZE,y,my);
normalize(DATASIZE,x1,m1);
normalize(DATASIZE,x2,m2);
normalize(DATASIZE,y,my); for(int j=;j<EPOCH;j++){
double tLoss = 0.0;
for(int i=;i<DATASIZE;i++){
hidenLayer<< < , NEURESIZE, >> >(x1_g[i],x2_g[i],w1_g,w2_g,yh_g);
cudaMemcpy(yh,yh_g, sizeof(double)*NEURESIZE, cudaMemcpyDeviceToHost);
cudaMemcpy(v,v_g, sizeof(double)*NEURESIZE, cudaMemcpyDeviceToHost);
y2[i] = outLayer(yh,v);
cLoss = y2[i] * (-y2[i]) * (y[i]-y2[i]);
cudaMemcpy(cLoss_g,&cLoss, sizeof(double), cudaMemcpyHostToDevice);
update<< < , NEURESIZE, >> >(x1_g,x2_g,yh_g,v_g,w1_g,w2_g,cLoss_g);
cudaMemcpy(&cLoss,cLoss_g, sizeof(double)*NEURESIZE, cudaMemcpyDeviceToHost);
cLoss = pow(cLoss,);
cLoss = cLoss*(my[]-my[]+);
tLoss += cLoss;
}
tLoss /= DATASIZE;
if(tLoss<minTrainLoss){
minTrainLoss = tLoss;
}
printf("EPOCH--%d, trainLoss--%0.4f\n",j,tLoss);
outf<<j<<"\t"<<tLoss<<endl; /*cudaMemcpy(w1,w1_g, sizeof(double)*NEURESIZE, cudaMemcpyDeviceToHost);
cudaMemcpy(w2,w2_g, sizeof(double)*NEURESIZE, cudaMemcpyDeviceToHost);
cudaMemcpy(v,v_g, sizeof(double)*NEURESIZE, cudaMemcpyDeviceToHost);
double avLoss = test(w1,w2,v,m1,m2,my);
printf("EPOCH--%d, avLoss--%0.4f\n",j,avLoss);
if(avLoss<minTestLoss){
minTestLoss = avLoss;
}*/
cout<<"------------------"<<endl;
}
printf("minTrainLoss--%0.4f\n",minTrainLoss);
//printf("minTestLoss--%0.4f\n",minTestLoss);
outf.close(); //Free
cudaFree(x1_g);
cudaFree(x2_g);
cudaFree(y_g);
cudaFree(w1_g);
cudaFree(w2_g);
cudaFree(v_g);
cudaFree(yh_g);
cudaFree(cLoss_g); long endtime = clock()-starttime;
float execution_time = (float)endtime / ( * );
cout << "total time cost: " << execution_time<<endl; return ;
}
c++和cuda混合编程 实现传统神经网络的更多相关文章
- mpi和cuda混合编程的正确编译
针对大数据的计算,很多程序通过搭建mpi集群进行加速,并取得了很好的效果.算法内部的加速,当前的并行化趋势是利用GPU显卡进行算法加速.针对并行性非常好的算法,GPU加速效果将远大于集群带来的加速效果 ...
- 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...
- Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)
原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之——找出Matlab内置函数中,已经大概的介绍了mat ...
- CUDA+OpenGL混合编程
CUDA+OpenGL混合编程示例: #include <stdio.h> #include <stdlib.h> #include "GL\glew.h" ...
- [转载:]C#与Fortran混合编程之本地调用Fortran动态链接库
前言 C#发展到现在,已是一门相当完善的语言,他基于C语言风格,演化于C++.并依靠强大的.NET底层框架.C#可以用来快速构建桌面及Web应用.然而在我们的实际工作中,尽管C#已经非常完善,但还是不 ...
- Matlab与.NET基于类型安全的接口混合编程入门
原文:[原创]Matlab与.NET基于类型安全的接口混合编程入门 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ...
- Matlab与.NET混合编程解决人脸识别问题
原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ht ...
- 通过混合编程分析的方法和机器学习预测Web应用程序的漏洞
通过混合编程分析的方法和机器学习预测Web应用程序的漏洞 由于时间和资源的限制,web软件工程师需要支持识别出有漏洞的代码.一个实用的方法用来预测漏洞代码可以提高他们安全审计的工作效率.在这篇文章中, ...
- Android程序中,内嵌ELF可执行文件-- Android开发C语言混合编程总结
前言 都知道的,Android基于Linux系统,然后覆盖了一层由Java虚拟机为核心的壳系统.跟一般常见的Linux+Java系统不同的,是其中有对硬件驱动进行支持,以避开GPL开源协议限制的HAL ...
随机推荐
- [SOJ #112]Dirichlet 前缀和
题目大意:给定一个长度为$n$的序列$a_n$,需要求出一个序列$b_n$,满足:$$b_k=\sum\limits_{i|k}a_i$$$n\leqslant10^7$ 题解:$\mathrm{Di ...
- COGS 有标号的DAG/强连通图计数
COGS索引 一堆神仙容斥+多项式-- 有标号的DAG计数 I 考虑\(O(n^2)\)做法:设\(f_i\)表示总共有\(i\)个点的DAG数量,转移考虑枚举DAG上所有出度为\(0\)的点,剩下的 ...
- ASP.NET Core 过滤器中使用依赖注入
如何给过滤器ActionFilterAttribute也用上构造函数注入呢? 一般自定义的过滤器直接用特性方式标识就能使用 [ContentFilter] 因为构造函数在使用的时候要求传参,然后我们可 ...
- UML回顾暨课程总结
本文作为OO的最后一次博客作业,主要回顾了第四单元的架构设计和本学期的心路历程. 本单元架构设计 UML1 第一次作业的主要内容是解析mdj格式输入,记录特定数据并支持针对类.属性和方法等的查询功 ...
- Python_爬虫小实例
爬虫小实例 一.问题描述与分析 Q:查询某一只股票,在百度搜索页面的结果的个数以及搜索结果的变化. 分析: 搜索结果个数如下图: 搜索结果的变化:通过观察可以看到,每个一段时间搜索结果的个数是有所变化 ...
- Java中BIO和NIO
同步/异步.阻塞/非阻塞概念 同步异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) 同步:在发出一个 ...
- src属性与浏览器渲染
img标签 只要设置了src属性, 就会开始下载,因此可以使用这个特性,配合display:none,默默的下载一些图片,用的时候直接用,快了那么一丢丢~ 注意:不一定要添加到文档后才会开始下载,是只 ...
- Sqlite常用命令及基本知识
sqlite菜鸟教程:http://www.runoob.com/sqlite/sqlite-tutorial.html 常用命令: .sqlite3 --从dos命令模式进入sqlite命令 ...
- mysql57重新安装后无法再次启动mysql57服务“本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动。”--解决方法
本地计算机上的MySQL服务启动后停止.某些服务在未由其他服务或程序使用时将自动. (win10,mysql5.7+) 解决方法: 第一步:查看MySQL57安装路径 只要在programData路径 ...
- Android笔记(四十一) Android中的数据存储——SQLite(三)select
SQLite 通过query实现查询,它通过一系列参数来定义查询条件. 各参数说明: query()方法参数 对应sql部分 描述 table from table_name 表名称 colums s ...