首页 > 其他分享 >OpenCL入门例程

OpenCL入门例程

时间:2023-05-09 11:11:55浏览次数:45  
标签:std 入门 cl 例程 OpenCL input output SDK

OpenCL是一个并行计算库。在Visual Studio中的配置类似于OpenCV,只需要把开发包下载下来,里面有include、lib、bin文件夹,在项目设置里添加上就行了。一般Windows系统自己带的就有OpenCL.dll,在Windows/System32/文件夹里。不同于英伟达的CUDA编程自己搞了个编译器集成到Visual Studio中。OpenCL不需要编译器,它是将GPU核函数源代码作为字符串传给SDK即时解释执行的。

下面将给出一个例子,需要读者熟悉C++11以上标准。该例子里核函数运算量比较大,因为测试发现过于简单的运算CPU更快。此例子在Release版下GPU运算速度略高于CPU。测试环境是VS2017、OpenCL306,CPU型号是Intel Core i5-7400,核芯显卡。当然在OpenCL SDK里的opencl.hpp头文件里也有一个官方例子说明了使用显卡加速的流程。

const int numElements = 1000000;

int main()
{
    std::string kernel{ R"CLC(
        kernel void vectorOpr(global const float *input, global float *output)
        {
            int i = get_global_id(0);
            for (int j = 0; j < 10; j++)
            {
                if (input[i] < 50)
                {
                    output[i] += 0;
                }
                else if (input[i] > 100)
                {
                    output[i] += 1;
                }
                else
                {
                    output[i] += sin(input[i] - 50) / cos(input[i] - 50);
                }
            }
        }
    )CLC" };

    cl::Program anyProgram(kernel);
    try
    {
        anyProgram.build("-cl-std=CL2.0");
    }
    catch (...)
    {
        cl_int buildErr = CL_SUCCESS;
        auto buildInfo = anyProgram.getBuildInfo<CL_PROGRAM_BUILD_LOG>(&buildErr);
        for (auto &pair : buildInfo)
        {
            std::cerr << pair.second << std::endl << std::endl;
        }
        return 1;
    }

    std::mt19937 mt;
    cl::coarse_svm_vector<float> input(numElements, 75);
    cl::vector<float> output(numElements, 1);
    for (auto& item : input)
    {
        item = mt() % 200;
    }
    cl::Buffer buff(output.begin(), output.end(), false);

    auto anyKernel = cl::KernelFunctor<float*, cl::Buffer&>(anyProgram, "vectorOpr");

    std::chrono::system_clock::time_point t1, t2;

    t1 = std::chrono::system_clock::now();
    anyKernel(cl::EnqueueArgs(cl::NDRange(numElements), cl::NDRange(1)), input.data(), buff);
    copy(buff, output.begin(), output.end());
    t2 = std::chrono::system_clock::now();
    std::cout << "显卡(ms):" << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl;

    cl::vector<float> A(numElements, 75);
    cl::vector<float> C(numElements, 1);
    for (auto& item : A)
    {
        item = mt() % 200;
    }

    t1 = std::chrono::system_clock::now();
    for (int i = 0; i < numElements; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            if (A[i] < 50)
            {
                C[i] += 0;
            }
            else if (A[i] > 100)
            {
                C[i] += 1;
            }
            else
            {
                C[i] += sin(A[i] - 50) / cos(A[i] - 50);
            }
        }
    }
    t2 = std::chrono::system_clock::now();
    std::cout << "CPU(ms):" << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl;
    return 0;
}

 

标签:std,入门,cl,例程,OpenCL,input,output,SDK
From: https://www.cnblogs.com/mengxiangdu/p/17384014.html

相关文章

  • 入门8-Pytest部分测试用例的前后置(fixture)(1-参数详解)
    使用[email protected](scope=”function”,autouse=False,params=loginutil(),ids=[0,1,2],name="login")各个参数详解Scope:作用域             Function:用例之前和之后    Class:类之前和之后Package/session:#整个项目会话之......
  • JVM快速入门
    内存结构1.程序计数器1.1.定义ProgramCounterRegister程序计数器(寄存器)1.2.作用记住下一条jvm指令的执行地址1.3.特点是线程私有的不会存在内存溢出2.虚拟机栈2.1.定义JavaVirtualMachineStacks(Java虚拟机栈)每个线程运行时所需要的内存,称为虚拟机栈每个栈......
  • Ansible快速入门(下)
    6.Ansible常用模块ansible有着诸多的模块,虽然模块众多,但最为常用的模块也就20-30个左右;6.1command模块功能:在远程主机执行Shell命令;此为默认模块,可忽略-m选项;注意:不支持管道命令|参数选项含义chdirchdir/opt执行ansible时,切换到指定的目录creates......
  • python快速直白入门(半新手向,老手复习向)
    主用python做项目有一段时间,这次简单总结学习下。为后面的项目编写,进行一次基础知识的查缺补漏、1、变量名和数据类型"""变量名,只能由"数字、大小写字母、_"组成,且不能以数字开头"""#整数int#hashable,不可变对象a=5#浮点数float#hashable,不可变对象a1=3......
  • 【编程入门】应用市场(NodeJS版)
    背景前面已输出多个系列:《十余种编程语言做个计算器》《十余种编程语言写2048小游戏》《17种编程语言+10种排序算法》《十余种编程语言写博客系统》《十余种编程语言写云笔记》《N种编程语言做个记事本》目标为编程初学者打造入门学习项目,使用各种主流编程语言来实现。让想学......
  • docker 打包 springboot 项目快速入门
    docker打包springboot项目快速入门文末源码@[toc]1.构建Sringboot工程新建项目创建接口packagecom.wangshiyu.javapub.demo.springbootdocker.controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.......
  • docker 打包 springboot 项目快速入门
    >收藏不点赞,表示很遗憾docker打包springboot项目快速入门文末源码@[toc]1.构建Sringboot工程新建项目创建接口packagecom.wangshiyu.javapub.demo.springbootdocker.controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframewor......
  • Java入门7(异常处理,list集合)
    异常处理(try-catch)错误的种类一般来讲,程序出现错误的时候,大致情况有三种:语法错误运行时错误,指的是各程序运行的时候,出现的一些没有想到的问题,比如除数为0,比如数组下标越界等等逻辑错误,运行结果和与其结果不一致,俗称bug⭐Java中的异常处理机制主要用于处理运行时错误异常......
  • ASP.NET Core MVC 从入门到精通之序列化
    随着技术的发展,ASP.NETCoreMVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NETCoreMVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NETCoreMVC系统开发的人员。经过前几篇文章的讲解,初步了解ASP.NETCore......
  • 入门7-pytest跳过测试用例
    1.无条件跳过用例@pytest.mark.skip(reason="无理由跳过")2.有条件跳过用例@pytest.mark.skipif(workage<5,reason="无理由跳过") ......