使用 accelerator 和 accelerator_view 对象
您可以使用加速器 和 accelerator_view 指定的设备或仿真程序运行 AMP C++ 代码的类。 一个系统可能有多个设备或模拟器的内存量,不同的调试支持或双精度的支持。 C + + 加速大规模并行 (C++ AMP) 提供了 Api,可用于检查可用的快捷键,请设置作为默认值,指定多个加速器多次调用 parallel_for_each,并执行特殊的调试任务。
使用默认加速器
C + + 的存储系统运行时将选择默认快捷键,除非您编写代码来选择特定的一项。 运行时选择的默认快捷键的如下所示:
如果在调试模式下运行该应用程序,加速器支持的调试。
否则为由 CPPAMP_DEFAULT_ACCELERATOR 环境变量,如果此属性设置指定的快捷键。
否则为非模拟的设备。
否则为有最大的可用内存的设备。
否则为未连接到显示设备。
您可以通过构造的默认快捷键并检查其属性确定的默认快捷键的属性。 下面的代码示例输出路径、 内存和双精度的默认加速器的支持。
void default_properties() {
accelerator default_acc;
std::wcout << default_acc.device_path << "\n";
std::wcout << default_acc.dedicated_memory << "\n";
std::wcout << (default_acc.supports_double_precision ?
"double precision: true" : "double precision: false") << "\n";
}
CPPAMP_DEFAULT_ACCELERATOR 环境变量
您可以设置 CPPAMP_DEFAULT_ACCELERATOR 环境变量以指定accelerator::device_path的默认加速器。 路径与硬件有关。 下面的代码使用accelerator::get_all函数来检索可用快捷键的列表并显示每个加速器的路径。
void list_all_accelerators()
{
std::vector<accelerator> accs = accelerator::get_all();
for (int i = 0; i < accs.size(); i++) {
std::wcout << accs[i].device_path << "\n";
std::wcout << accs[i].dedicated_memory << "\n";
std::wcout << (accs[i].supports_double_precision ?
"double precision: true" : "double precision: false") << "\n";
}
}
选择快捷键
若要选择加速器,请使用accelerator::get_all方法来检索可用快捷键的列表,然后选择一种基于其属性。 此示例演示如何选择具有最多内存的快捷键:
void pick_with_most_memory()
{
std::vector<accelerator> accs = accelerator::get_all();
accelerator acc_chosen = accs[0];
for (int i = 0; i < accs.size(); i++) {
if (accs[i].dedicated_memory > acc_chosen.dedicated_memory) {
acc_chosen = accs[i];
}
}
std::wcout << "The accelerator with the most memory is "
<< acc_chosen.device_path << "\n"
<< acc_chosen.dedicated_memory << ".\n";
}
备注
返回的加速器之一accelerator::get_all是 CPU 加速器。CPU 加速器,您不能执行代码。若要筛选出的 CPU 加速器,进行比较的值设备路径属性所返回的加速器accelerator::get_all的值与 accelerator::cpu_accelerator。有关详细信息,请参阅本文中的"特殊加速服务"部分。
更改默认加速器
您可以更改默认加速器通过调用accelerator::set_default方法。 只有当每个应用程序执行,您必须更改其 GPU 上执行任何代码之前,您可以更改的默认快捷键。 若要更改加速器的任何后续的函数调用返回false。 如果要调用中使用不同的加速器parallel_for_each,阅读本文的"使用多个加速服务"一节。 下面的代码示例将默认快捷键设置为未仿真、 未连接到显示器,并支持双精度。
bool pick_accelerator()
{
std::vector<accelerator> accs = accelerator::get_all();
accelerator chosen_one;
auto result =
std::find_if(accs.begin(), accs.end(), [] (const accelerator& acc)
{
return !acc.is_emulated &&
acc.supports_double_precision &&
!acc.has_display;
});
if (result != accs.end())
chosen_one = *(result);
std::wcout << chosen_one.description << std::endl;
bool success = accelerator::set_default(chosen_one.device_path);
return success;
}
使用多个加速器
有两种方法可以在您的应用程序中使用多个快捷键:
您可以通过accelerator_view对象的调用 parallel_for_each 方法。
您可以构建array对象使用特定的accelerator对象。 C + 存储系统运行时将拿起accelerator_view中捕获的对象array中的 lambda 表达式的对象。
特殊的加速键
三个特殊的加速键的设备路径都可以作为属性的accelerator类:
accelerator::direct3d_ref 数据成员: 此单线程加速器的 cpu 使用软件模拟通用图形卡。 默认情况下使用以进行调试,但因为它是慢于硬件的加速器,它是没有用在生产环境中。 此外,它是仅可 DirectX SDK 和 Windows SDK,和不太可能安装在您的客户的计算机上。 有关更多信息,请参见 调试 GPU 代码。
accelerator::direct3d_warp 数据成员: 此加速器提供备用解决方案对使用流 SIMD 扩展 (SSE) 的多核 Cpu 执行 AMP C++ 代码。
accelerator::cpu_accelerator 数据成员: 设置临时数组您可以使用该快捷键。 它不能执行 AMP C++ 代码。 有关详细信息,请参阅C++ 的存储系统中的临时数组上的并行编程的本机代码的博客中发布。
互操作性
C + + 的存储系统运行时支持之间的互操作性accelerator_view类,Direct3D ID3D11Device 接口。 Create_accelerator_view 方法采用IUnknown接口,并返回accelerator_view对象。 Get_device 方法采用accelerator_view对象,并返回IUknown接口。