选择要用的GPU: CUDA_VISIBLE_DEVICES

服务器中有多个GPU,选择特定的GPU运行程序可在程序运行命令前使用:CUDA_VISIBLE_DEVICES=0命令。0为服务器中的GPU编号,可以为0, 1, 2, 3等,表明对程序可见的GPU编号。

1. 命令:

CUDA_VISIBLE_DEVICES=1     # 只有编号为1的GPU对程序是可见的,在代码中gpu[0]指的就是这块儿GPU
CUDA_VISIBLE_DEVICES=0,2,3 # 只有编号为0,2,3的GPU对程序是可见的,在代码中gpu[0]指的是第0块儿,
						   # gpu[1]指的是第2块儿,gpu[2]指的是第3块儿
CUDA_VISIBLE_DEVICES=2,0,3 # 只有编号为0,2,3的GPU对程序是可见的,但是在代码中gpu[0]指的是第2块儿,
						   # gpu[1]指的是第0块儿,gpu[2]指的是第3块儿
--------------------- 
# 作者:__Lingyue__ 
# 来源:CSDN 
# 原文:https://blog.csdn.net/cfarmerreally/article/details/80321276 
# 版权声明:本文为博主原创文章,转载请附上博文链接!

2. 使用

临时设置:

Linux: export CUDA_VISIBLE_DEVICES=1
windows:  set CUDA_VISIBLE_DEVICES=1

永久设置:

linux:~/.bashrc 的最后加上export CUDA_VISIBLE_DEVICES=1,然后source ~/.bashrc
windows:
打开我的电脑环境变量设置的地方,直接添加就行了。
展开阅读全文

CPU和GPU选择问题

01-28

为cuda练手,写了个图片rgb转灰度的程序,大约400*400的图像,在gpu上用时1.3ms,在cpu上用时很短(clock测不出来)。想请教一下大家,这是什么原因。是不是只有在kernel运算很复杂时,gpu才能发挥作用?rn代码如下,系统是ubuntu server 12.04,本机显卡为Quadro K600, cpu为8核3.70GHz的至强处理器(因为在服务器上远程调用的),谢谢指教!rn[code=c]#include rn#include rn#include rn#include rn#include rn#include rn#include "cuda.h"rn#include rn#define DIM 16rnrnusing namespace cv;rnrntexture texR;rntexture texG;rntexture texB;rntexture texOut;rn__global__ void kernel(float *dev_out)rnrn int idx=threadIdx.x+blockIdx.x*blockDim.x;rn int idy=threadIdx.y+blockIdx.y*blockDim.y;rn int offset=idx+idy*blockDim.x*gridDim.x;rn float dev_r,dev_g,dev_b;rn dev_r=tex1Dfetch(texR,offset);rn dev_g=tex1Dfetch(texG,offset);rn dev_b=tex1Dfetch(texB,offset);rnrn dev_out[offset]=dev_r*0.5+dev_g*0.5+dev_b*0.5;rnrnrnint main()rnrn //image pathrn char* path="//home//ubunserver//yoona.jpg";rn IplImage *image=cvLoadImage(path,0);rnrn int width=image->width;rn int height=image->height;rnrn int imagesize=width*height;rnrn float *r,*g,*b;rn float *out;rn //r,g,b,out均为cuda端的数组rn cudaMalloc((void**)&r,sizeof(float)*imagesize);rn cudaMalloc((void**)&g,sizeof(float)*imagesize);rn cudaMalloc((void**)&b,sizeof(float)*imagesize);rn cudaMalloc((void**)&out,sizeof(float)*imagesize);rn //texR,texG,texB均为纹理内存rn cudaBindTexture(NULL,texR,r,sizeof(float)*imagesize);rn cudaBindTexture(NULL,texG,g,sizeof(float)*imagesize);rn cudaBindTexture(NULL,texB,b,sizeof(float)*imagesize);rn rn //cuda端计时器rn cudaEvent_t sta,sto;rn cudaEventCreate(&sta);rn cudaEventCreate(&sto);rnrn //cpu端数组rn float *host_r,*host_g,*host_b,*host_out;rn host_r=(float*)malloc(sizeof(float)*imagesize);rn host_g=(float*)malloc(sizeof(float)*imagesize);rn host_b=(float*)malloc(sizeof(float)*imagesize);rn host_out=(float*)malloc(sizeof(float)*imagesize);rn //分别取图像rgbrn for (int x=0;ximageData+x*image->width+y))[0];rn host_g[x*width+y]=(float)((uchar*)(image->imageData+x*image->width+y))[1];rn host_r[x*width+y]=(float)((uchar*)(image->imageData+x*image->width+y))[2];rn rn rnrn cudaEventRecord(sta,0);rnrn cudaMemcpy(r,host_r,sizeof(float)*imagesize,cudaMemcpyHostToDevice);rn cudaMemcpy(g,host_g,sizeof(float)*imagesize,cudaMemcpyHostToDevice);rn cudaMemcpy(b,host_b,sizeof(float)*imagesize,cudaMemcpyHostToDevice);rn cudaMemcpy(out,0,sizeof(float)*imagesize,cudaMemcpyHostToDevice);rnrn dim3 blockDim(DIM,DIM);rn dim3 gridDim((width+DIM-1)/DIM,(height+DIM-1)/DIM); rn kernel<<>>(out);rn cudaMemcpy(host_out,out,sizeof(float)*imagesize,cudaMemcpyDeviceToHost);rnrn cudaEventRecord(sto,0);rn cudaEventSynchronize(sto);rn float elapsedTime;rn cudaEventElapsedTime(&elapsedTime,sta,sto);rn printf("cuda time: %3.1f ms\n",elapsedTime);rnrn cudaFree(r);rn cudaFree(g);rn cudaFree(b);rn cudaFree(out);rnrn //cpu端计时rn clock_t start,stop;rn start=clock();rn for (int i=0;iimageData+i*width);rn for (size_t j=0;j 论坛

选择GPU设备考虑的因素

06-29

在GPU机器中,每个GPU无疑是任何设计中需要考虑的因素。GPU的更新换代大约每12~24个月一次,比CPU端的更新略快。到目前为止,我们已经看到GPU的性能大约每18~24个月增加一倍,完全符合摩尔定律。那么,应该主要考虑GPU的哪些因素呢?首先,我们没有必要一定要使用最新的硬件,使用大致同样的能量预算,每次大的硬件更新都带来加倍的性能。rn GPU市场是由游戏玩家推动的,GPU硬件分为两种主要类型:游戏GPU和计算服务器GPU。英伟达推出的Tesla系列的GPU就是针对服务器工作站市场的。这一系列的GPU相比游戏GPU具有如下的优势:rnrn [b] 1. 大容量内存的支持。[/b]rn 从GPU上传送和传回数据是缓慢的。最好拥有5GB/s的双向PCI-E总线带宽通向主GPU。GPU的内存越大,可以在GPU存放越多的数据。这可以避免频繁地向GPU传送和传回数据。Tesla卡通常配备4GB~6GB的内存。如果每个CPU与4个GPU相连接,很容易就达到24GB的显存。rn [b] 2. ECC内存的支持。[/b]rn ECC内存是在服务器环境中使用的一种特殊类型的内存。在这种环境下,内存很容易出错。普通内存面对大量的电磁干扰,其内存单元很可能改变为随机值。设备周围的电子密度越高,则产生越多的电磁辐射和越高的错误率。每个机架放入多个GPU,而机架又同其它机架并排放置,就可能产生电子噪声。而ECC可以同时检测和纠正内存错误,使得它非常适合服务器类型的环境。rn [b]3. 更高精度的数学运算。[/b]rn 由于大多数游戏很少涉及双精度数学运算,因此费米系列卡在每个SM中的两个双精度单元禁掉了一个。因此,标准的GeForce费米卡的双精度性能相当于Tesla同等卡的一般左右。单就单精度浮点运算性能而言,GeForce跟Tesla相当,而且在许多情况下,得益于它更高的时钟频率,可以比Tesla更快。rn [b]4. 大内存总线带宽。[/b]rn Tesla卡,作为最高端的GPU卡,通常全部的SM都是有效的。英伟达对服务器级别的GPU卡收取更多的费用,所以可以按照起作用的SM数目筛选GPU。让所有SM都有效,意味着全部总线带宽都可以用来从GPU卡上的全局内存传输数据。由于内存带宽往往是很多算法唯一的限制因素,因此采用512位带宽对比448位带宽,将带来明显差异。rn [b] 5. 系统管理中断。[/b]rn 系统管理中断是一个非常有用的功能,它可以通过网络远程查询设备。在一个大的数据中心,可能安装有成千上万的GPU。CPU节点已经存在集中管理的解决方案,加入系统管理中断的支持,可以把集中管理扩展到GPU。rn [b]6. 状态指示灯。[/b]rn Tesla卡的背面有一些指示灯,可以显示卡的状态。除了GeForce295卡之外,所有的标准GeForce卡都不存在指示灯。这些指示灯允许技术人员信步走在这些GPU之间,识别出是失败的GPU。rnrn 参考自《CUDA并行程序设计》 论坛

没有更多推荐了,返回首页