CUDA学习--一维矩阵的加
2015-12-13 21:52
381 查看
//实现一个一维1*16的小矩阵的加法。
//矩阵大小:1*16
//分配一个block,共有16个线程并发。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <cuda_runtime.h>
#include <cutil.h>
#define VEC_SIZE 16
//kernel function
__global__ void vecAdd(float* d_A,float* d_B,float* d_C)
{
int index=threadIdx.x;
d_C[index]=d_A[index]+d_B[index];
}
int main()
{
//得到分配空间的大小
size_t size=VEC_SIZE*sizeof(float);
//为本地分配内存
float* h_A=(float*)malloc(size);
float* h_B=(float*)malloc(size);
float* h_C=(float*)malloc(size);
//初始化
for (int i=0;i<VEC_SIZE;++i)
{
h_A[i]=1.0;
h_B[i]=2.0;
}
//将本地内存的中的数据复制到设备中
float* d_A;
cudaMalloc((void**)&d_A,size);
cudaMemcpy(d_A,h_A,size,cudaMemcpyHostToDevice);
float* d_B;
cudaMalloc((void**)&d_B,size);
cudaMemcpy(d_B,h_B,size,cudaMemcpyHostToDevice);
//分配存放结果的空间
float* d_C;
cudaMalloc((void**)&d_C,size);
//定义16个线程
dim3 dimblock(16);
vecAdd<<<1,dimblock>>>(d_A,d_B,d_C);
//讲计算结果复制回主存中
cudaMemcpy(h_C,d_C,size,cudaMemcpyDeviceToHost);
//输出计算结果
for (int j=0;j<VEC_SIZE;++j)
{
printf("%f/t",h_C[j]);
}
//释放主机和设备内存
cudaFree(d_A);
cudaFree(d_B);
cudaFree(d_C);
free(h_A);
free(h_B);
free(h_C);
return 0;
}
//矩阵大小:1*16
//分配一个block,共有16个线程并发。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <cuda_runtime.h>
#include <cutil.h>
#define VEC_SIZE 16
//kernel function
__global__ void vecAdd(float* d_A,float* d_B,float* d_C)
{
int index=threadIdx.x;
d_C[index]=d_A[index]+d_B[index];
}
int main()
{
//得到分配空间的大小
size_t size=VEC_SIZE*sizeof(float);
//为本地分配内存
float* h_A=(float*)malloc(size);
float* h_B=(float*)malloc(size);
float* h_C=(float*)malloc(size);
//初始化
for (int i=0;i<VEC_SIZE;++i)
{
h_A[i]=1.0;
h_B[i]=2.0;
}
//将本地内存的中的数据复制到设备中
float* d_A;
cudaMalloc((void**)&d_A,size);
cudaMemcpy(d_A,h_A,size,cudaMemcpyHostToDevice);
float* d_B;
cudaMalloc((void**)&d_B,size);
cudaMemcpy(d_B,h_B,size,cudaMemcpyHostToDevice);
//分配存放结果的空间
float* d_C;
cudaMalloc((void**)&d_C,size);
//定义16个线程
dim3 dimblock(16);
vecAdd<<<1,dimblock>>>(d_A,d_B,d_C);
//讲计算结果复制回主存中
cudaMemcpy(h_C,d_C,size,cudaMemcpyDeviceToHost);
//输出计算结果
for (int j=0;j<VEC_SIZE;++j)
{
printf("%f/t",h_C[j]);
}
//释放主机和设备内存
cudaFree(d_A);
cudaFree(d_B);
cudaFree(d_C);
free(h_A);
free(h_B);
free(h_C);
return 0;
}
相关文章推荐
- Nginx配置文件详细说明
- 《失落的世纪致富经典》卷二:1致富就是遵照“既定的法则”做事
- Objective-C内存管理第五弹:自动释放池
- leetcode -- Subsets I &II-- 重点,求0,1序列
- 字节序、比特序(二)----结构体的传输
- QT初级错误:继承于QMainwindow的窗口需调用setCentralWidget
- Jenkins学习——Jenkins是什么
- openstack python api 开发
- Android基础的sharedPreferences存储,ListView,以及httpclient,和asynchttp框架请求的使用
- uva_10922
- 命名
- Jenkins学习——Jenkins是什么
- ASP.NET学习感悟
- Android实践项目汇报(总结)-修改
- 【C++】计算所有小于N的勾股数组合,可以写入txt文件保存,每组占一行。
- 我的电磁学讲义17:电介质
- matlab:如何把一个文件夹中的所有文件名提出来
- mac 显示隐藏 隐藏文件的命令
- java自定义List链表
- RESTORE数据时10G+ASM遇到ORA-4031及ORA-00600 KSSRMP1错误