APU是“Accelerated Processing Units”的简称,中文名字叫加速处理器,是AMD融聚未来理念的产品,它第一次将处理器和独显核心做在一个晶片上。

CPU与APU协同计算、彼此加速,具有高性能处理器和最新支持DX11独立显卡的处理性能,大幅提升电脑运行效率,实现了CPU与GPU真正的融合。APU是处理器未来发展的趋势。

7.3.1、AMD与APU

从APU发展来看,AMD让CPU和GPU彻底融为一体,无论是AMD的Llano,还是Brazos,目标都是一致的。

AMD认为,CPU和GPU的融合分为四步进行:

第一步:物理整合(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 Fusion APU的台式机、笔记本和高清轻薄本已经销售多年。基于AMD Fusion APU的平板电脑和嵌入式电脑有很多优点。高清视频播放效果流畅,满足多种应用的突破性的计算能力,全面支持DX以及强大的电池续航能力。

AMD通过和宏碁、华硕、戴尔、富士通、惠普、联想、微星、三星、索尼、东芝等领先PC厂商合作,在电脑上推出基于AMD Fusion APU的新品。

AMD公司高级副总裁Rick Bergman表示:“简而言之,我认为AMD Fusion加速处理器是自从x86架构问世之后40余年来处理器领域最伟大的进步。通过这一跨越,我们让顾客能够随时随地体验高清视频、享受       超级个人计算体验,并且让笔记本电脑具备全天的电池续航能力。这是一个全新的产品系列,全新的视角,给消费者带来全新的精彩应用体验。”

7.3.2、VISION引擎

随着硬件技术的进步,高清视频的时代到来了。从YouTube视频网站到DirectX12电脑游戏再到蓝光碟片,得到广泛应用。AMD VISION引擎横空出世,一系列与高清视频相关的独特性能将使基于AMD APU的个人电脑为用户带来更加生动与逼真的高清视频体验。

VISION引擎汇集了下列功能:

  1. 支持DirectX11标准
  2. 强大的并行处理能力加速应用性能提升
  3. AMD Radeon™ HD 6800系列显卡整合UVD3视频加速模块
  4. 独特的图形驱动程序,每月更新,不断提高视频性能。

带有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相关推荐

  1. 显示硬件发展与视频开发系列(6)----显示标注与视频处理单元(1):显示标准

    7.显示标准与视频处理单元 消费级视频智能处理大体有10年左右,有了巨大的发展,展望未来,对应于大厂而言,竞争是标准的竞争.包含显示标准与处理单元,竞争推动了科技的进步,市场的繁荣. 新的显示硬件也不 ...

  2. 音视频开发系列(15):视频与音频同步

    上次分享了将视频与音频同时推流到服务上的代码封装,然后上节分享在测试后会发现音视频不同步,这边说一下原因: 从帧率及采样率,即可知道视频/音频播放速度.声卡和显卡均是以一帧数据来作为播放单位,如果单纯 ...

  3. 显示硬件发展与视频开发系列(6)----显示标注与视频处理单元(2):VPU

    VPU(Video Processing Unit,视频处理单元)是一种全新的视频处理平台核心引擎,具有硬解码功能以及减少CPU负荷的能力.VPU可以减少服务器负载和网络带宽的消耗. VPU由ATI提 ...

  4. 显示硬件发展与视频开发系列(6)----显示标注与视频处理单元(5):TPU

    TPU(Tensor Processing Unit)张量处理单元,为机器学习定制的芯片,经过专门深度机器学习方面的训练,它有更高效能(每瓦计算能力). 谷歌,2015年6月,I/O开发者大会上推出的 ...

  5. 【音视频开发系列】一学就会,快速掌握音视频开发的第一个开源项目FFmpeg

    快速掌握音视频开发的第一个开源项目:FFmpeg 1.为什么要学FFmpeg 2.FFmpeg面向对象思想分析 3.FFmpeg各种组件剖析 视频讲解如下,点击观看: [音视频开发系列]一学就会,快速 ...

  6. 【音视频开发系列】盘点音视频直播RTSP/RTMP推流一定会遇到的各种坑,教你快速解决

    聊聊RTSP/RTMP推流那些坑 1.推流架构分析 2.推流缓存队列的设计 3.FFmpeg函数阻塞问题分析 [音视频开发系列]盘点音视频直播一定会遇到的各种坑,教你快速解决 更多精彩内容包括:C/C ...

  7. 【音视频开发系列】srs-webrtc-janus开源流媒体服务器分析

    全球最牛开源流媒体服务器源码分析 1.如何学习流媒体服务器 2.全球最牛流媒体服务器架构分析 3.我们能从全球最牛流媒体服务器得到什么 [音视频开发系列]srs-webrtc-janus流媒体服务器分 ...

  8. 音视频开发之旅(32)-音视频学习资料

    目录 为什么要学习音视频? 如何学习系统性音视频? 音视频相关的资料 学习实践的输出文章分类聚合 收获 最近有朋友问想学习音视频,应该怎么学,有什么资料吗? 这个问题也困扰我很久,几年前就想开始音视频 ...

  9. Android音视频开发基础(七):视频采集-系统API基础

    前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了<Android 音视频从入门到提高 - 任务列表>.本文是Android音视 ...

最新文章

  1. commons-collections使用介绍之Bag HashBag
  2. flash写保护原理_一种基于flash写保护的防止flash被意外篡改的方法与流程
  3. mnn linux编译
  4. 'ScriptModel' object has no attribute 'save'
  5. 20170429,上市公司2016年报全出炉(附最新排行榜)
  6. Defination list(定义列表)
  7. Adobe After Effects CS6 操作记录
  8. linux安装多路径报错,Linux操作系统配置多路径通用教程(适用于(RHEL,CentOS,SuSE等)...
  9. (Builder)创建者模式
  10. tp3.2框架关闭日志记录
  11. cmake list all directories
  12. python怎么读取txt文件-Python笔记(读取txt文件中的数据)
  13. sass用法快速入门
  14. 【华南理工大学】PC客户端配置-如何在家连接学校的校园网
  15. mmap文件做成html,mmap()映射到文件的一些总结
  16. 独家丨我在北工大看王校长吃热狗
  17. 接入阿里云OSS--公有云分布式存储
  18. nas家庭服务器是无线连接吗,NAS家庭存储服务器搭建需要注意哪些问题?(上)...
  19. Predefined Evenly-Distributed Class Centroids(PEDCC)预定义类中心做分类解读
  20. 检查是否中了挖矿木马4 linux,一款新型的Linux挖矿木马来袭

热门文章

  1. 可喜可贺!你带薪如厕 44 分钟,击败了全公司所有人
  2. oracle 权限 策略,Oracle学习笔记(14)权限管理(
  3. 发现阿里DNS存在恶意广告行为
  4. [导入]做杨振宁还是做邓稼先
  5. 【无敌海景清醒电脑xp主题】
  6. 计算机高中期末总结作文,高一期末考试总结作文600字(通用5篇)
  7. 菜鸟程序员的第一个半年总结
  8. 谈谈计算机网络与通信
  9. Xamarin跨线程
  10. 连锁酒店如何进行分账对接?