zoukankan      html  css  js  c++  java
  • CUDA学习(三)之使用GPU进行两个数相加

    在CPU上定义两个数并赋值,然后使用GPU核函数将两个数相加并返回到CPU,在CPU上显示

    #include "cuda_runtime.h"
    #include "device_launch_parameters.h"
    
    #include <iomanip>
    #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    
    //检测GPU
    bool CheckCUDA(void){
        int count = 0;
        int i = 0;
    
        cudaGetDeviceCount(&count);
        if (count == 0) {
            printf("找不到支持CUDA的设备!
    ");
            return false;
        }
        cudaDeviceProp prop;
        for (i = 0; i < count; i++) {
            if (cudaGetDeviceProperties(&prop, i) == cudaSuccess) {
                if (prop.major >= 1) {
                    break;
                }
            }
        }
        if (i == count) {
            printf("找不到支持CUDA的设备!
    ");
            return false;
        }
        cudaGetDeviceProperties(&prop, 0);
        printf("GPU is: %s
    ", prop.name);
        cudaSetDevice(0);
        printf("CUDA initialized success.
    ");
        return true;
    }
    
    //使用指针相加
    __global__ void addNumber(double a, double b, double *c);
    
    int main(){
        //检测GPU
        if (!CheckCUDA()){
            cout << "No CUDA device.";
            return 0;
        }
        cout << "*************************************************************************************************************" << endl;
    
        double h_a, h_b, h_c;       //在CPU上定义三个变量
        double *d_c;           //定义一个将指向GPU的指针
    
        h_a = 2.2;
        h_b = 3.3;
    
        cudaMalloc((void **)&d_c, sizeof(double));     //为指针在GPU上分配内存空间
       //调用核函数并启用一个线程块和一个线程
    addNumber<<<1, 1>>>(h_a, h_b, d_c); //只是单独的两个数相加,不是两个数组相加,只需使用单线程,数组相加可以使用多线程 cudaMemcpy(&h_c, d_c, sizeof(double), cudaMemcpyDeviceToHost); //将GPU上计算好的结果返回到CPU上定义好的变量 //setw(10)表示输出10个空格,需添加 #include <iomanip> cout << setw(10) << h_a << " + " << h_b << " = " << h_c << endl; cout << endl << endl; system("pause"); return 0; } __global__ void addNumber(double a, double b, double *c){ *c = a + b; }

    显示结果如下

  • 相关阅读:
    Vue-router笔记
    webpack及其配置
    高阶函数+组件化开发
    Es6语法+v-on参数相关+vue虚拟dom
    英语资源及其APP推荐
    Qt获取ip地址
    QT创建和使用动态链接库
    error C2664: “strcmp”: 不能将参数 1 从“WCHAR [260]”转换为“const char *”
    Vue|VUE router 导航重复点击报错的问题解决方案
    Vue|触发路由跳转
  • 原文地址:https://www.cnblogs.com/xiaoxiaoyibu/p/10088972.html
Copyright © 2011-2022 走看看