• GPU 编程实例


    GPU是多核技术的代表之一,在一块芯片上集成多个较低功耗的核心,单个核心频率基本不变,一般在1~3GHz,设计重心转向到多核的集成技术,GPU是一种特殊的多核处理器。本文在联想深腾7000G GPU集群上进行实验,该集群有100个节点,每个节点包含两个4核CPU(Intel XEON),16GB内存,其中16个节点配置一块GPU卡,18个节点配置两块GPU卡。

    编译GPU程序:nvcc –o vectorAdd vectorAdd.cu

    运行:

    为了方便,写了简单的shell脚本,具体内容如下:

    [cpp] view plain copy

    1. if [ -f $@.log ]; then  
    2.     rm $@.log  
    3. fi  
    4. if [ -f $@.err ]; then  
    5.     rm $@.err  
    6. fi  
    7. bsub -q c2050 -o $@.log -e $@.err ./$@ 

    示例:

    1. 向量加法

    [cpp] view plain copy

    1. #include<stdio.h>
    2. #define N 200000
    3. #define M 500
    4. __global__ void kernelvectorAdd(int *dev_a,int *dev_b,int *dev_c)  
    5. {  
    6. int tid=blockIdx.x*blockDim.x+threadIdx.x;  
    7. if(tid<N)  
    8.     {  
    9.         dev_c[tid]=dev_a[tid]+dev_b[tid];  
    10.     }  
    11. }  
    12. int main(void)  
    13. {  
    14. int a[N],b[N],c[N];  
    15. int *dev_a,*dev_b,*dev_c;  
    16.     cudaMalloc((void**)&dev_a,N*sizeof(int));  
    17.     cudaMalloc((void**)&dev_b,N*sizeof(int));  
    18.     cudaMalloc((void**)&dev_c,N*sizeof(int));  
    19. for(int i=0;i<N;i++)  
    20.     {  
    21.         a[i]=i+1;  
    22.         b[i]=i+1;  
    23.     }  
    24.     cudaMemcpy(dev_a,a,N*sizeof(int),cudaMemcpyHostToDevice);  
    25.     cudaMemcpy(dev_b,b,N*sizeof(int),cudaMemcpyHostToDevice);  
    26.     kernelvectorAdd<<<(N+M-1)/M,M>>>(dev_a,dev_b,dev_c);  
    27.     cudaMemcpy(c,dev_c,N*sizeof(int),cudaMemcpyDeviceToHost);  
    28.     cudaFree(dev_a);  
    29.     cudaFree(dev_b);  
    30.     cudaFree(dev_c);  
    31. for(int i=0;i<N;i++)  
    32.     {  
    33.         printf("a[%d] is %d, b[%d] is %d, c[%d] is %d ",i,a[i],i,b[i],i,c[i]);  
    34.     }  

    比较简单,看程序就能看明白。

    2. 矩阵乘法

    [cpp] view plain copy

    1. #include<stdio.h>
    2. #include <malloc.h>
    3. #include <stdlib.h>
    4. #define N 1000
    5. void MatrixMul(int *A, int *B, int *C, int Width) {  
    6. int i, j, k;  
    7. for(i=0; i<Width; i++)  
    8. for(j=0; j<Width; j++){  
    9. int s=0;  
    10. for(k=0; k<Width; k++)   
    11.                 s+=A[i*Width+k]*B[k*Width+j];  
    12.             C[i*Width+j]=s;  
    13.         }  
    14. }  
    15. #define TILE_WIDTH 16
    16. __global__ void KernelMatrixMul(int* Md, int* Nd, int* Pd, int Width)  
    17. {  
    18. int x = threadIdx.x+blockIdx.x*blockDim.x;  
    19. int y = threadIdx.y+blockIdx.y*blockDim.y;  
    20. int Pvalue = 0;  
    21. for (int k = 0; k < Width; ++k)  
    22.         Pvalue+=Md[y * Width + k]*Nd[k * Width + x];  
    23.     Pd[y*Width + x] = Pvalue;  
    24. }  
    25. int main(){  
    26. int *A=(int*)malloc(N*N*sizeof(int));  
    27. int *B=(int*)malloc(N*N*sizeof(int));  
    28. int *C=(int*)malloc(N*N*sizeof(int));  
    29. int i;  
    30. for(i=0;i<N*N;i++){  
    31.         A[i] = 1;  
    32.         B[i] = 2;  
    33.     }  
    34. //MatrixMul(A,B,C,N);
    35. int *dev_A,*dev_B,*dev_C;  
    36.     dim3 dimGrid(N/TILE_WIDTH,N/TILE_WIDTH);  
    37.     dim3 dimBlock(TILE_WIDTH,TILE_WIDTH);  
    38.     cudaMalloc((void**)&dev_A,N*N*sizeof(int));  
    39.     cudaMalloc((void**)&dev_B,N*N*sizeof(int));  
    40.     cudaMalloc((void**)&dev_C,N*N*sizeof(int));  
    41.     cudaMemcpy(dev_A,A,N*N*sizeof(int),cudaMemcpyHostToDevice);  
    42.     cudaMemcpy(dev_B,B,N*N*sizeof(int),cudaMemcpyHostToDevice);  
    43.     KernelMatrixMul<<<dimGrid,dimBlock>>>(dev_A,dev_B,dev_C,N);  
    44.     cudaThreadSynchronize();  
    45.     cudaMemcpy(C,dev_C,N*N*sizeof(int),cudaMemcpyDeviceToHost);  
    46.     cudaFree(dev_A);  
    47.     cudaFree(dev_B);  
    48.     cudaFree(dev_C);  
    49. int m,n;  
    50. for(m=0;m<N;m++){  
    51. for(n=0;n<N;n++)  
    52.             printf("C[%d][%d] = %d ",m,n,C[m*N+n]);  
    53.     }  
    54. return 0;  

    3.实验结果:

    最终的输出结果会保存在 *.log下,如果执行过程中出错,则错误信息保存在 *.err中,下面是结果截图:

  • 相关阅读:
    [hdu6271]Master of Connected Component
    [hdu5468]Puzzled Elena
    [hdu4582]DFS spanning tree
    [poj2054]Color a Tree
    [luogu4107]兔子和樱花
    整除的尾数[HDU2099]
    胜利大逃亡[HDU1253]
    Bitset[HDU2051]
    折线分割平面[HDU2050]
    不容易系列之(4)——考新郎[HDU2049]
  • 原文地址:https://www.cnblogs.com/shishupeng/p/6077031.html
Copyright © 2020-2023  润新知