GPU:从图形处理器到通用并行计算引擎

需积分: 9 7 下载量 95 浏览量 更新于2024-11-05 收藏 4MB PDF 举报
"GPU的工作原理及其发展演变" GPU(图形处理器)自20世纪90年代初以来,从科学幻想变为现实,几乎每台新计算机都配备了专门用于提供高性能、视觉丰富的交互式3D体验的GPU。这一显著变化源于消费者对视频游戏的需求增长,制造技术的进步,以及对前向图形管道内在并行性的利用。 传统的GPU采用固定功能的3D图形管线,而现在的GPU已经转向了灵活的通用计算引擎。这种转变使得GPU能够直接在图形硬件上实现许多并行算法。对于能够充分利用底层计算能力的算法来说,它们经常能够获得巨大的速度提升。因此,GPU被誉为首款广泛应用于桌面的并行计算机。 **图形管道(The Graphics Pipeline)** 3D图形系统的任务是将复杂的三维模型转化为屏幕上二维图像的过程。这个过程通过一系列阶段的图形管道来完成,包括以下几个关键步骤: 1. **顶点处理(Vertex Processing)**:这是图形管道的起点,GPU处理3D模型的几何信息,如顶点位置、法线和纹理坐标。它执行矩阵变换,将3D坐标转换到2D屏幕空间。 2. **图元装配(Primitive Assembly)**:顶点被组合成基本的图元,如三角形或线段,这些图元是渲染的基本单元。 3. **光栅化(Rasterization)**:将图元分解为屏幕上的像素,进行遮挡测试,确定哪些像素应该被渲染。 4. **片段处理(Fragment Processing)**:对每个像素应用着色,计算颜色、深度和光照效果。这包括纹理映射和混合操作,以创建平滑的表面和阴影。 5. **屏幕空间处理(Screen-Space Operations)**:最后,通过深度测试、alpha测试等步骤,筛选出最终要在屏幕上显示的像素,然后将它们组合成最终的图像。 GPU的设计使其在这些步骤中能同时处理大量数据,从而极大地提高了渲染速度。随着技术的发展,现代GPU还支持更高级的技术,如可编程着色器,允许开发者自定义图形管道的各个阶段,以适应各种复杂的渲染需求。 GPU的并行计算能力使其在科学计算、机器学习、深度学习等领域也发挥了重要作用。例如,在深度学习中,大量的矩阵运算和卷积操作可以高效地在GPU上并行执行,大大加快了训练和推理的速度。 GPU从最初的专注于图形渲染的设备演变为一种强大的并行计算平台,其灵活性和效率使其在多个领域都发挥着至关重要的作用。随着技术的不断进步,GPU将继续在推动计算性能的边界方面扮演关键角色。

没有GPU,优化程序class point_cloud_generator(): def init(self, rgb_file, depth_file, save_ply, camera_intrinsics=[312.486, 243.928, 382.363, 382.363]): self.rgb_file = rgb_file self.depth_file = depth_file self.save_ply = save_ply self.rgb = cv2.imread(rgb_file) self.depth = cv2.imread(self.depth_file, -1) print("your depth image shape is:", self.depth.shape) self.width = self.rgb.shape[1] self.height = self.rgb.shape[0] self.camera_intrinsics = camera_intrinsics self.depth_scale = 1000 def compute(self): t1 = time.time() depth = np.asarray(self.depth, dtype=np.uint16).T self.Z = depth / self.depth_scale fx, fy, cx, cy = self.camera_intrinsics X = np.zeros((self.width, self.height)) Y = np.zeros((self.width, self.height)) for i in range(self.width): X[i, :] = np.full(X.shape[1], i) self.X = ((X - cx / 2) * self.Z) / fx for i in range(self.height): Y[:, i] = np.full(Y.shape[0], i) self.Y = ((Y - cy / 2) * self.Z) / fy data_ply = np.zeros((6, self.width * self.height)) data_ply[0] = self.X.T.reshape(-1)[:self.width * self.height] data_ply[1] = -self.Y.T.reshape(-1)[:self.width * self.height] data_ply[2] = -self.Z.T.reshape(-1)[:self.width * self.height] img = np.array(self.rgb, dtype=np.uint8) data_ply[3] = img[:, :, 0:1].reshape(-1)[:self.width * self.height] data_ply[4] = img[:, :, 1:2].reshape(-1)[:self.width * self.height] data_ply[5] = img[:, :, 2:3].reshape(-1)[:self.width * self.height] self.data_ply = data_ply t2 = time.time() print('calcualte 3d point cloud Done.', t2 - t1) def write_ply(self): start = time.time() float_formatter = lambda x: "%.4f" % x points = [] for i in self.data_ply

2023-05-24 上传