Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Anda dapat menggunakan kelas akselerator dan accelerator_view untuk menentukan perangkat atau emulator untuk menjalankan kode AMP C++ Anda. Sistem mungkin memiliki beberapa perangkat atau emulator yang berbeda berdasarkan jumlah memori, dukungan memori bersama, dukungan penelusuran kesalahan, atau dukungan presisi ganda. C++ Accelerated Massive Parallelism (C++ AMP) menyediakan API yang dapat Anda gunakan untuk memeriksa akselerator yang tersedia, mengaturnya sebagai default, menentukan beberapa accelerator_views untuk beberapa panggilan ke parallel_for_each, dan melakukan tugas debugging khusus.
Catatan
Header AMP C++ tidak digunakan lagi dimulai dengan Visual Studio 2022 versi 17.0.
Menyertakan header AMP apa pun akan menghasilkan kesalahan build. Tentukan _SILENCE_AMP_DEPRECATION_WARNINGS sebelum menyertakan header AMP apa pun untuk membungkam peringatan.
Menggunakan Akselerator Default
Runtime C++ AMP memilih akselerator default, kecuali Anda menulis kode untuk memilih yang tertentu. Runtime memilih akselerator default sebagai berikut:
Jika aplikasi berjalan dalam mode debug, akselerator yang mendukung penelusuran kesalahan.
Jika tidak, akselerator yang ditentukan oleh
CPPAMP_DEFAULT_ACCELERATORvariabel lingkungan, jika diatur.Jika tidak, perangkat yang tidak ditimulasi.
Jika tidak, perangkat yang memiliki jumlah memori terbesar yang tersedia.
Jika tidak, perangkat yang tidak terpasang ke layar.
Selain itu, runtime menentukan akselerator access_typeaccess_type_auto default. Ini berarti bahwa akselerator default menggunakan memori bersama jika didukung dan jika karakteristik performanya (bandwidth dan latensi) diketahui sama dengan memori khusus (non-bersama).
Anda dapat menentukan properti akselerator default dengan membuat akselerator default dan memeriksa propertinya. Contoh kode berikut mencetak jalur, jumlah memori akselerator, dukungan memori bersama, dukungan presisi ganda, dan dukungan presisi ganda terbatas dari akselerator default.
void default_properties() {
accelerator default_acc;
std::wcout << default_acc.device_path << "\n";
std::wcout << default_acc.dedicated_memory << "\n";
std::wcout << (accs[i].supports_cpu_shared_memory ?
"CPU shared memory: true" : "CPU shared memory: false") << "\n";
std::wcout << (accs[i].supports_double_precision ?
"double precision: true" : "double precision: false") << "\n";
std::wcout << (accs[i].supports_limited_double_precision ?
"limited double precision: true" : "limited double precision: false") << "\n";
}
Variabel Lingkungan CPPAMP_DEFAULT_ACCELERATOR
Anda dapat mengatur CPPAMP_DEFAULT_ACCELERATOR variabel lingkungan untuk menentukan accelerator::device_path akselerator default. Jalur ini bergantung pada perangkat keras. Kode berikut menggunakan accelerator::get_all fungsi untuk mengambil daftar akselerator yang tersedia lalu menampilkan jalur dan karakteristik setiap akselerator.
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_cpu_shared_memory ?
"CPU shared memory: true" : "CPU shared memory: false") << "\n";
std::wcout << (accs[i].supports_double_precision ?
"double precision: true" : "double precision: false") << "\n";
std::wcout << (accs[i].supports_limited_double_precision ?
"limited double precision: true" : "limited double precision: false") << "\n";
}
}
Memilih Akselerator
Untuk memilih akselerator, gunakan accelerator::get_all metode untuk mengambil daftar akselerator yang tersedia lalu pilih satu berdasarkan propertinya. Contoh ini menunjukkan cara memilih akselerator yang memiliki memori terbanyak:
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";
}
Catatan
Salah satu akselerator yang dikembalikan oleh accelerator::get_all adalah akselerator CPU. Anda tidak dapat menjalankan kode pada akselerator CPU. Untuk memfilter akselerator CPU, bandingkan nilai properti device_path dari akselerator yang dikembalikan oleh accelerator::get_all dengan nilai akselerator::cpu_accelerator. Untuk informasi selengkapnya, lihat bagian "Akselerator Khusus" di artikel ini.
Memori Bersama
Memori bersama adalah memori yang dapat diakses oleh CPU dan akselerator. Penggunaan memori bersama menghilangkan atau secara signifikan mengurangi overhead penyalinan data antara CPU dan akselerator. Meskipun memori dibagikan, memori tidak dapat diakses secara bersamaan oleh CPU dan akselerator, dan melakukannya menyebabkan perilaku yang tidak ditentukan. Properti akselerator supports_cpu_shared_memory mengembalikan true jika akselerator mendukung memori bersama, dan properti default_cpu_access_type mendapatkan access_type default untuk memori yang dialokasikan pada accelerator—misalnya, arrayyang terkait dengan accelerator, atau array_view objek yang diakses pada accelerator.
Runtime C++ AMP secara otomatis memilih default access_type terbaik untuk setiap accelerator, tetapi karakteristik performa (bandwidth dan latensi) memori bersama bisa lebih buruk daripada memori akselerator khusus (non-bersama) saat membaca dari CPU, menulis dari CPU, atau keduanya. Jika memori bersama berkinerja serta memori khusus untuk membaca dan menulis dari CPU, runtime default ke access_type_read_write; jika tidak, runtime memilih default access_typeyang lebih konservatif , dan memungkinkan aplikasi untuk mengambil alihnya jika pola akses memori kernel komputasinya mendapat manfaat dari yang berbeda access_type.
Contoh kode berikut menunjukkan cara menentukan apakah akselerator default mendukung memori bersama, lalu mengambil alih jenis akses defaultnya dan membuat accelerator_view darinya.
#include <amp.h>
#include <iostream>
using namespace Concurrency;
int main()
{
accelerator acc = accelerator(accelerator::default_accelerator);
// Early out if the default accelerator doesn't support shared memory.
if (!acc.supports_cpu_shared_memory)
{
std::cout << "The default accelerator does not support shared memory" << std::endl;
return 1;
}
// Override the default CPU access type.
acc.set_default_cpu_access_type(access_type_read_write);
// Create an accelerator_view from the default accelerator. The
// accelerator_view reflects the default_cpu_access_type of the
// accelerator it's associated with.
accelerator_view acc_v = acc.default_view;
}
accelerator_view Selalu mencerminkan default_cpu_access_type dari accelerator yang terkait dengannya, dan tidak menyediakan antarmuka untuk mengambil alih atau mengubahnya access_type.
Mengubah Akselerator Default
Anda dapat mengubah akselerator default dengan memanggil accelerator::set_default metode . Anda dapat mengubah akselerator default hanya sekali per eksekusi aplikasi dan Anda harus mengubahnya sebelum kode apa pun dijalankan pada GPU. Setiap panggilan fungsi berikutnya untuk mengubah pengembalian falseakselerator . Jika Anda ingin menggunakan akselerator yang berbeda dalam panggilan ke parallel_for_each, baca bagian "Menggunakan Beberapa Akselerator" di artikel ini. Contoh kode berikut mengatur akselerator default ke akselerator yang tidak ditimulasi, tidak tersambung ke tampilan, dan mendukung presisi ganda.
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;
}
Menggunakan Beberapa Akselerator
Ada dua cara untuk menggunakan beberapa akselerator di aplikasi Anda:
Anda dapat mengoper
accelerator_viewobjek ke pemanggilan metode parallel_for_each.Anda dapat membuat objek array menggunakan objek tertentu
accelerator_view. Runtime C++ AMP akan mengambil objekaccelerator_viewdari objek array yang ditangkap dalam ekspresi lambda.
Akselerator Khusus
Jalur perangkat dari tiga akselerator khusus tersedia sebagai properti kelas accelerator :
accelerator::direct3d_ref Data Member: Akselerator satu utas ini menggunakan perangkat lunak pada CPU untuk meniru kartu grafis generik. Ini digunakan secara default untuk penelusuran kesalahan, tetapi tidak berguna dalam produksi karena lebih lambat dari akselerator perangkat keras. Selain itu, hanya tersedia di DirectX SDK dan Windows SDK, dan tidak mungkin diinstal di komputer pelanggan Anda. Untuk informasi selengkapnya, lihat Men-debug Kode GPU.
accelerator::direct3d_warp Data Member: Akselerator ini menyediakan solusi cadangan untuk mengeksekusi kode C++ AMP pada CPU multi-core yang menggunakan Ekstensi SIMD Streaming (SSE).
accelerator::cpu_accelerator Data Member: Anda dapat menggunakan akselerator ini untuk menyiapkan array sementara. Ini tidak dapat menjalankan kode AMP C++. Untuk informasi selengkapnya, lihat Posting tentang Array Penahapan di C++ AMP di blog bernama Parallel Programming in Native Code.
Interoperabilitas
Runtime C++ AMP mendukung interoperabilitas antara accelerator_view kelas dan antarmuka Direct3D ID3D11Device. Metode create_accelerator_view mengambil IUnknown antarmuka dan mengembalikan accelerator_view objek. Metode get_device mengambil accelerator_view objek dan mengembalikan IUnknown antarmuka.
Lihat juga
C++ AMP (C++ Paralelisme Masif Dipercepat)
Mendebug Kode GPU
Kelas accelerator_view