OpenCL2.0特性之SVM

Arm Mali GPU架构与OpenCL 2.0优化实践 OpenCL作为异构计算的重要标准,其2.0版本引入的共享虚拟内存(SVM)技术革新了CPU与GPU的协作方式。SVM通过统一内存地址空间,消除了传统异构编程中显式数据传输的开销,特别适合移动端Mali GPU这类对内存带宽敏感的平台。在图像处理、计算机视觉等典型应用场景中,合理运用SVM的细粒度内存共享特性,配合Mali特有的分块渲染架构(TBR),可实现15-30%的性能提升。本文以矩阵乘法和图像卷积为例,详解如何通过内存访问模式优化、原子操作控制等技术手段,在保持代码简洁性的同时充分释放Arm Mal 阅读详情

from: http://blog.youkuaiyun.com/hdanbang/article/details/50198415

在OpenCL2.0中,增加了SVM(shared virtual memory)的特性。在开始讲解SVM之前,我们先用图片来看下OpenCL1.2中主机与设备端的地址空间:

技术分享

                                                 图1 OpenCL1.2中主机与设备端地址空间

        从图1可以看到,主机与设备具有不同的地址空间,各自需要对各自的内存进行管理。彼此之间不能直接访问对方的地址空间。所以,两者之间数据需要通信的话,只能把数据在主机与设备间来回拷贝,或者把设备端地址空间map /unmap到主机端。对于这样一种模式下,如果我们要想在设备端处理主机端的链表、树之类的数据。我们只能鞭长莫及!对于异构平台,我们就真的没办法愉快地处理链表之类的数据么?技术是发展的,有需求就必有技术来解决!

     从CUDA6以后,GPU与CPU之间支持统一寻址(Unified Memory)  ,GPU与CPU间可以直接访问彼此的地址空间,不需要我们人为的数据拷贝。这给异构计算又带入了一个新的高度,我们可以处理链表数据啦!既然CUDA都开始支持了,OpenCL也不能落后呀。在OpenCL2.0中,增加了共享虚拟内存(shared virtual memory),我们还是以一张图片来形象的描述:

技术分享

                                              图2 OpenCL2.0中主机与设备端地址空间

      从图2可以看到,图1中原来两个彼此不相交的地址空间现在有个公共交集,这个公共交集就是SVM.。对于SVM的地址空间,主机和设备都可以直接访问,妈妈再也不用担心异构平台的数据访问方式了!

说完了SVM的意义,我们来聊聊SVM的具体细节。

        对于SVM的创建,OpenCL2.0中有两种方式,一种缓冲分配(buffer allocation),另一种是系统分配(System allocation):

        1、所谓缓冲分配,就是我们使用OpenCL API函数clSVMAlloc来分配,然后使用clSetKernelArgSVMPointer把分配的SVM作为内核参数传入

         2、所谓系统分配,就是在主机端,我们可以使用malloc,new之类的系统分配内存函数来分配空间,然后使用clSetKernelArgSVMPointer把分配的SVM作为内核参数传入。

        对于SVM的类型,OpenCL2.0也是有两种类型:一种是粗粒度;另一种是细粒度:

        1、粗粒度SVM:共享发生在OpenCL缓冲内存对象区域粒度。在同步点强制内存一致性,使用map/unmap命令来更新主机与设备间的数据。粗粒度的SVM与OpenCL1.2中使用缓冲对象类似,不过唯一不同的是:我们不需要来回拷贝数据,设备与主机可以直接访问对方的数据,这才是重点!

       2、所谓细粒度SVM:共享发生在OpenCL缓冲对象单个的加载/存储粒度。内存一致性在同步点得到保证。

        好,结合SVM分配方式和SVM类型,可以把OpenCL2.0中的SVM分为:粗粒度缓冲SVM,细粒度缓冲SVM,细粒度系统SVM。(木有粗粒度系统SVM)。对于你的OpenCL设备(请确保你的设备支持OpenCL2.0),到底支持上述三种的哪三种呢?我们可以通过如下代码查询:

         

  1.         cl_device_svm_capabilities svm;  
  2. clGetDeviceInfo(*device,CL_DEVICE_SVM_CAPABILITIES,sizeof(svm),&svm,NULL);  
  3. if(svm&CL_DEVICE_SVM_FINE_GRAIN_SYSTEM)  
  4.     printf("CL_DEVICE_SVM_FINE_GRAIN_SYSTEM\n");  
  5. if(svm&CL_DEVICE_SVM_FINE_GRAIN_BUFFER)  
  6.     printf("CL_DEVICE_SVM_FINE_GRAIN_BUFFER\n");  
  7. if(svm&CL_DEVICE_SVM_COARSE_GRAIN_BUFFER)  
  8.     printf("CL_DEVICE_SVM_COARSE_GRAIN_BUFFER\n");  
       在我的AMD A10-7400 Radeon R6平台上,当设备为CL_DEVICE_TYPE_GPU时,输出为:

  1. CL_DEVICE_SVM_FINE_GRAIN_BUFFER  
  2. CL_DEVICE_SVM_COARSE_GRAIN_BUFFER  
      对于细粒度系统SVM,AMD当前是不支持的。

      粗粒度缓冲SVM和细粒度缓冲SVM大致用法,如下表格所示

Coarse-grained SVM
(Map/Unmap is requred)
fine-grained SVM buffer
  1. float* p = (float*)clSVMAlloc(…);  
  2.   
  3. clEnqueueSVMMap(…,  
  4.     CL_TRUE,  // block until map is done  
  5.     p, …);  
  6.   
  7.   
  8. // Initialize SVM buffer  
  9. p[i] = …;  
  10.   
  11. clEnqueueSVMUnmap(…, p, …);  
  12.   
  13. clEnqueueNDRange(…);  
  14.   
  15. clEnqueueSVMMap(…,  
  16.     CL_TRUE,  // block until map is done  
  17.     p, …);  
  18.   
  19. // Read the data produced by the kernel  
  20. … = p[i];  
  21.   
  22. clEnqueueSVMUnmap(…, p, …);  
  1. float* p = (float*)clSVMAlloc(…);  
  2.   
  3.   
  4.   
  5.   
  6.   
  7.   
  8.   
  9. // Initialize SVM buffer  
  10. p[i] = …;  
  11.   
  12.   
  13.   
  14. clEnqueueNDRange(…);  
  15.   
  16. clFinish(…);  
  17.   
  18.   
  19.   
  20.   
  21. // Read the data produced by the kernel  
  22. … = p[i];   

具体的SVM例子,请移步 这里 。

OpenCL2.0 SVM的讲解,就到这吧!

 ps:最后唠叨一句:对于SVM,方便了我们码农编程,从硬件上来说,OpenCL设备与主机不一定是共享物理内存的。

OpenCL-SVM测试 windows下的GPU的OpenCL-SVM特性测试。opencv灰度模板匹配在CPU和GPU之间的执行速度对比的测试软件! 立即下载

相关推荐

AIDC智算中心建设:资源池化核心技术解析

AI 应用的POD在运行的时候,通过池化运行时访问虚拟GPU、执行AI任务,池化运行时拦截对虚拟GPU的访问请求、转递给池化服务代理执行,池化服务代理通过向智算池化控制器查询虚拟GPU所对应的真实智算资源位置、规格,按查询结果分配智算资源、执行AI任务,如果真实的智算资源位于远程计算节点,则由本地池化服务代理将访问请求转递给远程计算节点上的池化服务代理处理,相关通信经由参数面网络。

u013891230的博客 2429

OpenCL-SVM(共享虚拟内存)实验

在体验了OpenCV-OpenCL的使用之后,发现CPU和GPU之间的数据传输相当的耗时,既然我这个小菜鸟都发现了这个瓶颈,大佬们肯定也早就发现也有一些解决方案吧!在网上看到一篇与这个有关的文章《OpenCL2.0特性之SVM》,可以先了解一下,看完之后有所收获,但也有许多疑问如下: 1、SVM支持CPU和GPU之间不需要数据拷贝就可以数据共享,那这个SVM是软件实现的还是硬件实现的?如果是软件

楷尘·极客 4909

Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件

Polyworks脚本开发学习笔记(十五)-利用Python连接Polyworks的COM组件

qq_43662503的博客 2499

OpenCL™规范 5.6.1. SVM共享粒度:粗粒度和细粒度共享

如果event_wait_list不为NULL,则event_wail_list指向的事件列表必须有效,并且num_events_in_wait_list必须大于0。如果event_wait_list不为NULL,则event_wail_list指向的事件列表必须有效,并且num_events_in_wait_list必须大于0。如果event_wait_list不为NULL,则event_wail_list指向的事件列表必须有效,并且num_events_in_wait_list必须大于0。

aggs1990的专栏 607

实战测评:4大搜索API(You.com/Tavily/Exa/Perplexity)谁更适合你的AI项目?附Python调用代码

本文实战测评了You.com、Tavily、Exa和Perplexity四大搜索API在AI项目中的集成应用,详细对比了它们的技术特性和Python调用方法。针对LLM实时数据需求,You.com的优化设计表现突出,支持32k大上下文窗口和快速响应。文章提供了完整的代码示例和场景化选型建议,帮助开发者高效集成搜索API到AI项目中。

weixin_42569329的博客 478

计量经济学——事件研究法/事件分析法

计量经济学——事件研究法/事件分析法

weixin_46189461的博客 6752

opencl coarse svm

设备端代码: //using for coarse svm test typedef struct _Element{ __global float *internal; __global float *external; float value; }Element; __kernel void svmbasic(__global Element *elements, ...

qingsong1001的专栏 552

37、OpenMP:并行编程的强大工具

本文详细介绍了 OpenMP 的核心功能和使用方法,包括执行环境例程、线程同步与协调机制,如关键区域、屏障、原子操作、归约子句、刷新构造和锁机制。此外,还提供了多个实践练习,涵盖矩阵乘法的并行实现、任务池与流水线模式的应用、读写锁的扩展与移植,以及客户端-服务器模式的实现与优化。通过这些内容,读者可以全面掌握 OpenMP 在并行编程中的实际应用与性能优化技巧。

www00的博客 101

OpenCL 2.0 规范 – SVM共享虚拟内存

OpenCL2.0规范相对于1.2版本做出了重大改进,使得一个多元系统中各个硬件之间增强了通信与协作能力。在接下来的系列文章中,将着重讲解OpenCL2.0的新特性,探究其重要性以及对开发、性能等方面会产生什么影响。

异构开发技术社区官方博客 9155

111. 如何创建 SAP ABAP 锁对象(Lock Object)和加锁以及解锁函数

至此,我们完成了 ABAP 系统锁机制和加锁解锁函数的介绍。有了这些基础知识,大家就能在实际工作中,使用 Lock Object 和加锁解锁函数,编写出支持并发访问控制的 ABAP 应用程序了。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1532

Proteus-51单片机-LCD1602显示DS1302时钟

本文详细介绍了如何使用Proteus仿真51单片机配合LCD1602显示DS1302时钟的步骤,包括DS1302时钟芯片的主要特性、引脚定义、外围电路以及LCD1602的原理和技术参数。此外,还讲解了LCD1602的指令集和显示字符的方法,并给出了初始化及显示操作的步骤。

让你爱上电路设计 6978

Chart 3 OpenCL on Snapdragon

OpenCL for Snapdragon

qq_35227495的博客 1510

《open3D+pyqt》点云读取、显示与保存

《open3D+pyqt》第一章:点云读取与显示一、效果展示二、环境配置三、代码3.1 qt designer设置3.2 生成ui,qrc的py文件3.3 py文件代码 一、效果展示 二、环境配置 环境配置:Anconda+pycharm+pyqt+open3d+pyqtgraph 显示界面:这里选择pyqtgraph 参考网上教程 三、代码 3.1 qt designer设置 界面布局参照《PCL+QT》教程,界面设置:布局如下: 布局参数参考: 3.2 生成ui,qrc的py文件 3.3 py

阁楼 7110

OpenCL 通用编程与优化(3)

OpenCL 通用编程与优化(3)

weixin_38498942的博客 1216

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

OpenCL 2.0 SVM

一、SVM出现是为了解决什么问题? Fig.1 OpenCL 1.2中主机与设备端地址空间 Fig. 2OpenCL 2.0中主机与设备端地址空间 从Fig.1可以看到,主机与设备具有不同的地址空间,各自需要对各自的内存进行管理。彼此之间不能直接访问对方的地址空间。所以,两者之间数据需要通信的话,只能把数据在主机与设备...

1070

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

OPENCL异构并行计算原理机制与优化实践资源下载介绍

OPENCL异构并行计算原理机制与优化实践资源下载介绍 去发现同类优质开源项目:https://gitcode.com/ 在当前的计算机技术领域,异构并行计算已成为提升计算性能的重要手段。本文将为您详细介绍《OPENCL异构并行计算原理机制与优化实践》项目,帮助您掌握核心功能,并引导您如何有效利用这一资源。 项目介绍 《OPENCL异构并行计算原理机制与优化实践》是一部专注于OpenCL 2.0技...

gitblog_06701的博客 403

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

第 012 集:OpenCL SVM(共享虚拟内存)详解

System Scope SVM 让所有设备(包括 CPU)共享同一份物理内存,不需要任何数据拷贝。这在 APU(CPU+GPU 同一芯片)或集成显卡上是原生支持的。

z534437748的博客 293

《OPENCL异构并行计算原理机制与优化实践》资源下载介绍

《OPENCL异构并行计算原理机制与优化实践》资源下载介绍 去发现同类优质开源项目:https://gitcode.com/ 《OPENCL异构并行计算原理机制与优化实践》是国内首本由我国技术人员编写的,基于OpenCL 2.0技术深入探讨的专著。本书对OpenCL 2.0的诸多特性进行了详细的解读,包括但不限于管道、SVM以及基于C11标准的原子操作。 书中不仅对OpenCL 2.0的特性进行了...

gitblog_06725的博客 408

OpenCL是否能像CPU那样直接支持指针的链表?

指针链表的灾难:链表节点在内存中是跳跃分布的。在 GPU 上,如果同一个 Warp 中的线程 A 的链表还有 10 个节点,而线程 B 的链表已经到末尾(NULL),GPU 必须串行化执行:先让 A 执行循环,B 等待;这意味着,在主机上分配的包含指针的数据结构,其指针值在 GPU 上依然是有效的,不会变成野指针。在 OpenCL 2.0 引入共享虚拟内存(SVM)后,主机(CPU)和设备(GPU)可以共享复杂的、包含指针的数据结构(如树和链表),从而消除了在主机和设备之间手动封送(拷贝)数据的需要。

gongda4nian4的专栏 338

第23章 Generic_address_space - 通用地址空间测试

本文介绍了OpenCL 2.0引入的通用地址空间特性,它允许使用通用指针指向global、local或private地址空间的数据,提高了代码的灵活性和可重用性。主要内容包括:1)通用指针的声明、赋值和隐式转换规则;2)地址空间查询函数get_fence()的使用;3)地址空间转换函数to_global()、to_local()和to_private()的用法;4)通用指针作为函数参数的应用场景。通过测试用例展示了不同地址空间指针的转换和处理方法,验证了通用地址空间功能的正确性。

图形/计算GPU的驱动与虚拟化技术分享园地 778

OpenCL 2.0 规范 – Pipes(管道)

上一篇文章我们介绍了OpenCL2.0的新特性共享虚拟内存(SVM)。本文将继续讲述另一个新特性,“pipes(管道)”。

异构开发技术社区官方博客 4734
上一篇: 详细程序注解学OpenCL一 环境配置和入门程序
下一篇: 各种音视频编解码学习详解
凌风探梅
博客等级 码龄19年 2575粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值