2012-02-29 32 views
5

İki büyük işlevin olduğunu varsayalım. Bunları ayrı bir çekirdek halinde yazmak ve sırayla mı çağırmak daha iyi mi yoksa sadece bir çekirdek yazmak daha mı iyidir? (Verileri okumak istemiyorum ve arasında ana makine ve aygıt arasında zorlamak istemiyorum). Çekirdeği birçok kez çağırmak istersem hız ne olacak? Bu GeneldeBirden çok çekirdek veya Tek çekirdek yazma

+0

Burada bir benzer görünüm var: stackoverflow.com/questions/9208535/how-to-handle-a-variable-number-of-algorithms-in-a-kernel – rdoubleui

cevap

11

bir şey donanım kullanımı ve performansı üzerindeki kayıt basıncının etkisidir.

Genel bir kural olarak, büyük çekirdekleri büyük sicil ayak izleri var. Tipik OpenCL aygıtları (yani GPU'lar) sonlu kayıt dosya boyutlarına sahiptir ve büyük çekirdekler daha düşük eşzamanlılık (daha az eş zamanlı çözgü/dalga cephesi), gecikme saklaması için daha az fırsat ve daha düşük genel performansla sonuçlanabilir. Öte yandan, kernel başlatma ek yükleri çoğu platformda oldukça düşüktür, bu nedenle algoritmanızın yürütmenin "fazları" arasında muazzam miktarda devlet yoksa, birden fazla çekirdek kullanmanın cezası oldukça düşük olabilir. Birden çekirdekleri kullanarak

da başka yan yararı vardır - ücretsiz tüm çalışma birimleri arasındaki örtülü senkronizasyon olsun. Çoğu zaman, kod performansı üzerinde olumsuz bir etkisi olabilecek atomik bellek işlemlerine ve senkronizasyon temellerine olan ihtiyacı ortadan kaldırabilir.

nihai kılavuz

performansı ölçülmelidir. Bu tür şeyler için evrensel bir kural yoktur. Kıyaslama, kesin olarak bilmenin tek yoludur. OpenCL'de kodlamak

+0

Apple katılıyorum: https: // geliştirici. apple.com/library/mac/documentation/Performance/Conceptual/OpenCL_MacProgGuide/TuningPerformanceOntheGPU/TuningPerformanceOntheGPU.html –

3

kodunuzun okunabilirliği sayfalardan (belki) biraz daha iyi bir performans sorudur. Aynı bağlamda kaldığınız sürece arabellek kopyalamak sorun olmaz. Örneğin. Bir çekirdeğin bir çıktı arabelleğini, herhangi bir kopyalama içermeyen bir sonraki çekirdeğin giriş arabelleği olarak ayarlayabilirsiniz. dikkate almak

3

uygun yolu paralel görevler içine kodunu ayırmak için, ve her biri bir çekirdek olduğunu. Bu, her "döngü için" bir çekirdek olmalıdır. Bazı zamanlarda tek bir CPU kod fonksiyonu OCL'de 4 çekirdek uygulamasına neden olabilir. Eğer çekirdek yürütmeler arasında veri depolamak gerekiyorsa

sadece (-> HOST darboğaz bu CİHAZI < çözer) OpenCL tamponlarını kullanmak ve barındırmak için kopyalamayın. Her iki fonksiyonlar farklı verilere hareket ederse

propably tek çekirdek yazabilirim, ama bu işlemin hem kaçak karmaşıklığına bağlıdır.

İlgili konular