显示硬件发展与视频开发系列(6)----显示标注与视频处理单元(3):APU
APU是“Accelerated Processing Units”的简称,中文名字叫加速处理器,是AMD融聚未来理念的产品,它第一次将处理器和独显核心做在一个晶片上。
CPU与APU协同计算、彼此加速,具有高性能处理器和最新支持DX11独立显卡的处理性能,大幅提升电脑运行效率,实现了CPU与GPU真正的融合。APU是处理器未来发展的趋势。
7.3.1、AMD与APU
从APU发展来看,AMD让CPU和GPU彻底融为一体,无论是AMD的Llano,还是Brazos,目标都是一致的。
第一步:物理整合(Physical Integration),将CPU和GPU集成在同一块硅芯片上,利用高带宽的内部总线通讯,集成高性能的内存控制器,借助开放的软件系统促成异构计算。
第二步:平台优化(Optimized Platforms),CPU和GPU之间互连接口进一步增强,统一进行双向电源管理,GPU支持高级编程语言。
第三步:架构整合(Architectural Integration),实现统一的CPU/GPU寻址空间、GPU使用可分页系统内存、GPU硬件可调度、CPU/GPU/APU内存协同一致。
第四步:架构和系统整合(Architectural & OS Integration),主要特点包括GPU计算环境切换、GPU图形优先计算、独立显卡的PCI-E协同、任务并行运行实时整合等等。
AMD Fusion系列APU将多核(x86)中央处理器、支持DX11标准的强大独立显卡性能以及高速总线融合在一块芯片上,拥有并行处理引擎和专门高清视频加速模块,实现数据在不同处理核心间的加速传递。
AMD通过和宏碁、华硕、戴尔、富士通、惠普、联想、微星、三星、索尼、东芝等领先PC厂商合作,在电脑上推出基于AMD Fusion APU的新品。
7.3.2、VISION引擎
带有VISION引擎标识的电脑代表着更强大的性能。更流畅的上网体验;华丽、流畅、安静的高清视频播放;使标清视频播放出高清效果;将2D内容转换成更立体的3D格式;轻松高清应用;为用户带来3D游戏体验。
运算体验与软件密不可分,开发者受到CPU和GPU处理信息时各自为战进行独立计算的制约。今天,AMD Fusion APU消除了这一障碍,开发者可以利用GPU的并行处理能力。
AMD Fusion技术全天电池续航能力,续航时间长达10小时以上。单芯片设计所带来的节电效果超过我们的预料。
7.3.3、APU新品
锐龙7 5700G处理器采用Cezanne(塞尚)核心,与AMD路线图中一致。其最高频率大约为4.75GHz,为8核16线程,三级缓存为16MB,只有“标准版”的一半,CPU测试成绩则绝对是锐龙5000级别的,轻松压制十代酷睿和自家的锐龙3000。
7.3.4、APU编程
APU没有设计独立的开发环境,APU目前支持OpenCL与OpenGL、DirectX等。在并行编程领域,主要支持的是OpenCL。
下面是OpenCL示例代码:
#include <iostream>
#include <fstream>
#include <sstream>
#include <CL/cl.h>const int ARRAY_SIZE = 1000;//一、 选择OpenCL平台并创建一个上下文
cl_context CreateContext()
{cl_int errNum;cl_uint numPlatforms;cl_platform_id firstPlatformId;cl_context context = NULL;//选择可用的平台中的第一个errNum = clGetPlatformIDs(1, &firstPlatformId, &numPlatforms);if (errNum != CL_SUCCESS || numPlatforms <= 0){std::cerr << "Failed to find any OpenCL platforms." << std::endl;return NULL;}//创建一个OpenCL上下文环境cl_context_properties contextProperties[] ={CL_CONTEXT_PLATFORM,(cl_context_properties)firstPlatformId,0};context = clCreateContextFromType(contextProperties, CL_DEVICE_TYPE_GPU,NULL, NULL, &errNum);return context;
}//二、 创建设备并创建命令队列
cl_command_queue CreateCommandQueue(cl_context context, cl_device_id *device)
{cl_int errNum;cl_device_id *devices;cl_command_queue commandQueue = NULL;size_t deviceBufferSize = -1;// 获取设备缓冲区大小errNum = clGetContextInfo(context, CL_CONTEXT_DEVICES, 0, NULL, &deviceBufferSize);if (deviceBufferSize <= 0){std::cerr << "No devices available.";return NULL;}// 为设备分配缓存空间devices = new cl_device_id[deviceBufferSize / sizeof(cl_device_id)];errNum = clGetContextInfo(context, CL_CONTEXT_DEVICES, deviceBufferSize, devices, NULL);//选取可用设备中的第一个commandQueue = clCreateCommandQueue(context, devices[0], 0, NULL);*device = devices[0];delete[] devices;return commandQueue;
}// 三、创建和构建程序对象
cl_program CreateProgram(cl_context context, cl_device_id device, const char* fileName)
{cl_int errNum;cl_program program;std::ifstream kernelFile(fileName, std::ios::in);if (!kernelFile.is_open()){std::cerr << "Failed to open file for reading: " << fileName << std::endl;return NULL;}std::ostringstream oss;oss << kernelFile.rdbuf();std::string srcStdStr = oss.str();const char *srcStr = srcStdStr.c_str();program = clCreateProgramWithSource(context, 1,(const char**)&srcStr,NULL, NULL);errNum = clBuildProgram(program, 0, NULL, NULL, NULL, NULL);return program;
}//创建和构建程序对象
bool CreateMemObjects(cl_context context, cl_mem memObjects[3],float *a, float *b)
{memObjects[0] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,sizeof(float) * ARRAY_SIZE, a, NULL);memObjects[1] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,sizeof(float) * ARRAY_SIZE, b, NULL);memObjects[2] = clCreateBuffer(context, CL_MEM_READ_WRITE,sizeof(float) * ARRAY_SIZE, NULL, NULL);return true;
}// 释放OpenCL资源
void Cleanup(cl_context context, cl_command_queue commandQueue,cl_program program, cl_kernel kernel, cl_mem memObjects[3])
{for (int i = 0; i < 3; i++){if (memObjects[i] != 0)clReleaseMemObject(memObjects[i]);}if (commandQueue != 0)clReleaseCommandQueue(commandQueue);if (kernel != 0)clReleaseKernel(kernel);if (program != 0)clReleaseProgram(program);if (context != 0)clReleaseContext(context);
}int main(int argc, char** argv)
{cl_context context = 0;cl_command_queue commandQueue = 0;cl_program program = 0;cl_device_id device = 0;cl_kernel kernel = 0;cl_mem memObjects[3] = { 0, 0, 0 };cl_int errNum;// 一、选择OpenCL平台并创建一个上下文context = CreateContext();// 二、 创建设备并创建命令队列commandQueue = CreateCommandQueue(context, &device);//创建和构建程序对象program = CreateProgram(context, device, "HelloWorld.cl");// 四、 创建OpenCL内核并分配内存空间kernel = clCreateKernel(program, "hello_kernel", NULL);//创建要处理的数据float result[ARRAY_SIZE];float a[ARRAY_SIZE];float b[ARRAY_SIZE];for (int i = 0; i < ARRAY_SIZE; i++){a[i] = (float)i;b[i] = (float)(ARRAY_SIZE - i);}//创建内存对象if (!CreateMemObjects(context, memObjects, a, b)){Cleanup(context, commandQueue, program, kernel, memObjects);return 1;}// 五、 设置内核数据并执行内核errNum = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObjects[0]);errNum |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObjects[1]);errNum |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObjects[2]);size_t globalWorkSize[1] = { ARRAY_SIZE };size_t localWorkSize[1] = { 1 };errNum = clEnqueueNDRangeKernel(commandQueue, kernel, 1, NULL,globalWorkSize, localWorkSize,0, NULL, NULL);// 六、 读取执行结果并释放OpenCL资源errNum = clEnqueueReadBuffer(commandQueue, memObjects[2], CL_TRUE,0, ARRAY_SIZE * sizeof(float), result,0, NULL, NULL);for (int i = 0; i < ARRAY_SIZE; i++){std::cout << result[i] << " ";}std::cout << std::endl;std::cout << "Executed program succesfully." << std::endl;getchar();Cleanup(context, commandQueue, program, kernel, memObjects);return 0;
}
7.3.5、总结
APU的成功,巩固了AMD的市场,和INTEL形成有力的竞争。推动处理器技术、架构技术、并行计算技术的发展。多年以来,INTEL吊打AMD,APU的出现,这一局面得到改变。
并行计算领域,APU主要支持OpenCL技术,随着时间的推移,OpenCL技术将不断完善,驱动将不断更新。
AMD有着光辉的过去,也应该有着辉煌的明天。为处理器的发展做出了卓越的贡献。图为台湾籍AMD总裁苏姿丰女士。英伟达的黄仁勋为苏姿丰的舅舅。在芯片领域,台籍华人有着卓越的贡献。
显示硬件发展与视频开发系列(6)----显示标注与视频处理单元(3):APU相关推荐
- 显示硬件发展与视频开发系列(6)----显示标注与视频处理单元(1):显示标准
7.显示标准与视频处理单元 消费级视频智能处理大体有10年左右,有了巨大的发展,展望未来,对应于大厂而言,竞争是标准的竞争.包含显示标准与处理单元,竞争推动了科技的进步,市场的繁荣. 新的显示硬件也不 ...
- 音视频开发系列(15):视频与音频同步
上次分享了将视频与音频同时推流到服务上的代码封装,然后上节分享在测试后会发现音视频不同步,这边说一下原因: 从帧率及采样率,即可知道视频/音频播放速度.声卡和显卡均是以一帧数据来作为播放单位,如果单纯 ...
- 显示硬件发展与视频开发系列(6)----显示标注与视频处理单元(2):VPU
VPU(Video Processing Unit,视频处理单元)是一种全新的视频处理平台核心引擎,具有硬解码功能以及减少CPU负荷的能力.VPU可以减少服务器负载和网络带宽的消耗. VPU由ATI提 ...
- 显示硬件发展与视频开发系列(6)----显示标注与视频处理单元(5):TPU
TPU(Tensor Processing Unit)张量处理单元,为机器学习定制的芯片,经过专门深度机器学习方面的训练,它有更高效能(每瓦计算能力). 谷歌,2015年6月,I/O开发者大会上推出的 ...
- 【音视频开发系列】一学就会,快速掌握音视频开发的第一个开源项目FFmpeg
快速掌握音视频开发的第一个开源项目:FFmpeg 1.为什么要学FFmpeg 2.FFmpeg面向对象思想分析 3.FFmpeg各种组件剖析 视频讲解如下,点击观看: [音视频开发系列]一学就会,快速 ...
- 【音视频开发系列】盘点音视频直播RTSP/RTMP推流一定会遇到的各种坑,教你快速解决
聊聊RTSP/RTMP推流那些坑 1.推流架构分析 2.推流缓存队列的设计 3.FFmpeg函数阻塞问题分析 [音视频开发系列]盘点音视频直播一定会遇到的各种坑,教你快速解决 更多精彩内容包括:C/C ...
- 【音视频开发系列】srs-webrtc-janus开源流媒体服务器分析
全球最牛开源流媒体服务器源码分析 1.如何学习流媒体服务器 2.全球最牛流媒体服务器架构分析 3.我们能从全球最牛流媒体服务器得到什么 [音视频开发系列]srs-webrtc-janus流媒体服务器分 ...
- 音视频开发之旅(32)-音视频学习资料
目录 为什么要学习音视频? 如何学习系统性音视频? 音视频相关的资料 学习实践的输出文章分类聚合 收获 最近有朋友问想学习音视频,应该怎么学,有什么资料吗? 这个问题也困扰我很久,几年前就想开始音视频 ...
- Android音视频开发基础(七):视频采集-系统API基础
前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了<Android 音视频从入门到提高 - 任务列表>.本文是Android音视 ...
最新文章
- commons-collections使用介绍之Bag HashBag
- flash写保护原理_一种基于flash写保护的防止flash被意外篡改的方法与流程
- mnn linux编译
- 'ScriptModel' object has no attribute 'save'
- 20170429,上市公司2016年报全出炉(附最新排行榜)
- Defination list(定义列表)
- Adobe After Effects CS6 操作记录
- linux安装多路径报错,Linux操作系统配置多路径通用教程(适用于(RHEL,CentOS,SuSE等)...
- (Builder)创建者模式
- tp3.2框架关闭日志记录
- cmake list all directories
- python怎么读取txt文件-Python笔记(读取txt文件中的数据)
- sass用法快速入门
- 【华南理工大学】PC客户端配置-如何在家连接学校的校园网
- mmap文件做成html,mmap()映射到文件的一些总结
- 独家丨我在北工大看王校长吃热狗
- 接入阿里云OSS--公有云分布式存储
- nas家庭服务器是无线连接吗,NAS家庭存储服务器搭建需要注意哪些问题?(上)...
- Predefined Evenly-Distributed Class Centroids(PEDCC)预定义类中心做分类解读
- 检查是否中了挖矿木马4 linux,一款新型的Linux挖矿木马来袭