链接需要删除
[n2]分不清哪些是步骤(一般有序号),哪些是代码。
而且,前后多句都不完整(既不是标题又不是正文,此类情况全文较多),和代码混在一起
[n3]很多,都需要处理,要么是标题,要么是完整正文……
hcc `hcc-config --cxxflags --ldflags` \
--amdgpu-target=gfx701 \
--amdgpu-target=gfx801 \
--amdgpu-target=gfx802 \
--amdgpu-target=gfx803 \
foo.cpp
use:: HCC_AMDGPU_TARGET env var
使用,以界定HCC中的每个AMDGPU靶点。例子
export HCC_AMDGPU_TARGET=gfx701,gfx801,gfx802,gfx803
#将为Hawaii(gfx701), Carrizo(gfx801), Tonga(gfx802) and Fiji(gfx803) 生成ISA
hcc `hcc-config --cxxflags --ldflags` foo.cpp
使用CMake HSA_AMDGPU_GPU_TARGET变量配置HCC
# 默认情况下,将生成夏威夷(gfx701)、卡里佐(gfx801)、汤加(gfx802)和斐济
#(gfx803)的ISA
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DROCM_DEVICE_LIB_DIR=~hcc/ROCm-Device-Libs/build/dist/lib \
-DHSA_AMDGPU_GPU_TARGET="gfx701;gfx801;gfx802;gfx803" \
../hcc
CodeXL活动记录器
要启用CodeXL活动记录器,请使用use_CodeXL_Activity_Logger环境变量。
按以下方式配置构建
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DHSA_AMDGPU_GPU_TARGET=<AMD GPU ISA version string> \
-DROCM_DEVICE_LIB_DIR=<location of the ROCm-Device-Libs bitcode> \
-DUSE_CODEXL_ACTIVITY_LOGGER=1 \
<ToT HCC checkout directory>
在使用hcc编译的应用程序中,包含CodeXL Activity Logger标头。
#include <CXLActivityLogger.h>
HC现在有两个头文件:
1)hc.hpp:hc的主头文件
2)hc_math.hpp:hc的数学函数
大多数HC API存储在HC命名空间下,类名与C++AMP并发命名空间中的对应类名相同,见表3-3。C++AMP的用户应该很容易从C++AMP切换到HC。
表3-3 C++AMP和HC对应的类名清单
C++AMP |
HC |
Concurrency::accelerator |
hc::accelerator |
Concurrency::accelerator_view |
hc::accelerator_view |
Concurrency::extent |
hc::extent |
Concurrency::index |
hc::index |
Concurrency::completion_future |
hc::completion_future |
Concurrency::array |
hc::array |
Concurrency::array_view |
hc::array_view |
HCC内置宏
内置宏HCC内置宏定义清单,见表3-4。
表3-4 HCC内置宏定义清单
宏 |
定义 |
__HCC__ |
总是1 |
__hcc_major__ |
HCC的主要版本号 |
__hcc_minor__ |
HCC的次要版本号 |
__hcc_patchlevel__ |
HCC的小块级别 |
__hcc_version_ |
_hcc_major__, __hcc_minor__, __hcc_patchlevel_的组合字符串 |
__hcc_patchlevel__的规则是:yyWW-(hcc驱动程序git commit#)-(hcc clang-git commit#)
yy代表年份的最后两位数字
WW代表一年中的周数
HCC语言模式宏定义,见表3-5。
表3-5 HCC语言模式宏定义
语言模式宏 |
定义 |
_KALMAR_AMP__ |
在C++AMP模式下为1(-std=C++AMP;从ROCm 2.0开始删除) |
__KALMAR_HC__ |
HC模式下为1(-HC) |
编译模式:HCC是一个单源编译器,内核代码和宿主代码可以驻留在同一个文件中。在内部,HCC将触发2次编译迭代,用户程序可以使用宏来确定编译器处于哪种模式,见表3-6。
表3-6 HCC编译模式宏定义
编译模式宏 |
定义 |
__KALMAR_ACCELERATOR__ |
如果编译器在内核代码编译模式下运行,则不是0 |
__KALMAR_CPU__ |
如果编译器在宿主代码编译模式下运行,则不是0 |
HC特定功能
1)内核中允许的操作规则放宽
2)tiled.exxtent和tiled_index的新语法
3)动态组段内存分配
4)真正的异步内核启动行为
5)其他HSA特定API
HC API和C++AMP之间的差异
尽管HC和C++AMP共享许多类似的程序构造(例如parallel_for_each、array、
array_view等),但这两个API之间存在几个显著差异。
支持显式异步parallel_for_each在C++AMP中,parallel_for_ each在程序中显示为同步函数调用(即主机等待内核完成);然而,编译器可以优化它以异步执行内核,并且主机将在内核修改的数据首次访问时与设备同步。例如,如果parallel_For_each写入array_view,那么在parallel_For_ each之后对主机上此array_view的第一次访问将被阻止,直到parallel_For_6ach完成。
HC支持C++AMP中的自动同步行为。此外,HC的parallel_for_each支持显式异步执行。它返回一个completion_future(类似于C++std::future)对象,其他异步操作可以与之同步,这为任务图构造提供了更好的灵活性,并实现了对优化的更精确控制。