项目优化之:GPU编程

简介:  1GPU编程,依赖于显卡 2GPU变成依赖于OpenGL和direct 3CPU的特点是:频率比较快,GPU的特点是寄存器非常非常的多。 4如果电脑是windows7,没法直接调试GPU。Window8可以直接调试 5用VS2013新建一个项目,命名:GPU 6调试GPU的方式是VS中的:打断点—>运行项目à调试à窗口àGPU线程(通过这种方


1GPU编程,依赖于显卡

2GPU变成依赖于OpenGLdirect

3CPU的特点是:频率比较快,GPU的特点是寄存器非常非常的多。

4如果电脑是windows7,没法直接调试GPUWindow8可以直接调试

5VS2013新建一个项目,命名:GPU

6调试GPU的方式是VS中的:打断点—>运行项目à调试à窗口àGPU线程(通过这种方式实现调试GPU项目)

8.修改项目属性:右击项目à属性à配置属性à常规,修改调试器类型为仅GPU

修改Amp默认快捷键可以选择时时(Use C++ AMP runtime default)的方式,也可以使用软件加速器(WARPsoftware accelerator)的方式,截图

9.代码:

#include <iostream>

#include <amp.h>  //GPU编程所需的头文件

using namespace concurrency;

 

int main()

{

    int v[11] = { 'G', 'd', 'k', 'k', 'n', 31, 'v', 'n', 'q', 'k', 'c' };

    array_view<int> av(11, v);//array_viewGPU计算结构,av存储到GPU显存

 

    //=表示直接操作AV

    //(index<1> idx)操作每一个元素

    //restrict(amp)定位GPU执行

    parallel_for_each(av.extent, [=](index<1> idx) restrict(amp)

    {

        av[idx] += 1;//加完后变成了hello world

    });

    for (unsigned int i = 0; i < 11; i++)

    {

        std::cout << static_cast<char>(av[i]);

    }

    std::cin.get();

 

    return 0;

}

10.CPU,GPU单值计算效率测试

案例:

#include <iostream> 

#include <amp.h>

#include <WinBase.h>

 

#define COUNT 100000

 

float nickName_GPU[COUNT];

float nickName_CPU[COUNT];

 

//GPU并行计算比较占有优势,restrict(amp):限制使用GPU编程

double rungpu(int num) restrict(amp)

{

    double temp = 0;

    for (int i = 0; i < num; i++)

    {

        temp += i;

    }

 

    return temp;

}

 

//cpu处理单值计算比较有优势,单点计算比较有优势,只能在GPU内部执行

double runcpu(int num) restrict(cpu)

{

    //这是对一个数进行操作

    double temp = 0;

    for (int i = 0; i < num; i++)

    {

        temp += i;

    }

    return temp;

}

 

//限制使用GPUCPU运行

double runcpugpu(int num) restrict(amp, cpu)

{

    double temp = 0;

    for (int i = 0; i < num; i++)

    {

        temp += i;

    }

    return temp;

}

 

//测试单值计算的运行效率

int main()

{

    LARGE_INTEGER freq;

    LARGE_INTEGER strt;

    LARGE_INTEGER ed;

    QueryPerformanceFrequency(&freq);

    QueryPerformanceCounter(&strt);

    double dx[1] = { 0.0 };

    double  db = 0.0;

 

    concurrency::array_view<double> myview(1, dx);

    parallel_for_each(myview.extent,

        [=](concurrency::index<1> idx) restrict(amp)

    {

        myview[idx] += rungpu(1000000);

    });

 

    myview.synchronize();//显式等待GPU计算完成并将数据打回内存

    printf("%f\n", dx[0]);

 

    QueryPerformanceCounter(&ed);

    printf("GPU耗时: %d 毫秒\r\n", (ed.QuadPart - strt.QuadPart) * 1000 / freq.QuadPart);

    QueryPerformanceCounter(&strt);

 

    printf("%f\n", runcpu(1000000));

 

    QueryPerformanceCounter(&ed);

    printf("CPU耗时: %d 毫秒\r\n", (ed.QuadPart - strt.QuadPart) * 1000 / freq.QuadPart);

    puts("测试结束");

 

    getchar();

    return 0;

}

运行结果:

案例2

#include <iostream> 

#include <amp.h>

#include <WinBase.h>

 

#define COUNT 3000

 

float nickName_GPU[COUNT];

float nickName_CPU[COUNT];

 

//GPU并行计算比较占有优势,restrict(amp):限制使用GPU编程

double rungpu(int num) restrict(amp)

{

    double temp = 0;

    for (int i = 0; i < num; i++)

    {

        temp += i;

    }

 

    return temp;

}

 

//cpu处理单值计算比较有优势,单点计算比较有优势,只能在GPU内部执行

double runcpu(int num) restrict(cpu)

{

    //这是对一个数进行操作

    double temp = 0;

    for (int i = 0; i < num; i++)

    {

        temp += i;

    }

    return temp;

}

 

//限制使用GPUCPU运行

double runcpugpu(int num) restrict(amp, cpu)

{

    double temp = 0;

    for (int i = 0; i < num; i++)

    {

        temp += i;

    }

    return temp;

}

 

int main()

{

    LARGE_INTEGER freq;

    LARGE_INTEGER strt;

    LARGE_INTEGER ed;

    QueryPerformanceFrequency(&freq);

    QueryPerformanceCounter(&strt);

 

    concurrency::array_view<float> myView(COUNT, nickName_GPU); //将数据打入显存 

 

    concurrency::parallel_for_each(myView.extent, [=](concurrency::index<1> idx) restrict(amp)

    {

        for (int i = 0; i < COUNT / 10; i++)

        {

            myView[idx] = (myView[idx] + 0.1f) / 2.3f;

        }

    });

 

    myView.synchronize();//显式等待GPU计算完成并将数据打回内存 

 

    QueryPerformanceCounter(&ed);

    printf("GPU耗时: %d 毫秒\r\n", (ed.QuadPart - strt.QuadPart) * 1000 / freq.QuadPart);

    QueryPerformanceCounter(&strt);

 

    for (int idx = 0; idx < COUNT; idx++)

    {

        for (int i = 0; i < COUNT / 10; i++)

        {

            nickName_CPU[idx] = (nickName_CPU[idx] + 0.1f) /2.3f;

        }

    }

    QueryPerformanceCounter(&ed);

    printf("CPU耗时: %d 毫秒\r\n", (ed.QuadPart - strt.QuadPart) * 1000 / freq.QuadPart);

 

    for (int idx = 0; idx < COUNT; idx++)

    {

        if (nickName_CPU[idx] != nickName_GPU[idx])

        {

            puts("CPUGPU的计算结果不相符!");

            getchar();

            return 0;

        }

    }

    puts("测试结束");

 

    getchar();

    return 0;

}

运行结果:

 

 

 

相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
目录
相关文章
|
Unix 异构计算 Windows
带你读《基于CUDA的GPU并行程序开发指南》之一:CPU并行编程概述
本书旨在帮助读者了解与基于CUDA的并行编程技术有关的基本概念,并掌握实用c语言进行GPU高性能编程的相关技巧。本书第一部分通过CPU多线程编程解释了并行计算,使得没有太多并行计算基础的读者也能毫无阻碍地进入CUDA天地;第二部分重点介绍了基于CUDA的GPU大规模并行程序的开发与实现,并通过大量的性能分析帮助读者理解如何开发一个好的GPU并行程序以及GPU架构对程序性能的影响;本书的第三部分介绍了一些常用的CUDA库。
|
3月前
|
机器学习/深度学习 并行计算 流计算
【GPU】GPU CUDA 编程的基本原理是什么?
【GPU】GPU CUDA 编程的基本原理是什么?
51 0
|
5月前
|
存储 人工智能 缓存
探索AIGC未来:CPU源码优化、多GPU编程与中国算力瓶颈与发展
近年来,AIGC的技术取得了长足的进步,其中最为重要的技术之一是基于源代码的CPU调优,可以有效地提高人工智能模型的训练速度和效率,从而加快了人工智能的应用进程。同时,多GPU编程技术也在不断发展,大大提高人工智能模型的计算能力,更好地满足实际应用的需求。 本文将分析AIGC的最新进展,深入探讨以上话题,以及中国算力产业的瓶颈和趋势。
|
异构计算 机器学习/深度学习 算法
GPU编程(五): 利用好shared memory
目录 前言 CPU矩阵转置 GPU实现 简单移植 单block tile 利用率计算 shared memory 最后 前言 之前在第三章对比过CPU和GPU, 差距非常大. 这一次来看看GPU自身的优化, 主要是shared memory的用法.
1371 0
|
并行计算 算法 NoSQL
GPU编程(四): 并行规约优化
目录 前言 cuda-gdb 未优化并行规约 优化后并行规约 结果分析 最后 前言 之前第三篇也看到了, 并行方面GPU真的是无往不利, 现在再看下第二个例子, 并行规约. 通过这次的例子会发现, 需要了解GPU架构, 然后写出与之对应的算法的, 两者结合才能得到令人惊叹的结果.
1555 0
|
存储 缓存 并行计算
GPU编程(二): GPU架构了解一下!
目录 前言 GPU架构 GPU处理单元 概念GPU GPU线程与存储 参考 最后 前言 之前谈了谈CUDA的环境搭建. 这次说一下基本的结构, 如果不了解, 还是没法开始CUDA编程的.
1431 0
|
机器学习/深度学习 人工智能 并行计算
GPU编程(一): Ubuntu下的CUDA8.0环境搭建
目录 前言 老黄和他的核弹们 开发环境一览 显卡驱动安装 下载驱动 禁用nouveau 安装驱动 安装CUDA8.0 参考 最后 前言 在Linux下安装驱动真的不是一件简单的事情, 我在经历了无数折磨之后终于搭起了GPU编程环境.
2598 0