项目优化之: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;

}

运行结果:

 

 

 

相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
目录
相关文章
|
人工智能 缓存 调度
技术改变AI发展:RDMA能优化吗?GDR性能提升方案(GPU底层技术系列二)
随着人工智能(AI)的迅速发展,越来越多的应用需要巨大的GPU计算资源。GPUDirect RDMA 是 Kepler 级 GPU 和 CUDA 5.0 中引入的一项技术,可以让使用pcie标准的gpu和第三方设备进行直接的数据交换,而不涉及CPU。
138714 6
|
并行计算 TensorFlow 调度
推荐场景GPU优化的探索与实践:CUDA Graph与多流并行的比较与分析
RTP 系统(即 Rank Service),是一个面向搜索和推荐的 ranking 需求,支持多种模型的在线 inference 服务,是阿里智能引擎团队沉淀多年的技术产品。今年,团队在推荐场景的GPU性能优化上又做了新尝试——在RTP上集成了Multi Stream,改变了TensorFlow的单流机制,让多流的执行并行,作为增加GPU并行度的另一种选择。本文详细介绍与比较了CUDA Graph与多流并行这两个方案,以及团队的实践成果与心得。
|
3月前
|
存储 并行计算 调度
迈向可编程观测:在GPU Kernel中构建类eBPF风格的性能探针
本文旨在梳理作者学习路径,带领读者共同探索 GPU Kernel 性能分析从宏观到微观的技术演进。
664 24
迈向可编程观测:在GPU Kernel中构建类eBPF风格的性能探针
|
8月前
|
缓存 并行计算 PyTorch
PyTorch CUDA内存管理优化:深度理解GPU资源分配与缓存机制
本文深入探讨了PyTorch中GPU内存管理的核心机制,特别是CUDA缓存分配器的作用与优化策略。文章分析了常见的“CUDA out of memory”问题及其成因,并通过实际案例(如Llama 1B模型训练)展示了内存分配模式。PyTorch的缓存分配器通过内存池化、延迟释放和碎片化优化等技术,显著提升了内存使用效率,减少了系统调用开销。此外,文章还介绍了高级优化方法,包括混合精度训练、梯度检查点技术及自定义内存分配器配置。这些策略有助于开发者在有限硬件资源下实现更高性能的深度学习模型训练与推理。
1480 0
|
存储 并行计算 算法
CUDA统一内存:简化GPU编程的内存管理
在GPU编程中,内存管理是关键挑战之一。NVIDIA CUDA 6.0引入了统一内存,简化了CPU与GPU之间的数据传输。统一内存允许在单个地址空间内分配可被两者访问的内存,自动迁移数据,从而简化内存管理、提高性能并增强代码可扩展性。本文将详细介绍统一内存的工作原理、优势及其使用方法,帮助开发者更高效地开发CUDA应用程序。
|
存储 人工智能 芯片
多GPU训练大型模型:资源分配与优化技巧 | 英伟达将推出面向中国的改良芯片HGX H20、L20 PCIe、L2 PCIe
在人工智能领域,大型模型因其强大的预测能力和泛化性能而备受瞩目。然而,随着模型规模的不断扩大,计算资源和训练时间成为制约其发展的重大挑战。特别是在英伟达禁令之后,中国AI计算行业面临前所未有的困境。为了解决这个问题,英伟达将针对中国市场推出新的AI芯片,以应对美国出口限制。本文将探讨如何在多个GPU上训练大型模型,并分析英伟达禁令对中国AI计算行业的影响。
2914 0
|
机器学习/深度学习 人工智能 弹性计算
阿里云林立翔:基于阿里云GPU的AIGC小规模训练优化方案
阿里云弹性计算林立翔在【AIGC】话题下带来了题为《基于阿里云GPU的AIGC小规模训练优化方案》的主题演讲,围绕生成式AI技术栈、生成式AI微调训练和性能分析、ECS GPU实例为生成式AI提供算力保障、应用场景案例等相关话题展开。
|
存储 人工智能 Kubernetes
阿里云ACK助力GPU成本优化,实现灵活管理
摘要:本文将介绍如何在阿里云容器服务ACK中,利用cGPU技术,共享GPU算力,提高GPU利用率,降低TCO。
345 2
|
缓存 并行计算 算法
上帝视角看GPU(5):图形流水线里的不可编程单元
上帝视角看GPU(5):图形流水线里的不可编程单元
585 0
|
人工智能 弹性计算 并行计算
技术改变AI发展:CUDA Graph优化的底层原理分析(GPU底层技术系列一)
随着人工智能(AI)的迅速发展,越来越多的应用需要巨大的GPU计算资源。CUDA是一种并行计算平台和编程模型,由Nvidia推出,可利用GPU的强大处理能力进行加速计算。
107065 1

热门文章

最新文章