首页 > 系统相关 >OpenCL中局部变量和全局变量间的异步复制内存

OpenCL中局部变量和全局变量间的异步复制内存

时间:2024-06-19 15:43:26浏览次数:27  
标签:异步 group temp cl OpenCL 内存 ... GROUP 全局变量

本文主要是async_work_group_copy(...)和wait_group_events(...)的使用范例。展示了从全局内存到局部内存加载数据和从局部内存到全局内存写入数据。这系列内置函数可以用来取代直接赋值式的代码。不过我没有仔细对比过使用异步复制和直接赋值那个效率更高。本系列函数中还有定步长跨元素异步复制的函数,这里没有展示。

函数wait_group_events(...)用来等待异步操作执行完成。你可以在调用此函数之前执行其他操作以节省时间。以下代码运行环境是VS2017、OpenCL3。显卡是Intel Core i5的核芯显卡,main.cpp的代码如下:

string kernelStr = R"(
    #define GROUP_SIZE 128
    kernel void copyData(global const float* input, global float* output)
    {
        local float temp[GROUP_SIZE];
        int index = get_group_id(0);
        int start = index * GROUP_SIZE;
        event_t copyEvent = async_work_group_copy(temp, &input[start], GROUP_SIZE, 0);
        // 等待完成,这里还可以执行其它操作
        int id = get_local_id(0);
        wait_group_events(1, &copyEvent);
        work_group_barrier(CLK_LOCAL_MEM_FENCE);
        temp[id] *= 2;
        copyEvent = async_work_group_copy(&output[start], temp, GROUP_SIZE, 0);
        // 等待完成,这里还可以执行其它操作
        wait_group_events(1, &copyEvent);
    })";

int main()
{
    cl::Program program(kernelStr);
    try 
    {
        program.build("-cl-std=CL2.0");
    }
    catch (...)
    {
        cl_int buildErr = CL_SUCCESS;
        auto buildInfo = program.getBuildInfo<CL_PROGRAM_BUILD_LOG>(&buildErr);
        for (auto &pair : buildInfo)
        {
            std::cerr << pair.second << std::endl << std::endl;
        }
        return 1;
    }
    auto kernel = cl::KernelFunctor<cl::Buffer, cl::Buffer>(program, "copyData");
    vector<float> a(12800, 4);
    vector<float> b(12800, 0);
    cl::Buffer inputa(a.begin(), a.end(), true);
    cl::Buffer outputb(b.begin(), b.end(), false);

    int64 t1, t2;
    t1 = getTickCount();

    kernel(cl::EnqueueArgs(cl::NDRange(12800), cl::NDRange(128)), inputa, outputb);
    cl::copy(outputb, b.begin(), b.end());
    cout << b[0] << endl;

    t2 = getTickCount();
    cout << "CL1(ms):" << (t2 - t1) / getTickFrequency() * 1000 << endl;

    int c;
    cin >> c;
    return 0;
}

此测试的输入是12800个元素的内容为4的数组(inputa),执行后将输入乘以2后输出12800个元素的内容为8的数组(outputb)。此例重要描述代码实现,因此不比较代码执行效率。另外,此例中 temp[id] *= 2; 代码后面没调用work_group_barrier(...)函数同步工作组数据,不知道为什么这里不需要同步等待temp数组全部更新数据完成,教科书上也没讲。

标签:异步,group,temp,cl,OpenCL,内存,...,GROUP,全局变量
From: https://www.cnblogs.com/mengxiangdu/p/18256393

相关文章

  • 掌握异步编程:探索JavaScript中的Promise与async/await
    在现代JavaScript开发中,异步编程已经成为了不可或缺的一部分。为了更好地处理异步操作,JavaScript引入了Promise和async/await两个重要概念。本文将带您了解这两个概念,帮助您掌握异步编程。 PromisePromise是异步编程的一种解决方案,它表示一个异步操作的最终完成(或失败)及其结......
  • 异步任务取消、超时
    一、定义异步任务//定义异步任务publicclassAsyncClass{publicstaticasyncTaskTaskAsync(CancellationTokentoken){token.Register(()=>{Console.WriteLine("TaskAsync被取消");});for(inti=0;i<10;i++){......
  • 单相异步电动机的建模仿真(3)基于空间向量和混合磁链数学模型
    目录1.引言2.混合磁链数学模型3.基于混合磁链数学模型的Simulink仿真模型4.空间向量数学模型5.基于空间矢量数学模型的Simulink仿真模型6.仿真实例7.总结1.引言    不同的数学模型形式可以提供不同的视角和分析方法,这对于电机的设计、控制和故障诊断......
  • OpenCloudOS 支持 Linux 原生版微信,开启生态新篇章
    如今,微信已成为办公领域、日常生活以及娱乐方面的刚性需求软件。作为一款通用开源操作系统,OpenCloudOS积极地与微信展开Linux平台的适配工作,全方位地满足广大用户的需求。近期,经过数月的开发与测试,OpenCloudOS社区与微信团队实现了OpenCloudOS与Linux原生版微信的适配支......
  • go语言之异步并发
    1.首先讲一下匿名函数和闭包的概念,(仔细看,其实Python代码里很好看,只不过Go语言代码有点多,看起来很复杂的感觉)packagemainimport"fmt"funcmain(){/*注意:匿名函数和闭包往往是一起出现的*///不带参的匿名函数func(){fmt.Printf("不带参数的匿名......
  • 爬虫 | 异步请求aiohttp模块
    aiohttp模块,也就是asynciohttp操作#1.创建一个对象aioreq=aiohttp.ClientSession()>>>即对应异步的requests#2.用这个异步requests来发送请求resp=aioreq.get(url)#3.异步写入文件,用到aiofiles模块,pip安装,可学习:https://www.w3cschool.cn/article/86236403.h......
  • Flask 的异步用法案例
    Flask的异步用法案例。案例1:异步视图异步视图允许你使用asyncdef定义路由处理函数,这在处理I/O密集型任务时非常有用。fromflaskimportFlaskimportasyncioapp=Flask(__name__)@app.route('/async-data')asyncdefget_async_data():#模拟异步操作,例如......
  • 批量异步上传aws图片脚本(python)
    背景工作中需要上传一些测试图片,于是网上找找资料(官方说明),前置步骤如下。python需要3.8以上,安装最新的boto3库:pipinstallboto3有一个S3权限的aws账户,得到访问密钥ACCESS_KEY与SECRET_KEY,以及上传图片的存储桶位置安装异步编程asyncio,aiohttp库,方便本地异步上传图片代码......
  • 游戏缓存与异步持久化的完美邂逅
    1、问题提出游戏服务器,需要频繁的读取玩家数据,同时也需求频发修改玩家数据,并持久化到数据库。为了提高游戏服务器的性能,我们应该怎么处理呢?2、应用程序缓存缓存,是指应用程序从数据库读取完数据之后,就将数据缓存在进程内存或第三方内存(例如redis)。游戏服务器对于玩家数据的读......
  • C# .NET Framework 4.0 异步
    .NETFramework4.0只能用Task.Factory.StartNew()4.0以上的则可以直接使用Task.Run()。Task.Factory.StartNew(()=>{})usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;usingMicrosoft.VisualStudio.TestTools.UnitTesting;namespacecom._80comm......