[1] cuda实战: 第一个程序Hello,World

因学习需要,需要把算法运行速度优化,现在有cuda这个平台,所以先学习着怎么编写程序

框架结构什么的打算边学程序边学,因为一直看框架理论,理解也不是很深刻

主要参考CUDA实战这本书,开始编程学习,期望可以快速入门,后面再加以理论方面的补充,能够完成算法实现速度的优化

在此之前,CUDA的实验平台已经全部弄好了(不是自己弄的,心里发慌)

  • 核函数调用
# include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>

__global__ void kernel(void) {
    
}

int main() {
    kernel << <1, 1 >> > ();
    printf("Hello world!\n");
    return 0;
}
View Code

与普通的程序相比,这里多了一个空的函数kernel(),并且带有修饰符

对内核函数的调用,带有修饰字符<<<>>>(不知道为什么这个修饰字符会被标红)

这些参数的意义会在后面更深的了解

  • 传递参数

对上述程序进行修改,实验将参数传递给核函数

 

# include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>

__global__ void add(const int a, const int b, int *c) {
    *c = a + b;
}



int main() {
    int c;
    int *dev_c; // 定义在设备端的接收数据的指针
    cudaError_t cudaStatus;
    //为输入参数和输出参数分配内存
    cudaStatus = cudaMalloc((void**)&dev_c, sizeof(int));
    if (cudaStatus != cudaSuccess) {
        printf("cudaMalloc is failed!\n");
    }
    
    //调用内核函数
    add << <1, 1 >> > (2, 7, dev_c);

    //把输出参数从设备端复制到主机
    cudaStatus = cudaMemcpy(&c, dev_c, sizeof(int), cudaMemcpyDeviceToHost);
    if (cudaStatus != cudaSuccess) {
        printf(" cudaMemcpyDeviceToHost is failed!\n");
    }
    //释放设备端的内存
    cudaFree(dev_c);
    printf("2+7=%d", c);
    return 0;
}
View Code

 与C语言类似,Cuda C是对C语言的扩展,方便对设备端进行一系列操作;在学习过程中,不断积累这些常用的操作函数;

cudaMalloc() 

用来分配内存,第一个参数是一个指针,指向用于保存新分配内存地址的变量,第二个参数是分配内存的大小

设备指针的限制:

可以将cudaMalloc()分配的指针传递给在设备上执行的函数

可以在设备代码中使用cudaMalloc()分配的指针进行内存读写操作

可以将cudaMalloc()分配的指针传递给在主机上执行的函数

不能在主机代码中使用cudaMalloc()分配的指针进行内存读写操作

cudaMemcpy()

用于主机端与设备端之间的交互,数据的传递

 

posted @ 2018-04-13 11:38  mzhourr  阅读(1085)  评论(0编辑  收藏  举报