paint-brush
Derleyici Optimizasyonları: Minimum Düzenlemelerle Kod Performansını Artırma! ile@durganshu
1,383 okumalar
1,383 okumalar

Derleyici Optimizasyonları: Minimum Düzenlemelerle Kod Performansını Artırma!

ile Durganshu Mishra13m2023/11/30
Read on Terminal Reader

Çok uzun; Okumak

C++ kodlarının performansını optimize etmek isteyen geliştiriciler, derleyici optimizasyonlarını keşfetmelidir: çok fazla çaba harcamadan kod performansını artıran çok etkili C++ bayrakları seti. Tek ön koşul ne yaptığınızı bilmenizdir. -fno-alias, -xHost, -xCORE-AVX512, IPO vb. gibi Intel C++ derleyicilerine uygun işaretleri, Jacobi yinelemeli C++ kodu üzerinde uygulamalı bir gösteriyle keşfedin.
featured image - Derleyici Optimizasyonları: Minimum Düzenlemelerle Kod Performansını Artırma!
Durganshu Mishra HackerNoon profile picture
0-item
1-item


C++ kodunuzdan en yüksek performansın kilidini açmak göz korkutucu olabilir, titiz profil oluşturma, karmaşık bellek erişimi ayarlamaları ve önbellek optimizasyonu gerektirebilir. Bunu biraz basitleştirecek bir hile var mı? Neyse ki, doğru içgörülere sahip olmanız ve ne yaptığınızı bilmeniz koşuluyla, minimum çabayla kayda değer performans kazanımları elde etmenin bir kısayolu var. Kodunuzun performansını önemli ölçüde artırabilecek derleyici optimizasyonlarına girin.


Modern derleyiciler, özellikle otomatik paralelleştirmede optimum performansa yönelik bu yolculukta vazgeçilmez müttefikler olarak hizmet eder. Bu gelişmiş araçlar, özellikle döngüler içindeki karmaşık kod modellerini inceleme ve optimizasyonları sorunsuz bir şekilde yürütme becerisine sahiptir.


Bu makale, popülerliği ve yaygın kullanımıyla tanınan Intel C++ derleyicilerine odaklanarak derleyici optimizasyonlarının potansiyeline ışık tutmayı amaçlamaktadır.


Bu hikayede, kodunuzu düşündüğünüzden daha az manuel müdahale gerektiren, yüksek performanslı bir şahesere dönüştürebilecek derleyici büyüsünün katmanlarını açığa çıkarıyoruz.


Önemli Noktalar: Derleyici optimizasyonları nelerdir? | -Açık | Mimari hedeflendi | Prosedürlerarası Optimizasyon | -fno-aliasing | Derleyici Optimizasyon raporları

Derleyici optimizasyonları nelerdir?

Derleyici optimizasyonları, bir derleyicinin derleme sırasında kaynak koduna uyguladığı çeşitli teknikleri ve dönüşümleri kapsar. Ama neden? Performansı, verimliliği ve bazı durumlarda ortaya çıkan makine kodunun boyutunu artırmak. Bu optimizasyonlar, hız, bellek kullanımı ve enerji tüketimi de dahil olmak üzere kod yürütmenin çeşitli yönlerini etkilemede çok önemlidir.


Herhangi bir derleyici, yüksek seviyeli kaynak kodunu düşük seviyeli makine koduna dönüştürmek için bir dizi adımı uygular. Bunlar sözcük analizi, sözdizimi analizi, anlamsal analiz, ara kod üretimi (veya IR), optimizasyon ve kod üretimini içerir.


Optimizasyon aşamasında derleyici, daha az kaynak kullanan veya daha hızlı yürütülen anlamsal olarak eşdeğer bir çıktıyı hedefleyerek bir programı dönüştürmenin yollarını titizlikle arar. Bu süreçte kullanılan teknikler , sabit katlama, döngü optimizasyonu, işlev satır içi oluşturma ve ölü kodun ortadan kaldırılmasını kapsar ancak bunlarla sınırlı değildir.


Mevcut tüm seçenekleri tartışmayacağım, ancak derleyiciye kod performansını artırabilecek belirli optimizasyonu yapması için nasıl talimat verebileceğimizi tartışmayacağım. Peki çözüm ???? Derleyici Bayrakları.

Geliştiriciler, derleme işlemi sırasında bir dizi derleyici bayrağı belirleyebilir; bu, hata ayıklama ve profil oluşturma bilgileri için GCC ile " -g" veya "-pg" gibi seçenekleri kullananların aşina olduğu bir uygulamadır. Devam ederken, uygulamamızı Intel C++ derleyicisiyle derlerken kullanabileceğimiz benzer derleyici bayraklarını tartışacağız. Bunlar kodunuzun verimliliğini ve performansını artırmanıza yardımcı olabilir.


CAF'tan GIF'e Başlayın



Peki neyle çalışıyoruz?

Kuru teoriye dalmayacağım ya da her derleyici işaretini listeleyen sıkıcı belgelerle sizi boğmayacağım. Bunun yerine bu bayrakların neden ve nasıl çalıştığını anlamaya çalışalım.


Bunu nasıl tamamlayacağız???


yinelemesinin hesaplanmasından sorumlu, optimize edilmemiş bir C++ işlevini ele alacağız ve adım adım her derleyici bayrağının etkisini ortaya çıkaracağız. Bu inceleme boyunca, optimizasyon işaretleri (-O0) olmadan başlayarak, her yinelemeyi temel sürümle sistematik olarak karşılaştırarak hızı ölçeceğiz.


Hızlanmalar (veya yürütme süresi) bir makinesinde ölçülmüştür. Burada Jacobi yöntemi, ısı dağılımını dikdörtgen bir ızgara üzerinde modellemek için 2 boyutlu bir kısmi diferansiyel denklemi (Poisson denklemi) çözer.


Jacobi Yöntemi


u(x,y,t), t zamanında (x,y) noktasındaki sıcaklıktır.


Dağıtım artık değişmediğinde kararlı durumu çözüyoruz:

Kararlı durumu çözme


Sınırda bir dizi Dirichlet sınır koşulu uygulanmıştır.


Temel olarak, Jacobi yinelemelerini değişken boyutlardaki ızgaralar üzerinde (çözünürlük adını verdiğimiz) gerçekleştiren bir C++ kodlamasına sahibiz. Temel olarak, 500'lük bir ızgara boyutu, 500x500 boyutunda bir matrisin çözülmesi anlamına gelir, vb.


Bir Jacobi yinelemesini gerçekleştirme işlevi aşağıdaki gibidir:


 /* * One Jacobi iteration step */ void jacobi(double *u, double *unew, unsigned sizex, unsigned sizey) { int i, j; for (j = 1; j < sizex - 1; j++) { for (i = 1; i < sizey - 1; i++) { unew[i * sizex + j] = 0.25 * (u[i * sizex + (j - 1)] + // left u[i * sizex + (j + 1)] + // right u[(i - 1) * sizex + j] + // top u[(i + 1) * sizex + j]); // bottom } } for (j = 1; j < sizex - 1; j++) { for (i = 1; i < sizey - 1; i++) { u[i * sizex + j] = unew[i * sizex + j]; } } }


Kalıntı bir eşik değerine ulaşana kadar (bir döngü içinde) Jacobi yinelemesini gerçekleştirmeye devam ederiz. Artık hesaplama ve eşik değerlendirmesi bu fonksiyonun dışında yapılır ve burada sorun teşkil etmez. O halde şimdi odadaki fil hakkında konuşalım!

Temel kod nasıl performans gösteriyor?

Hiçbir optimizasyon olmadan (-O0), aşağıdaki sonuçları elde ederiz:


Temel durum için saniye cinsinden çalışma süresi ve MFLOP/s (“-O0”)


Burada performansı MFLOP/s cinsinden ölçüyoruz. Karşılaştırmamızın temeli bu olacak.


MFLOP/s, “Saniyede Milyon Kayan Nokta İşlemi” anlamına gelir. Kayan nokta işlemleri açısından bir bilgisayarın veya işlemcinin performansını ölçmek için kullanılan bir ölçüm birimidir. Kayan nokta işlemleri, kayan nokta biçiminde temsil edilen ondalık veya gerçek sayılarla matematiksel hesaplamaları içerir.


MFLOP/s, özellikle karmaşık matematiksel hesaplamaların yaygın olduğu bilimsel ve mühendislik uygulamalarında sıklıkla bir kıyaslama veya performans ölçütü olarak kullanılır. MFLOP/s değeri ne kadar yüksek olursa sistem veya işlemci kayan nokta işlemlerini o kadar hızlı gerçekleştirir.


Not 1: Stabil bir sonuç sağlamak için çalıştırılabilir dosyayı her çözünürlük için 5 kez çalıştırıp MFLOP/s değerlerinin ortalamasını alıyorum.

Not 2: Intel C++ derleyicisindeki varsayılan optimizasyonun -O2 olduğunu unutmamak önemlidir. Bu nedenle kaynak kodunu derlerken -O0 değerini belirtmek önemlidir.


Hadi devam edelim ve farklı derleyici bayraklarını denedikçe bu çalışma sürelerinin nasıl değişeceğini görelim!

En yaygın olanları: -O1,-O2,-O3 ve -Ofast

Bunlar, derleyici optimizasyonlarına başladığınızda en sık kullanılan derleyici bayraklarından bazılarıdır. İdeal durumda Ofast > O3 > O2 > O1 > O0 performansı. Ancak bu mutlaka gerçekleşmez. Bu seçeneklerin kritik noktaları şunlardır:


-O1:

  • Hedef: Kod boyutunun artmasını önlerken hızı optimize etmek.
  • Temel Özellikler: Büyük kod boyutlarına sahip, çok sayıda dal içeren ve yürütme süresine döngüler içindeki kodun hakim olmadığı uygulamalar için uygundur.

-O2:

  • -O1 üzerindeki geliştirmeler:
    • Vektörleştirmeyi etkinleştirir.
    • İçsel bilgilerin satır içine alınmasına ve dosya içi prosedürler arası optimizasyona izin verir.

-O3:

  • -O2 üzerindeki geliştirmeler:
    • Daha agresif döngü dönüşümlerine olanak tanır (Fusion, Block-Unroll-and-Jam).
    • Optimizasyonlar yalnızca döngü ve bellek erişimi dönüşümleri meydana gelirse sürekli olarak -O2'den daha iyi performans gösterebilir. Hatta kodu yavaşlatabilir.
  • Tavsiye Edilenler:
    • Döngü ağırlıklı kayan nokta hesaplamaları ve büyük veri kümeleri içeren uygulamalar.

-Ofast:

  • Aşağıdaki bayrakları ayarlar:
    • “-O3”
    • “- no-prec-div” : Tam IEEE bölümüne göre daha hızlı ve biraz daha az hassas sonuçlar veren optimizasyonlara olanak tanır. Örneğin A/B, hesaplama hızını artırmak için A * (1/B) olarak hesaplanır.
    • -fp-model fast=2" : daha agresif kayan nokta optimizasyonlarına olanak tanır.


bu seçeneklerin tam olarak hangi optimizasyonları sunduğu hakkında ayrıntılı olarak konuşuyor.


Jacobi kodumuzda bu seçenekleri kullanırken şu yürütme çalışma sürelerini elde ederiz:

-On bayraklarının karşılaştırılması

Tüm bu optimizasyonların temel kodumuzdan (“-O0” ile) çok daha hızlı olduğu açıkça görülmektedir. Yürütme çalışma süresi temel duruma göre 2-3 kat daha düşüktür. MFLOP/lar ne olacak?


-On bayraklarının karşılaştırılması


Bu da bir şey!!!


Temel durumun MFLOP/s'leri ile optimizasyonlu olanlar arasında büyük bir fark vardır.


Genel olarak, çok az da olsa, “-O3” en iyi performansı gösteriyor.


-Ofast ” (“ -no-prec-div -fp-model fast=2 ”) tarafından kullanılan ekstra işaretler herhangi bir ek hızlanma sağlamamaktadır.

Hedeflenen mimari (-xHost,-xCORE-AVX512)

Makinenin mimarisi, derleyici optimizasyonlarını etkileyen önemli bir faktör olarak öne çıkıyor. Derleyicinin mevcut komut setlerini ve donanım tarafından desteklenen optimizasyonları (vektörizasyon ve SIMD gibi) bilmesi performansı önemli ölçüde artırabilir.


Örneğin Skylake makinemde 3 SIMD birimi var: 1 AVX 512 ve 2 AVX-2 birimi.


Bu bilgiyle gerçekten bir şeyler yapabilir miyim???


Cevap stratejik derleyici bayraklarında yatıyor. " -xHost " ve daha kesin olarak " -xCORE-AVX512 " gibi seçeneklerle denemeler yapmak, makinenin yeteneklerinin tüm potansiyelini kullanmamıza ve optimum performans için optimizasyonları uyarlamamıza olanak sağlayabilir.


İşte bu bayrakların neyle ilgili olduğuna dair kısa bir açıklama:


-xHost:

  • Hedef: Derleyicinin, ana makinenin en yüksek talimat seti için optimize edilmiş kod üretmesi gerektiğini belirtir.
  • Temel Özellikler: Donanımda bulunan en yeni özelliklerden ve yeteneklerden yararlanır. Hedef sistemde inanılmaz bir hızlanma sağlayabilir.
  • Dikkat Edilmesi Gerekenler: Bu işaret, ana bilgisayar mimarisi için optimizasyon sağlarken, farklı talimat seti mimarilerine sahip farklı makineler arasında taşınabilir olmayan ikili dosyalara neden olabilir.

-xCORE-AVX512:

  • Hedef: Derleyiciye Intel Gelişmiş Vektör Uzantıları 512 (AVX-512) talimat setini kullanan kod oluşturmasını açıkça söyleyin.

  • Temel Özellikler: AVX-512, AVX2 gibi önceki sürümlere kıyasla daha geniş vektör kayıtları ve ek işlemler sunan gelişmiş bir SIMD (Tek Komut, Çoklu Veri) komut setidir. Bu bayrağın etkinleştirilmesi, derleyicinin optimize edilmiş performans için bu gelişmiş özelliklerden yararlanmasına olanak tanır.

  • Hususlar: Taşınabilirlik yine burada suçludur. AVX-512 talimatlarıyla oluşturulan ikili dosyalar, bu talimat setini desteklemeyen işlemcilerde en iyi şekilde çalışmayabilir. Hiç çalışmayabilirler!


AVX-512 set talimatları, 512 bit genişliğindeki kayıtlardan oluşan Zmm kayıtlarını kullanır. Bu kayıtlar vektör işlemenin temelini oluşturur.


Varsayılan olarak “ -xCORE-AVX512 ”, programın zmm kayıtlarının kullanımından büyük olasılıkla faydalanmayacağını varsayar. Derleyici, performans artışı garanti edilmediği sürece zmm kayıtlarını kullanmaktan kaçınır.


Zmm kayıtlarını kısıtlama olmadan kullanmayı planlıyorsanız " " yüksek olarak ayarlanabilir. Biz de bunu yapacağız.


Ayrıntılı talimatlar için göz atmayı unutmayın.


Bu bayrakların kodumuz için nasıl çalıştığını görelim:

-xHost ve -xCORE-AVX512'nin etkileri

Vay be!


Artık en küçük çözünürlük için 1200 MFLOP/s sınırını geçiyoruz. Diğer çözünürlükler için MFLOP/s değerleri de arttı.


Dikkate değer kısım, bu sonuçları herhangi bir önemli manuel müdahale olmadan, yalnızca uygulama derleme süreci sırasında bir avuç derleyici bayrağını dahil ederek elde etmiş olmamızdır.


Ancak derlenmiş yürütülebilir dosyanın yalnızca aynı talimat setini kullanan bir makineyle uyumlu olacağını vurgulamak önemlidir.


Belirli bir talimat seti için optimize edilmiş kod, farklı donanım konfigürasyonları arasında taşınabilirlikten ödün verebileceğinden, optimizasyon ve taşınabilirlik arasındaki denge açıktır. Bu yüzden ne yaptığınızı bildiğinizden emin olun!!


Not: Donanımınız AVX-512'yi desteklemiyorsa endişelenmeyin. Intel C++ Derleyicisi AVX, AVX-2 ve hatta SSE için optimizasyonları destekler. bilmeniz gereken her şey var!

Prosedürler Arası Optimizasyon (IPO)

Prosedürler Arası Optimizasyon, bireysel işlevlerin kapsamının ötesine bakarak kodu birden fazla işlev veya prosedürde analiz etmeyi ve dönüştürmeyi içerir.


Halka arz, bir program içindeki farklı işlevler veya prosedürler arasındaki etkileşimlere odaklanan çok adımlı bir süreçtir. IPO, Yönlendirme ikamesi, Dolaylı çağrı dönüşümü ve Satır içi dahil olmak üzere birçok farklı türde optimizasyon içerebilir.


Intel Derleyici iki yaygın IPO türünü destekler: Tek dosyalı derleme ve çok dosyalı derleme (Tüm Program Optimizasyonu) [ ]. Her birini gerçekleştiren iki ortak derleyici bayrağı vardır:


-ipo:

  • Hedef: Derleyicinin derleme sırasında bireysel kaynak dosyaların ötesinde tüm programı analiz etmesine ve optimize etmesine olanak tanıyarak prosedürler arası optimizasyona olanak tanır.

  • Temel Özellikler: - Tüm Program Optimizasyonu: " -ipo ", tüm program boyunca işlevler ve prosedürler arasındaki etkileşimleri dikkate alarak tüm kaynak dosyalar genelinde analiz ve optimizasyon gerçekleştirir. - İşlevler arası ve modüller arası optimizasyon: Bayrak, satır içi işlevleri ve senkronizasyonu kolaylaştırır farklı program bölümlerinde optimizasyonlar ve veri akışı analizi.

  • Hususlar: Ayrı bir bağlantı adımı gerektirir. “ -ipo ” ile derledikten sonra, son yürütülebilir dosyayı oluşturmak için belirli bir bağlantı adımına ihtiyaç vardır. Derleyici, bağlantı sırasında tüm program görünümünü temel alarak ek optimizasyonlar gerçekleştirir.


-ip:

  • Hedef: Derleyicinin ayrı bir bağlantı adımı gerektirmeden prosedürler arası bazı optimizasyonları gerçekleştirmesine olanak tanıyarak prosedürler arası analiz yayılımını etkinleştirir.

  • Temel Özellikler: - Analiz ve yayılım: " -ip ", derleyicinin derleme sırasında farklı işlevler ve modüller arasında araştırma ve veri yayılımı gerçekleştirmesini sağlar. Ancak tam program görünümünü gerektiren tüm optimizasyonları gerçekleştirmez. - Daha hızlı derleme: “ -ipo ”dan farklı olarak “ -ip ” ayrı bir bağlantı adımı gerektirmez, bu da derleme sürelerinin daha hızlı olmasını sağlar. Hızlı geri bildirimin gerekli olduğu geliştirme sırasında bu yararlı olabilir.

  • Dikkat Edilmesi Gerekenler: İşlev satır içi dahil olmak üzere yalnızca bazı sınırlı prosedürler arası optimizasyonlar gerçekleşir.


-ipo, ayrı bir bağlantı adımı içerdiğinden ancak daha uzun derleme sürelerine mal olduğundan genellikle daha kapsamlı prosedürler arası optimizasyon yetenekleri sağlar. [ ] -ip, ayrı bir bağlantı adımı gerektirmeden bazı prosedürler arası optimizasyonları gerçekleştiren, geliştirme ve test aşamalarına uygun hale getiren daha hızlı bir alternatiftir.[ ]


Yalnızca performanstan ve farklı optimizasyonlardan, derleme sürelerinden veya çalıştırılabilir dosyanın boyutundan bahsettiğimiz için bizi ilgilendirmiyor, " -ipo " konusuna odaklanacağız.

-ipo'nun etkisi

-fno-alias

Yukarıdaki optimizasyonların tümü, donanımınızı ne kadar iyi bildiğinize ve ne kadar deneyeceğinize bağlıdır. Ama hepsi bu değil. Derleyicinin kodumuzu nasıl göreceğini belirlemeye çalışırsak diğer potansiyel optimizasyonları da belirleyebiliriz.


Kodumuza tekrar bakalım:


 /* * One Jacobi iteration step */ void jacobi(double *u, double *unew, unsigned sizex, unsigned sizey) { int i, j; for (j = 1; j < sizex - 1; j++) { for (i = 1; i < sizey - 1; i++) { unew[i * sizex + j] = 0.25 * (u[i * sizex + (j - 1)] + // left u[i * sizex + (j + 1)] + // right u[(i - 1) * sizex + j] + // top u[(i + 1) * sizex + j]); // bottom } } for (j = 1; j < sizex - 1; j++) { for (i = 1; i < sizey - 1; i++) { u[i * sizex + j] = unew[i * sizex + j]; } } }


jacobi() işlevi, parametre olarak ikiye katlamak için birkaç işaretçi alır ve ardından iç içe geçmiş for döngüleri içinde bir şeyler yapar. Herhangi bir derleyici kaynak dosyada bu işlevi gördüğünde çok dikkatli olmalıdır.


Neden??


U kullanarak yeniyi hesaplama ifadesi, 4 komşu u değerinin ortalamasını içerir. Peki ya siz ve Unew aynı konumu işaret ediyorsa? Bu, takma ad verilmiş işaretçilerin klasik sorunu haline gelecektir [ ].


Modern derleyiciler çok akıllıdır ve güvenliği sağlamak için takma adın mümkün olabileceğini varsayarlar. Ve bunun gibi senaryolarda, kodun anlamını ve çıktısını etkileyebilecek her türlü optimizasyondan kaçınırlar.


Bizim durumumuzda, u ve unew'in farklı hafıza konumları olduğunu ve farklı değerleri depolaması gerektiğini biliyoruz. Böylece derleyiciye burada herhangi bir takma ad olmayacağını kolayca bildirebiliriz.


Bunu nasıl yaparız?


İki yöntem var. Birincisi C “ ” anahtar sözcüğüdür . Ancak kodun değiştirilmesini gerektirir. Şimdilik bunu istemiyoruz.


Basit bir şey var mı? “ -fno-alias ”ı deneyelim.


-fno-takma ad:

  • Hedef: Derleyiciye programda takma ad kullanmamasını söyleyin.

  • Temel Özellikler: Takma ad olmadığı varsayıldığında, derleyici kodu daha serbestçe optimize edebilir, bu da potansiyel olarak performansı artırabilir.

  • Dikkat Edilmesi Gerekenler: Geliştiricinin bu bayrağı kullanırken dikkatli olması gerekir; çünkü herhangi bir yersiz takma ad kullanılması durumunda program beklenmedik çıktılar verebilir.


Daha fazla ayrıntıyı bulabilirsiniz.


Bu, kodumuz için nasıl performans gösteriyor?

-fno-alias'ın etkisi

Artık elimizde bir şey var!!!


Burada önceki optimizasyonların neredeyse 3 katı kadar kayda değer bir hızlanma elde ettik. Bu artışın ardındaki sır nedir?


Derleyiciye takma ad kullanmama talimatını vererek, ona güçlü döngü optimizasyonlarını serbest bırakma özgürlüğünü verdik.


Montaj kodunun (burada paylaşılmasa da) ve oluşturulan derleme optimizasyon raporunun ( aşağıya bakın) daha yakından incelenmesi, derleyicinin ve konusundaki ustaca uygulamasını ortaya çıkarır. Bu dönüşümler, derleyici direktiflerinin kod verimliliği üzerindeki önemli etkisini ortaya koyarak yüksek derecede optimize edilmiş performansa katkıda bulunur.

Nihai grafikler

Tüm optimizasyonların birbirlerine karşı performansı şu şekildedir:


Tüm optimizasyon bayraklarının karşılaştırılması

Derleyici Optimizasyon raporu (-qopt-report)

Intel C++ derleyicisi, kullanıcıların optimizasyon amacıyla yapılan tüm ayarlamaları özetleyen bir optimizasyon raporu oluşturmasına olanak tanıyan değerli bir özellik sağlar [ ]. Bu kapsamlı rapor, derleyicinin kod içinde uyguladığı optimizasyonların ayrıntılı bir listesini sunan YAML dosya formatında kaydedilir. Ayrıntılı bir açıklama için “ ” hakkındaki resmi belgelere bakın.

Sırada ne var?

Aslında çok fazla bir şey yapmamıza gerek kalmadan kodumuzun performansını büyük ölçüde artırabilecek bir avuç derleyici bayrağını tartıştık. Tek ön koşul: Hiçbir şeyi körü körüne yapmayın; ne yaptığınızı bildiğinizden emin olun!!


Bu tür yüzlerce derleyici bayrağı var ve bu hikaye bir avuçtan bahsediyor. Bu nedenle, tercih ettiğiniz derleyicinin resmi derleyici kılavuzuna (özellikle optimizasyonla ilgili belgelere) bakmanız faydalı olacaktır.


Bu derleyici bayraklarının yanı sıra, kodunuzun performansını inanılmaz derecede artırabilecek Vektörleştirme, SIMD içselleri, ve gibi bir sürü teknik vardır.


Benzer şekilde Intel C++ derleyicileri (ve tüm popüler olanlar) pragma direktiflerini de destekler ki bunlar çok güzel özelliklerdir. ivdep, paralel, simd, vektör vb. gibi bazı pragmaları kontrol etmeye değer.


Giphy'dekilerin hepsi bu kadar

Önerilen okumalar

[1] [2] [3] [4] [5] [6] [7] [8]


Öne Çıkan Fotoğrafı.


da yayınlandı.


바카라사이트 바카라사이트 온라인바카라