Transiting from CUDA to HIP (二)

一、Identifying Architecture Features
1. HIP_ARCH Defines

在 CUDA 编程中,__CUDA_ARCH__ 是一个预定义的宏,用于指示当前编译的代码所针对的 NVIDIA GPU 的计算能力(Compute Capability)。开发者可以使用这个宏来编写条件代码,以便在不同架构的 GPU 上支持不同的特性。例如,如果代码需要使用双精度浮点数(doubles),它可能会检查 __CUDA_ARCH__ 是否大于或等于 130,因为这是支持双精度浮点数的最小计算能力。

#if (__CUDA_ARCH__ >= 130) 
// doubles are supported 

然而,当使用 AMD GPU 和 ROCm 平台时,这种基于 __CUDA_ARCH__ 的检查就不再适用,因为 AMD GPU 有不同的架构和特性集。为了解决这个问题,HIP(Heterogeneous-compute Interface for Portability)提供了一套宏定义,使得开发者可以编写可移植的代码,这些代码可以在 NVIDIA 的 CUDA 平台和 AMD 的 ROCm 平台上运行。

HIP 提供的宏定义如下:

  • __HIP_ARCH_HAS_DOUBLES__:如果当前的 GPU 支持双精度浮点数,则定义为真。

在编写 HIP 代码时,您应该使用这些宏来代替直接比较 __CUDA_ARCH__ 的值。这样做的好处是您的代码可以在不同的硬件架构上移植,而不需要为每种架构编写特定的条件代码

#if __HIP_ARCH_HAS_DOUBLES__
// 双精度浮点数在当前架构上是支持的
#endif

对于主机代码(即在 CPU 上运行的代码),所有 __HIP_ARCH__ 相关的宏都会被定义为 0。这意味着这些宏只应该在设备代码(即在 GPU 上运行的代码)中使用。

2. Device-Architecture Properties

在 CUDA 和 HIP 编程中,查询设备属性是一种常见的做法,用于确定特定 GPU 设备支持哪些特性。这对于编写可在不同 GPU 架构上运行的可移植代码非常重要。

在 HIP 中,hipGetDeviceProperties 函数用于获取设备的属性,这些属性描述了设备的能力和特性。设备属性结构体 hipDeviceProp_t 包含了多个字段,可以用来检查设备是否支持特定的功能。

以下是如何使用 hipGetDeviceProperties 来查询设备属性的示例:

hipDeviceProp_t deviceProp;
hipGetDeviceProperties(&deviceProp, device);

// 检查设备是否支持共享 int32 原子操作
if (deviceProp.arch.hasSharedInt32Atomics) {
    // 执行支持共享 int32 原子操作的代码
}

在这个例子中,deviceProp.arch.hasSharedInt32Atomics 是一个布尔字段,如果设备支持共享内存中的 32 位整数原子操作,则该字段为真。

与直接测试 majorminor 字段相比,使用 hipGetDeviceProperties 返回的结构体中的特定功能标志字段是一种更可移植的方法。直接测试 majorminor 字段通常与特定的 GPU 架构相关联,这限制了代码的可移植性:

// 不可移植的代码示例
if ((deviceProp.major == 1 && deviceProp.minor < 2)) {
    // 针对特定架构的代码
}

在编写 HIP 代码时,应该避免直接比较 majorminor 字段,而是使用 hipGetDeviceProperties 返回的属性来检查设备的功能。这样可以确保您的代码能够在不同的 GPU 设备上正常运行,无论它们是由 NVIDIA、AMD 还是其他制造商生产的。

3. Table of Architecture Properties

4. Fi
### 如何下载和使用TESS数据集 尽管当前提供的引用并未直接涉及 TESS 数据集的下载与使用方法,但从相关背景可以推测出一些可能的方向。以下是基于现有知识和技术领域内的常见做法。 #### 下载 TESS 数据集 TESS 数据通常由 NASA 提供,主要来源于凌日系外行星巡天卫星 (Transiting Exoplanet Survey Satellite),该卫星的任务是探测太阳附近的明亮恒星周围的系外行星。NASA 的 Mikulski 天文学档案馆(MAST, Barbara A. Mikulski Archive for Space Telescopes)提供了公开访问的数据接口[^4]。 可以通过以下方式获取 TESS 数据: 1. **访问 MAST 官方网站**: 用户可以直接前往 [MAST](https://mast.stsci.edu/) 并注册账户以查询和下载所需数据。 2. **命令行工具 `astroquery`**: Python 中有一个名为 `astroquery` 的第三方库,它支持通过编程的方式检索天文数据库的内容。例如,安装并运行如下代码即可实现自动化下载: ```python from astroquery.mast import Observations # 查询观测记录 obs_table = Observations.query_criteria(obs_collection="TESS", target_name="TOI-700") # 获取产品列表 data_products = Observations.get_product_list(obs_table) # 下载文件 downloaded_files = Observations.download_products(data_products) ``` 上述脚本会根据指定条件筛选目标对象,并自动完成文件传输过程[^5]。 #### 使用 TESS 数据集 一旦成功取得原始资料包之后,则需依据具体需求决定后续处理流程。一般而言,这包括但不限于以下几个方面: - 解压 FITS 文件格式; - 利用 astropy 库解析元信息字段; - 绘制光变曲线或者提取周期信号特征值等科学计算工作。 下面给出一段简单的例子展示如何加载一张标准形式的时间序列测量结果: ```python import matplotlib.pyplot as plt from astropy.io import fits hdul = fits.open('tess_data.fits') # 替换为实际路径名 time = hdul[1].data['TIME'] flux = hdul[1].data['PDCSAP_FLUX'] plt.figure(figsize=(8,6)) plt.plot(time, flux, '.k', markersize=1) plt.xlabel('Time [days]', fontsize=14) plt.ylabel('Normalized Flux', fontsize=14) plt.title('Light Curve of Target Star') plt.show() ``` 此段程序读取存储于本地磁盘上的 `.fits` 类型文档内容,并将其转换成易于理解的形式呈现出来以便进一步研究探讨[^6]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值