CUDA 例程

scalar add

#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <iostream>
__global__ void add(int *a, int *b,int *c)
{
c[blockIdx.x]=a[blockIdx.x]+b[blockIdx.x];
}
int main(void)
{ // H has storage for 4 integers
int a,b,c;
int *da,*db,*dc;
int size=1*sizeof(int); //scalar;
cudaMalloc((void**)&da,size);
cudaMalloc((void**)&db,size);
cudaMalloc((void**)&dc,size);

a=2;
b=7;
cudaMemcpy(da,&a,size,cudaMemcpyHostToDevice);
cudaMemcpy(db,&b,size,cudaMemcpyHostToDevice);

add<<<1,1>>>(da,db,dc);
cudaMemcpy(&c,dc,size,cudaMemcpyDeviceToHost );
std::cout<<c<<std::endl;

cudaFree(da);
cudaFree(db);
cudaFree(dc);

std::cout<<"hell";
thrust::host_vector<int> H(4);
// initialize individual elements
H[0] = 14; H[1] = 20; H[2] = 38; H[3] = 46;
// H.size() returns the size of vector H
std::cout << "H has size " << H.size() << std::endl;
// print contents of H
for(int i = 0; i < H.size(); i++) std::cout << "H[" << i << "] = " << H[i] << std::endl;
// resize H
H.resize(2);
std::cout << "H now has size " << H.size() << std::endl;
// Copy host_vector H to device_vector D
thrust::device_vector<int> D = H;
// elements of D can be modified
D[0] = 99; D[1] = 88; // print contents of D
for(int i = 0; i < D.size(); i++) std::cout << "D[" << i << "] = " << D[i] << std::endl;
// H and D are automatically deleted when the function returns
return 0; }
block or thread

#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <iostream> 

const int N=512;
__global__ void add(int *a, int *b,int *c)
{
c[blockIdx.x]=a[blockIdx.x]+b[blockIdx.x];      //c[threadIdx.x]=a[threadIdx.x]+b[threadIdx.x];
}
int main(void)
{ // H has storage for 4 integers
int *a,*b,*c;
int *da,*db,*dc;
int size=N*sizeof(int); //scalar;

cudaMalloc((void**)&da,size);
cudaMalloc((void**)&db,size);
cudaMalloc((void**)&dc,size);

a=(int *) malloc(size);
memset(a,0,N*sizeof(int));//rand_ints(a,N);

a[0]=10;
a[3]=3;
b=(int *) malloc(size);  memset(b,0, N*sizeof(int));// rand_ints(b,N);
b[0]=2;
b[4]=32;

c=(int *) malloc(size); //rand_ints(c,N);
memset(c,0, N*sizeof(int));

cudaMemcpy(da,a,size,cudaMemcpyHostToDevice);
cudaMemcpy(db,b,size,cudaMemcpyHostToDevice);

add<<<N,1>>>(da,db,dc);               //N blocks  add<<<1,N>>>(da,db,dc);   N threads
cudaMemcpy(c,dc,size,cudaMemcpyDeviceToHost ); for (int i=0; i<20;i++) std::cout<<c[i]<<std::endl; //_syncthreads(); //useless cudaDeviceSynchronize(); free(a); free(b); free(c); cudaFree(da); cudaFree(db); cudaFree(dc); return 0; }
block+thread#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <iostream> 

/*

#define N (2048*2048)
#define M 512 // THREADS_PER_BLOCK

add<<<N/M, M>>>(d_a, d_b, d_c);

N /M      blocks usedM   threads / block*/

const int N=2048*2048;
const int M=512;
__global__ void add(int *a, int *b,int *c,int n)
{
int index=threadIdx.x+blockIdx.x*blockDim.x;
c[index]=a[index]+b[index];
if (index<n)
  c[index]=a[index]+b[index];
//c[threadIdx.x]=a[threadIdx.x]+b[threadIdx.x];
}
int main(void)
{ // H has storage for 4 integers
int *a,*b,*c;
int *da,*db,*dc;
int size=N*sizeof(int); //scalar;

cudaMalloc((void**)&da,size);
cudaMalloc((void**)&db,size);
cudaMalloc((void**)&dc,size);

a=(int *) malloc(size);
memset(a,0,N*sizeof(int));//rand_ints(a,N);

a[0]=10;
a[3]=3;
b=(int *) malloc(size);  memset(b,0, N*sizeof(int));// rand_ints(b,N);
b[0]=2;
b[4]=32;

c=(int *) malloc(size); //rand_ints(c,N);
memset(c,0, N*sizeof(int));

cudaMemcpy(da,a,size,cudaMemcpyHostToDevice);
cudaMemcpy(db,b,size,cudaMemcpyHostToDevice);

add<<<(N+M-1)/M,M>>>(da,db,dc,N);
cudaMemcpy(c,dc,size,cudaMemcpyDeviceToHost );
for (int i=0; i<20;i++)
std::cout<<c[i]<<std::endl;

//_syncthreads();

//useless
cudaDeviceSynchronize();

free(a);
free(b);
free(c);
cudaFree(da);
cudaFree(db);
cudaFree(dc);

return 0; }

CUDA 例程

时间: 2024-10-09 10:36:52

CUDA 例程的相关文章

CudaDeviceSynchronize vs cudaThreadSynchronize vs cudaStreamSynchronize

CudaDeviceSynchronize vs cudaThreadSynchronize vs cudaStreamSynchronize 首先对这三个函数做一下解释: cudaDeviceSynchronize() 会阻塞当前程序的执行,直到所有任务都处理完毕(这里的任务其实就是指的是所有的线程都已经执行完了kernel function). cudaThreadSynchronize()的功能和cudaDeviceSynchronize()基本上一样,这个函数在新版本的cuda中已经被“

CUDA学习日志:线程协作与例程

接触CUDA的时间并不长,最开始是在cuda-convnet的代码中接触CUDA代码,当时确实看的比较痛苦.最近得空,在图书馆借了本<GPU高性能编程 CUDA实战>来看看,同时也整理一些博客来加强学习效果. Jeremy Lin 在上篇博文中,我们已经用CUDA C编写了一个程序,知道了如何编写在GPU上并行执行的代码.但是对于并行编程来说,最重要的一个方面就是,并行执行的各个部分如何通过相互协作来解决问题.只有在极少数情况下,各个处理器才不需要了解其他处理器的执行状态而彼此独立地计算出结果

CUDA从入门到精通

CUDA从入门到精通(零):写在前面 在老板的要求下,本博主从2012年上高性能计算课程开始接触CUDA编程,随后将该技术应用到了实际项目中,使处理程序加速超过1K,可见基于图形显示器的并行计算对于追求速度的应用来说无疑是一个理想的选择.还有不到一年毕业,怕是毕业后这些技术也就随毕业而去,准备这个暑假开辟一个CUDA专栏,从入门到精通,步步为营,顺便分享设计的一些经验教训,希望能给学习CUDA的童鞋提供一定指导.个人能力所及,错误难免,欢迎讨论. PS:申请专栏好像需要先发原创帖超过15篇...

caffe笔记之例程学习

学习notebook自带例程Classification with HDF5 data时遇到了一些问题,认真把模型文件看了一遍. 模型定义中有一点比较容易被误解,信号在有向图中是自下而上流动的,并不是自上而下. 层的结构定义如下: 1 name:层名称 2 type:层类型 3 top:出口 4 bottom:入口 Each layer type defines three critical computations: setup, forward, and backward. Setup: i

CUDA学习之一:二维矩阵加法

今天忙活了3个小时,竟然被一个苦恼的CUDA小例程给困住了,本来是参照Rachal zhang大神的CUDA学习笔记来一个模仿,结果却自己给自己糊里糊涂,最后还是弄明白了一些. RZ大神对CUDA关于kernel,memory的介绍还是蛮清楚,看完决定写一个二维数组的加法.如果是C++里的加法,那就简单了,用C[i][j] = A[i][j] +B[i][j]就可以. 1 void CppMatAdd(int A[M][N],int B[M][N],int C[M][N]){ 2 for(int

CUDA编程接口:异步并发执行的概念和API

1.主机和设备间异步执行 为了易于使用主机和设备间的异步执行,一些函数是异步的:在设备完全完成任务前,控制已经返回给主机线程了.它们是: 内核发射; 设备间数据拷贝函数; 主机和设备内拷贝小于64KB的存储器块时; 存储器拷贝函数中带有Async后缀的; 设置设备存储器的函数调用. 程序员可通过将CUDA_LAUNCH_BLOCKING环境变量设置为1来全局禁用所有运行在系统上的应用的异步内核发射.提供这个特性只是为了调试,永远不能作为使软件产品运行得可靠的方式. 当应用通过CUDA调试器或CU

CUDA从入门到精通 - Augusdi的专栏 - 博客频道 - CSDN.NET

http://blog.csdn.net/augusdi/article/details/12833235 CUDA从入门到精通(零):写在前面 在老板的要求下,本博主从2012年上高性能计算课程开始接触CUDA编程,随后将该技术应用到了实际项目中,使处理程序加速超过1K,可见基于图形显示器的并行计算对于追求速度的应用来说无疑是一个理想的选择.还有不到一年毕业,怕是毕业后这些技术也就随毕业而去,准备这个暑假开辟一个CUDA专栏,从入门到精通,步步为营,顺便分享设计的一些经验教训,希望能给学习CU

CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第三节

原文链接 恭喜!通过对CUDA(Compute Unified DeviceArchitecture,即计算统一设备架构的首字母缩写)系列文章第一节和第二节,您现在已经是能够使用CUDA的程序员了,您可以创建和运行在支持CUDA的设备上使用成百上千同步线程的程序.在第二节的incrementArrays.cu中,我提供了一个常见的CUDA应用程序模式的工作样例——将数据移动到设备,运行一个或多个内核以进行计算并获得结果.本质上,只需使用您自己的内核并加载自己的数据(我在本篇专栏文章的示例中就是这

CUDNN v3例程演示

首先到NVIDIA官网下载CUDNN v3安装包和例程,如下图中红框所示: 安装CUDNN v3之前需要先安装CUDA 7.0或更高版本,不再赘述. 将下载后的两个tgz包拷贝到已安装CUDA 7.0的目标机器某个路径(我这里为/home/yongke.zyk/local_install),解压,得到三个子目录include/,lib64/和samples/.其中include/下为cudnn.h头文件,需要在编译时包含:lib64/下为cudnn静态库libcudnn_static.a和动态库