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 kodunuzun çalıştırılacağını cihaz veya öykünücü 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.
Not
C++ AMP üst bilgileri Visual Studio 2022 sürüm 17.0'dan itibaren kullanım dışı bırakılmıştır.
Tüm AMP üst bilgileri dahil olmak derleme hataları oluşturur. Uyarıları susturmak için AMP üst bilgilerini eklemeden önce tanımlayın _SILENCE_AMP_DEPRECATION_WARNINGS .
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, öykünmemiş 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 yolu, hızlandırıcı belleği miktarını, paylaşılan bellek desteğini, çift duyarlıklı desteği ve varsayılan hızlandırıcının sınırlı çift duyarlıklı 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";
}
Not
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, tarafından döndürülen hızlandırıcının accelerator::get_all özelliğinin değerini hızlandırıcı::cpu_accelerator değeriyle karşılaştırın. Daha fazla bilgi için bu makaledeki "Özel Hızlandırıcılar" bölümüne bakın.
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 ve default_cpu_access_typetrue
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;
}
her accelerator_view zaman ilişkili olduğu default_cpu_access_type öğesini yansıtır accelerator ve geçersiz kılmak veya değiştirmek için arabirim sağlamazaccess_type.
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 sonraki tüm işlev çağrıları döndürür false. ç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:
nesneleri parallel_for_each
accelerator_viewçağrılara geçirebilirsiniz.Belirli bir nesneyi kullanarak bir
accelerator_viewnesnesi oluşturabilirsiniz. C++ AMP çalışma zamanı, lambda ifadesindeki yakalananaccelerator_viewnesnesinden nesnesini 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::d irect3d_ref Veri Üyesi: Bu tek iş parçacıklı hızlandırıcı, genel bir grafik kartına öykünmek için CPU üzerindeki 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::d irect3d_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 geri dönüş çö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 ID3D11Device 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 bkz.
C++ AMP (C++ Hızlandırılmış Yüksek Paralellik)
GPU Kodunda Hata Ayıklama
accelerator_view Sınıfı