SYCL - SYCL

SYCL
SYCL logosu
Orijinal yazar (lar)Khronos Grubu
Geliştirici (ler)Khronos Grubu
İlk sürümMart 2014 (2014-03)
Kararlı sürüm
1.2.1 revizyon 7/27 Nisan 2020; 7 ay önce (2020-04-27)
İşletim sistemiÇapraz platform
PlatformÇapraz platform
TürÜst düzey programlama dili
İnternet sitesiwww.khronos.org/ sycl/ sikl.tech

SYCL daha yüksek seviyeli bir programlama modelidir OpenCL tek kaynaklı, etki alanına özel gömülü bir dil olarak (DSEL ) saf göre C ++ 11 programlama verimliliğini artırmak için SYCL 1.2.1 için. Bu, tarafından geliştirilen bir standarttır Khronos Grubu Mart 2014'te duyuruldu.

Amaç

SYCL ('orak' olarak telaffuz edilir), telifsiz, platformlar arası bir soyutlama katmanıdır. OpenCL bu, heterojen işlemciler için kodun tamamen standart kullanılarak "tek kaynak" tarzında yazılmasını sağlar C ++. SYCL, tek kaynak geliştirmeye olanak sağlar C ++ şablonu işlevler, kullanan karmaşık algoritmalar oluşturmak için hem ana bilgisayar hem de cihaz kodu içerebilir OpenCL hızlandırma ve ardından bunları kaynak kodlarında farklı veri türlerinde yeniden kullanma.

Başlangıçta kullanım için geliştirilmiş olsa da OpenCL ve SPIR aslında diğer sistemleri hedefleyebilen daha genel bir heterojen çerçevedir. Örneğin, hipSYCL uygulama hedefleri CUDA. SYCL standardı, üst düzey programlama modeli alt grubu olarak başlarken OpenCL çalışma grubu, bu bir Khronos Grubu bağımsız çalışma grubu OpenCL 20 Eylül 2019'dan beri çalışma grubu.

Versiyonlar

En son sürüm 27 Nisan 2020'de yayınlanan SYCL 1.2.1 revizyon 7'dir (ilk sürüm 6 Aralık 2017'de yayınlandı[1]).

Bir SYCL 2020 Geçici Şartname revizyonu 1 30 Haziran 2020'de yayınlandı[2]son sürümü tanımlamadan önce kullanıcılardan ve uygulayıcılardan bazı geri bildirimler almak için.

SYCL, Mart 2014'te GDC'de geçici sürüm 1.2 ile tanıtıldı,[3] daha sonra SYCL 1.2 son sürümü şu tarihte tanıtıldı: IWOCL 2015, Mayıs 2015.[4]

SYCL 2.2 provizyonu, IWOCL 2016 Mayıs 2016[5] hedefleme C ++ 14 ve OpenCL 2.2. Ancak SYCL komitesi bu sürümü sonlandırmamayı tercih etti ve yapay zeka motorları dahil olmak üzere mevcut hızlandırıcıların artan çeşitliliğini ele almak için daha esnek bir SYCL spesifikasyonu üzerinde çalışıyor.

Genel versiyon:

  • SYCL 1.2.1 hedefleme OpenCL 1.2 donanım özellikleri OpenCL 1.2 birlikte çalışabilirlik modu.

Misal

Aşağıdaki örnek, tek kaynaklı saf C ++ varsayılan bir hızlandırıcıda çalışan 3 çekirdeğin örtük bir görev grafiğini tanımlayan programlama modeli.

#Dahil etmek <CL/sycl.hpp>#Dahil etmek <iostream>// Çekirdekleri hesaplamak için ad vermek için bazı türleri bildirinsınıf init_a;sınıf init_b;sınıf matrix_add;kullanma ad alanı cl::sikl;// Matrislerin boyutuConstexpr size_t N = 2000;Constexpr size_t M = 3000;int ana() {  // Varsayılan cihazda çalışmak için bir kuyruk oluşturun  kuyruk q;  // Matrislerimiz için N × M kayan değerlere sahip bazı 2D tamponlar oluşturun  tampon<çift, 2> a{{N, M}};  tampon<çift, 2> b{{N, M}};  tampon<çift, 2> c{{N, M}};  // "a" arabelleğini başlatmak için önce eşzamansız bir çekirdek başlatın  q.Sunmak([&](işleyici &cgh) {    // Çekirdek "a" yazar, bu yüzden ona bir yazma erişimcisi alın    Oto Bir = a.erişim Al<Giriş::mod::yazmak>(cgh);    // Paralel çekirdeği N × M 2D yineleme alanında kuyruğa al    cgh.parallel_for<init_a>(Aralık<2>{N, M}, [=](eşya<1> indeks) {      Bir[indeks] = indeks[0] * 2 + indeks[1];    });  });  // "b" arabelleğini başlatmak için eşzamansız bir çekirdek başlatın  q.Sunmak([&](işleyici &cgh) {    // Çekirdek "b" ye yazar, bu yüzden üzerine bir yazma erişimcisi alın    Oto B = b.erişim Al<Giriş::mod::yazmak>(cgh);    // N × M 2D yineleme alanında paralel bir çekirdeği kuyruğa alın    cgh.parallel_for<init_b>(Aralık<2>{N, M}, [=](eşya<1> indeks) {      B[indeks] = indeks[0] * 2014 + indeks[1] * 42;    });  });  // Matris toplamasını hesaplamak için eşzamansız bir çekirdek başlatın c = a + b  q.Sunmak([&](işleyici &cgh) {    // Çekirdekte "a" ve "b" okunur, ancak "c" yazılır.    // Çekirdek "a" ve "b" okuduğundan, çalışma zamanı örtük olarak    // onları üreten önceki çekirdeklere üretici-tüketici bağımlılığı.    Oto Bir = a.erişim Al<Giriş::mod::okumak>(cgh);    Oto B = b.erişim Al<Giriş::mod::okumak>(cgh);    Oto C = c.erişim Al<Giriş::mod::yazmak>(cgh);    // N × M 2D yineleme alanında paralel bir çekirdeği kuyruğa alın    cgh.parallel_for<matrix_add>(        Aralık<2>{N, M}, [=](eşya<1> indeks) { C[indeks] = Bir[indeks] + B[indeks]; });  });  / * Ana bilgisayar tarafından "c" yi okumak için bir erişim isteyin. SYCL çalışma zamanı     önce ana bilgisayar tarafında "c" nin hazır olmasını bekleyecek     erişimciyi iade etmek.     Bu, aşağıdaki iç içe döngüde hiçbir iletişim olmadığı anlamına gelir.   */  Oto C = c.erişim Al<Giriş::mod::okumak>();  std::cout << " nSonuç: n";  için (size_t ben = 0; ben < N; ben++)    için (size_t j = 0; j < M; j++)      // Sonucu analitik değerle karşılaştırın      Eğer (C[ben][j] != ben * (2 + 2014) + j * (1 + 42)) {        std::cout << "Yanlış değer " << C[ben][j]                  << "öğede" << ben << ' ' << j << ' n';        çıkış(EXIT_FAILURE);      }  std::cout << "İyi hesaplama! n";}

Öğreticiler

ComputeCpp SYCL kılavuzlarında birkaç öğretici vardır.[6]

Diğer API'lerle karşılaştırma

Açık standartlar SYCL ve OpenCL satıcıya benzer CUDA itibaren Nvidia.

İçinde Khronos Grubu Diyar, OpenCL düşük seviyeli tek kaynak olmayan API ve SYCL, üst düzey tek kaynak C ++ alana özgü gömülü dil.

Karşılaştırıldığında, tek kaynak C ++ alana özgü gömülü dil versiyonu CUDA, aslında "CUDA Çalışma süresi API ", bir şekilde SYCL'ye benziyor. Ama aslında daha az bilinen bir tek kaynaklı olmayan versiyonu CUDA buna "CUDA Sürücü API ", benzer OpenCL ve örneğin CUDA Çalışma süresi API uygulamanın kendisi.

SYCL, C ++ AMP programcıyı, ana bilgisayar ve cihazlar arasında verileri açıkça aktarmaktan kurtaran özellikler CUDA (Birleşik Belleğin tanıtılmasından önce CUDA 6).

SYCL şundan daha yüksek düzeydedir: C ++ AMP ve CUDA çünkü tüm çekirdekler arasında açık bir bağımlılık grafiği oluşturmanıza gerek yoktur ve çekirdeklerin iletişim ve hesaplama örtüşmesi ile otomatik olarak eşzamansız zamanlamasını sağlar. Bu, herhangi bir derleyici desteğine ihtiyaç duymadan, erişimci kavramı kullanılarak yapılır.

Aksine C ++ AMP ve CUDA SYCL saf C ++ DSEL hiç olmadan C ++ uzantısı, belirli bir derleyici olmadan saf çalışma zamanına dayanan bazı temel CPU uygulamalarına izin verir. Bu, uygulama hatalarını ayıklamak veya henüz mimari ve derleyici mevcut olmadan yeni bir mimari için prototip oluşturmak için çok kullanışlıdır.

HipSYCL uygulaması, SYCL üst düzey programlamayı ekler CUDA ve KALÇA.

SYCL'nin birçok benzerliği vardır. Kokkos programlama modeli[7]opak çok boyutlu dizi nesnelerinin (SYCL arabellekleri ve Kokkos dizileri) kullanımı, paralel yürütme için çok boyutlu aralıklar ve azaltmalar (SYCL 2020'de eklendi) dahil. Kokkos topluluğundan gelen geri bildirimlere yanıt olarak SYCL 2020'ye çok sayıda özellik eklendi.

Ayrıca bakınız

Referanslar

  1. ^ Khronos Group (6 Aralık 2017). "Khronos Group, Tamamlanmış SYCL 1.2.1'i Yayınladı". Khronos. Alındı 12 Aralık 2017.
  2. ^ Khronos Group (30 Haziran 2020). "Khronos, SYCL 2020 Geçici Spesifikasyonunun Yayınlanmasıyla SYCL'nin Yaygın Dağıtımına Doğru Adımlar Attı". Khronos. Alındı 4 Aralık 2020.
  3. ^ Khronos Group (19 Mart 2014). "Khronos, SYCL 1.2 Geçici Spesifikasyonunu Yayınladı". Khronos. Alındı 20 Ağustos 2017.
  4. ^ Khronos Group (11 Mayıs 2015). "Khronos, SYCL 1.2 Nihai Spesifikasyonunu Yayınladı". Khronos. Alındı 20 Ağustos 2017.
  5. ^ Khronos Group (18 Nisan 2016). "Khronos OpenCL 2.2 Geçici Spesifikasyonunu OpenCL C ++ Kernel Language ile Yayınladı". Khronos. Alındı 18 Eylül 2017.
  6. ^ "SYCL ile GPGPU programlamaya giriş". Codeplay. Alındı 3 Ekim 2017.
  7. ^ Hammond, Jeff R .; Kinsner, Michael; Brodman, James (2019). "Kokkos ve SYCL'nin C ++ uygulamaları için heterojen, paralel programlama modelleri olarak karşılaştırmalı analizi". Uluslararası OpenCL Çalıştayı Bildirileri: 1–2. doi:10.1145/3318170.3318193.

Dış bağlantılar