Cuda learn record one

1. GPU 有完善的内存管理的机制,会强制结束任何违反内存访问规则的进程,但是无法阻止应用程序的继续执行,因而,错误处理函数非常重要。

 1 static void HandleError( cudaError_t err,
 2                          const char *file,
 3                          int line ) {
 4     if (err != cudaSuccess) {
 5         printf( "%s in %s at line %d\n", cudaGetErrorString( err ),
 6                 file, line );
 7         exit( EXIT_FAILURE );
 8     }
 9 }
10 #define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))

2.

1 add<<<blockPerGrid, threadPerGrid>>> ( void )   

int i=blockIdx.xint i=threadIdx.x

这里面,尖括号里面的参数,第一个表示一个Grid里面线程块的大小,第二个表示一个线程块里面线程的大小。

(这部分有待验证,较老的规则)-----线程块数量上限为:65535.    每个线程块中的线程的数量也有限制,这个数值为 maxThreadPerBlock ,一般是512个值。

1 int i=threadIdx.x+blockIdx.x*blockDim.x

3. 共享内存和同步

1 __shared__ float cache [threadPerBlock];

上述共享内存缓存区,

同步线程:

1 __syncthreads();

保证每一个程序都已经执行完了该语句之前的程序。

4. GPU的计算瓶颈不在于芯片的数学计算吞吐量,而在于芯片的内存带宽。输入的数据无法维持较高的计算速率。GPU的内存种类包括:全局内存,共享内存,常量内存(64KB)。

5. 常量内存,在GPU中,数据不可修改的内存空间。其生成与共享内存相似,标识符为:__constant__ ,在声明常量内存的时候,需要指明常量内存的大小。

1 __constant__ Sphere*  s[Num];
2 cudaMemcpyToSymble(s, temp_s, Num*sizeof(Sphere));

注意上面不需要使用cudaMalloc和cudaFree()。其访问限制为只读。

优点:a.对常量内存的连续读写不额外的消耗时间;   b. 对常量内存的单次操作将会广播到其他的邻近的区域,这将会节约15次的读取时间。

6. 线程束(warp)

包含一定数量的线程(通常是32个),捆绑在一起,步调一致的执行程序,在不同的数据集上执行相同的指令。读取常量内存的时候,GPU不仅会缓存这些数据,而且将这些常量数据广播到半个warp(大约是16个线程),然而,如果,不同的线程所操作的数据是不一致的,这将会导师常量内存的读取速度比全局变量的读取速度更慢。

7. 使用事件来测试性能。

使用cuda的事件API来测试某一段cuda代码的运行时间,注意,在创建事件之后,一定要相应的销毁事件。

这里可以统计使用某一段代码进行优化之后的效果,特别是当使用了常量内存的时候。常量内存在某些情况下,特比的节省事件,作者统计算例优化百分之五十之上。当所有的线程访问相同 的变量的时候。



  cudaEvent_t start, stop;
  cudaEventCreat(&start);
  cudaEventCreate(&srop);

  cudaEventRecord(start,0);

  //执行一段时间的GPU代码

  cudaEventRecord(stop,0);
 cudaEventSynchronize(stop);     //保证在sop之前,所有的GPU事件已经完成。

 float elapsedTime;
 cudaEventElapsedTime(&elapsedTime, start, stop);
 cudaEventDestroy(start);
 cudaEvemtDestory(stop);  //销毁事件

 

8. 注意在有可能在某些GPU仍然为计算完成时,CPU已经开始计算下一段代码。

9. 纹理内存(texture Memory)——另外一种形式的只读内存。

时间: 2024-10-25 11:37:06

Cuda learn record one的相关文章

Cuda learn record two

这是一个cuda 自带的算例,包含cuda 计算的一般流程. 这个地址有比较清楚的cuda的介绍.感谢作者分享(http://blog.csdn.net/hjimce/article/details/51506207) 一般来说,cuda 计算的流程是: 1. 设置显卡编号:cudaSetDevice: 这个主要是在有多个GPU的机器上使用,其编号是从0号开始. 2. 为显卡开辟内存变量: cudaMalloc:使用方法:cudaStatus = cudaMalloc((void**)&dev_

Machine Learning for Developers

Machine Learning for Developers Most developers these days have heard of machine learning, but when trying to find an 'easy' way into this technique, most people find themselves getting scared off by the abstractness of the concept of Machine Learnin

教程 1:让我们通过例子来学习(Tutorial 1: Let’s learn by example)

通过这第一个教程,我们将引导您从基础完成创建简单的带有注册表单的应用. 我们也将解释框架行为的基本方面.如果您对Phalcon的自动代码生成工具有兴趣, 您可以查看 developer tools. 确认安装(Checking your installation)? We'll assume you have Phalcon installed already. Check your phpinfo() output for a section referencing "Phalcon"

CUDA matrixMulCUBLAS

1 /////////////////////////////////////////////////////////////////////////// 2 // matirxmulCUBLAS.cpp 3 // 4 // Copyright 1993-2013 NVIDIA Corporation. All rights reserved. 5 // 6 // Please refer to the NVIDIA end user license agreement (EULA) assoc

CUDA 矩阵相乘完整代码

#include "cuda_runtime.h"#include "device_launch_parameters.h" #include <stdio.h>#include <stdlib.h>#include <time.h>#include "cublas_v2.h" #define BLOCK_SIZE 16 cudaError_t multiCuda(float *c, float *a, flo

CUDA ---- Stream and Event

Stream 一般来说,cuda c并行性表现在下面两个层面上: Kernel level Grid level 到目前为止,我们讨论的一直是kernel level的,也就是一个kernel或者一个task由许多thread并行的执行在GPU上.Stream的概念是相对于后者来说的,Grid level是指多个kernel在一个device上同时执行. Stream和event简介 Cuda stream是指一堆异步的cuda操作,他们按照host代码调用的顺序执行在device上.Strea

Beginners Guide To Learn Dimension Reduction Techniques

Beginners Guide To Learn Dimension Reduction Techniques Introduction Brevity is the soul of wit This powerful quote by William Shakespeare applies well to techniques used in data science & analytics as well. Intrigued ? Allow me to prove it using a s

Learn to write a blog

Some people advices college stdudent shoud learn to write a blog.To record beautiful life and think something meaning about life. And some guys tell me that it's necessary to have a blog for a technician. 1.Notes studying. It's a common phenomenon fo

CUDA C Best Practices Guide 在线教程学习笔记 Part 1

0. APOD过程 ● 评估.分析代码运行时间的组成,对瓶颈进行并行化设计.了解需求和约束条件,确定应用程序的加速性能改善的上限. ● 并行化.根据原来的代码,采用一些手段进行并行化,例如使用现有库,或加入一些预处理指令等.同时需要代码重构来暴露它们固有的并行性. ● 优化.并行化完成后,需要通过优化来提高性能.优化可以应用于各个级别,从数据传输到计算到浮点操作序列的微调.分析工具对这一过程非常有用,可以建议开发人员优化工作的下一个策略. ● 部署.将结果与原始期望进行比较.回想一下,初始评估步