技术开发 频道

CUDA学习--一维矩阵的加法

IT168 文档】一维矩阵的加法:

//实现一个一维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;
}
0
相关文章