Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
C++ AMP kodunuzu çalıştıracak cihazı veya öykünücüyü belirtmek için hızlandırıcıyı ve accelerator_view sınıflarını kullanabilirsiniz. Bir sistemde bellek miktarı, paylaşılan bellek desteği, hata ayıklama desteği veya çift duyarlık desteğine göre farklılık gösteren çeşitli cihazlar veya öykünücüler olabilir. C++ Hızlandırılmış Büyük Paralellik (C++ AMP), kullanılabilir hızlandırıcıları incelemek, varsayılan olarak birini ayarlamak, parallel_for_each birden çok çağrı için birden çok accelerator_views belirtmek ve özel hata ayıklama görevleri gerçekleştirmek için kullanabileceğiniz API'ler sağlar.
Uyarı
C++ AMP üst bilgileri Visual Studio 2022 sürüm 17.0'dan itibaren kullanım dışı bırakılmıştır.
AMP üst bilgilerini dahil etmek derleme hatalarına neden olur. AMP üst bilgilerini eklemeden önce uyarıları susturmak için _SILENCE_AMP_DEPRECATION_WARNINGS tanımla.
Varsayılan Hızlandırıcıyı Kullanma
Belirli bir tane seçmek için kod yazmadığınız sürece C++ AMP çalışma zamanı varsayılan bir hızlandırıcı seçer. Çalışma zamanı aşağıdaki gibi varsayılan hızlandırıcıyı seçer:
Uygulama hata ayıklama modunda çalışıyorsa, hata ayıklamayı destekleyen bir hızlandırıcı.
Aksi takdirde, ortam değişkeni tarafından
CPPAMP_DEFAULT_ACCELERATORbelirtilen hızlandırıcı (ayarlanmışsa).Aksi takdirde, emüle edilmemiş bir cihaz.
Aksi takdirde, kullanılabilir bellek miktarı en yüksek olan cihazdır.
Aksi takdirde, ekrana bağlı olmayan bir cihaz.
Ayrıca, çalışma zamanı varsayılan hızlandırıcı için bir access_typeaccess_type_auto öğesini belirtir. Bu, varsayılan hızlandırıcının destekleniyorsa ve performans özelliklerinin (bant genişliği ve gecikme süresi) ayrılmış (paylaşılmayan) bellekle aynı olduğu biliniyorsa paylaşılan belleği kullandığı anlamına gelir.
Varsayılan hızlandırıcıyı yapılandırarak ve özelliklerini inceleyerek varsayılan hızlandırıcının özelliklerini belirleyebilirsiniz. Aşağıdaki kod örneği, varsayılan hızlandırıcının yolunu, hızlandırıcı belleği miktarını, paylaşılan bellek desteğini, çift hassasiyet desteğini ve sınırlı çift hassasiyet desteğini yazdırır.
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";
}
CPPAMP_DEFAULT_ACCELERATOR Ortam Değişkeni
Ortam değişkenini CPPAMP_DEFAULT_ACCELERATOR varsayılan hızlandırıcının değerini accelerator::device_path belirtecek şekilde ayarlayabilirsiniz. Yol donanıma bağlıdır. Aşağıdaki kod, kullanılabilir hızlandırıcıların listesini almak için işlevini kullanır accelerator::get_all ve ardından her hızlandırıcının yolunu ve özelliklerini görüntüler.
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";
}
}
Hızlandırıcı Seçme
Hızlandırıcı seçmek için yöntemini kullanarak accelerator::get_all kullanılabilir hızlandırıcıların listesini alın ve ardından özelliklerine göre birini seçin. Bu örnek, en fazla belleğe sahip hızlandırıcının nasıl seçildiğini gösterir:
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";
}
Uyarı
tarafından accelerator::get_all döndürülen hızlandırıcılardan biri CPU hızlandırıcısıdır. CPU hızlandırıcısı üzerinde kod yürütemezsiniz. CPU hızlandırıcısını filtrelemek için,
Paylaşılan Bellek
Paylaşılan bellek, hem CPU hem de hızlandırıcı tarafından erişilebilen bellektir. Paylaşılan belleğin kullanılması, CPU ile hızlandırıcı arasında veri kopyalama yükünü ortadan kaldırır veya önemli ölçüde azaltır. Bellek paylaşılsa da hem CPU hem de hızlandırıcı tarafından eşzamanlı olarak erişilemez ve bunun yapılması tanımsız davranışa neden olur. hızlandırıcı özelliği supports_cpu_shared_memory, hızlandırıcı paylaşılan belleği destekliyorsa true döndürür. Ayrıca, default_cpu_access_type özelliği, üzerinde tahsis edilen bellek için varsayılan access_type'ı alır; örneğin, accelerator ile ilişkili diziler veya accelerator üzerinde erişilen array_view nesneler.
C++ AMP çalışma zamanı her access_typeiçin en iyi varsayılanı accelerator otomatik olarak seçer, ancak paylaşılan belleğin performans özellikleri (bant genişliği ve gecikme süresi), CPU'dan okurken, CPU'dan yazarken veya her ikisinden de okurken ayrılmış (paylaşılmayan) hızlandırıcı belleğinden daha kötü olabilir. Paylaşılan bellek CPU'dan okuma ve yazma için ayrılmış belleğin yanı sıra performans gösterirse, çalışma zamanı varsayılan olarak ; olarak ayarlanır access_type_read_write, aksi takdirde çalışma zamanı daha muhafazakar bir varsayılan access_typeseçer ve hesaplama çekirdeklerinin bellek erişim desenleri farklı access_typebir değerden yararlanıyorsa uygulamanın bunu geçersiz kılmasına izin verir.
Aşağıdaki kod örneğinde, varsayılan hızlandırıcının paylaşılan belleği destekleyip desteklemediğini belirleme ve ardından varsayılan erişim türünü geçersiz kılma ve bu bellekten bir accelerator_view oluşturma işlemleri gösterilmektedir.
#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;
}
Bir accelerator_view, her zaman ilişkili olduğu accelerator öğesinin default_cpu_access_type'ini yansıtır ve access_type'ünü geçersiz kılmak veya değiştirmek için herhangi bir arabirim sağlamaz.
Varsayılan Hızlandırıcıyı Değiştirme
yöntemini çağırarak varsayılan hızlandırıcıyı accelerator::set_default değiştirebilirsiniz. Varsayılan hızlandırıcıyı uygulama yürütme başına yalnızca bir kez değiştirebilirsiniz ve GPU'da herhangi bir kod yürütülmeden önce bunu değiştirmeniz gerekir. Hızlandırıcıyı değiştirmek için yapılan sonraki işlev çağrıları false döndürür. çağrısında parallel_for_eachfarklı bir hızlandırıcı kullanmak istiyorsanız, bu makaledeki "Birden Çok Hızlandırıcı Kullanma" bölümünü okuyun. Aşağıdaki kod örneği, varsayılan hızlandırıcıyı öykünmeyen, ekrana bağlı olmayan ve çift duyarlık destekleyen bir hızlandırıcıya ayarlar.
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;
}
Birden Çok Hızlandırıcı Kullanma
Uygulamanızda birden çok hızlandırıcı kullanmanın iki yolu vardır:
accelerator_viewyöntemine çağrılara nesneleri geçirebilirsiniz.Belirli bir nesneyi kullanarak
accelerator_viewnesnesi oluşturabilirsiniz. C++ AMP çalışma zamanı, lambda ifadesinde yakalanan dizi nesnesindenaccelerator_viewnesnesini alır.
Özel Hızlandırıcılar
Üç özel hızlandırıcının cihaz yolları sınıfın accelerator özellikleri olarak kullanılabilir:
accelerator::direct3d_ref Veri Üyesi: Bu tek iş parçacıklı hızlandırıcı, genel bir grafik kartına öykünmek için CPU'daki yazılımı kullanır. Hata ayıklama için varsayılan olarak kullanılır, ancak donanım hızlandırıcılarından daha yavaş olduğundan üretimde kullanışlı değildir. Ayrıca, yalnızca DirectX SDK ve Windows SDK'sında kullanılabilir ve müşterilerinizin bilgisayarlarına yüklenme olasılığı düşüktür. Daha fazla bilgi için bkz. GPU Kodunda Hata Ayıklama.
accelerator::direct3d_warp Veri Üyesi: Bu hızlandırıcı, Akış SIMD Uzantıları (SSE) kullanan çok çekirdekli CPU'larda C++ AMP kodunu yürütmek için bir yedek çözüm sağlar.
accelerator::cpu_accelerator Veri Üyesi: Hazırlama dizilerini ayarlamak için bu hızlandırıcıyı kullanabilirsiniz. C++ AMP kodunu yürütemez. Daha fazla bilgi için Yerel Kodda Paralel Programlama blogunda C++ AMP'de Hazırlama Dizileri gönderisine bakın.
Birlikte çalışabilirlik
C++ AMP çalışma zamanı, sınıf ile Direct3D accelerator_view arasında birlikte çalışabilirliği destekler.
create_accelerator_view yöntemi bir IUnknown arabirim alır ve bir accelerator_view nesne döndürür.
get_device yöntemi bir accelerator_view nesnesi alır ve bir IUnknown arabirim döndürür.
Ayrıca bakınız
C++ AMP (C++ Hızlandırılmış Yüksek Paralellik)
GPU Kodunda Hata Ayıklama
accelerator_view Sınıfı