C ++ programlarının performansını artırmak için SIMD teknolojisini kullanma

Yazar: Zhang Yinkui, IA-32 mimarisi, işletim sistemi çekirdeği, sanallaştırma teknolojisi, özellikle yazılımda hata ayıklama daha derinlemesine çalışma üzerinde on yıldan fazla bir süredir yazılım geliştirme ve araştırma yapan "yazılım hata ayıklama" ve "Georgia böcekleri derleme" yazarı. Weibo Kimliği: @dbgger

Bu makale "Programcı" "Programcı" a abone olun

Değerinizi nasıl artıracağınız konusunda bugün C ++ meslektaşlarınızla konuşun. Bir programlama dili sadece bir araçtır, aracı en uygun yerde kullanmak, güçlü yönlerini kullanmak ve zayıflıklarından kaçınmak ve değerli yazılım ürünleri yaratmak istiyorsanız, o zaman bu aracı kullanan insanlar doğal olarak daha değerlidir.

C ++ dilinin avantajları

C ++ dilinin avantajları nelerdir? Tabii ki çok var, yoksa erken ölürler. Ancak genel olarak "çok" demek mantıklı değil. Tam olarak ne var? Farklı insanların farklı cevapları olabilir. Aynı kişi farklı zamanlarda farklı yanıt verebilir. Burada C ++ 'ın babası Bay Bjarne Stroustrup'un söylediklerini de dinleyebiliriz. Kısa bir süre önce düzenlenen "2016 C ++ ve Sistem Yazılım Teknolojileri Konferansı" nda Bjarne "C ++ nedir ve ne olacak" başlıklı bir açılış konuşması yaptı. C ++ 'nın ne olduğunu derinlemesine açıkladı ve C ++ dilinin temel özelliklerini ve avantajlarını açıkladı. Bir konuşma sayfasının başlığı, son rötuş olan "iki satırda C ++ 'dır (C ++' yı iki satırda tanımlamak için). Bu iki satır nedir? İlk satır "Donanıma doğrudan eşleme" ve ikinci satır "Sıfır genel gider soyutlaması" dır. Kabaca bir çeviri, "donanıma doğrudan eşleme" ve "sıfır yük soyutlaması" dır.

"Donanıma doğrudan eşleme", C ++ dili ile donanım arasındaki doğrudan yazışmayı ifade eder. C ++ ifadeleri doğrudan CPU komutlarına karşılık gelebilir ve C ++ veri türleri de doğrudan CPU tarafından desteklenen veri türlerine karşılık gelebilir. Başka bir deyişle, C ++ dil kodu ve verileri, böyle bir dönüşüme gerek kalmadan doğrudan CPU tarafından desteklenen talimatlara ve verilere çevrilebilir. Kısacası çok verimlidir.

Verimlilik açısından, elbette, en doğrudan dil assembly'dır, ancak assembly dili ile ilgili sorun, üst düzey soyutlama olmaması ve kodun organize edilmesinin zor olmasıdır. Yani Bay Bjarne'ın ikinci satırı "0 yük soyutlaması". Sanırım bu satır iki anlam içeriyor: İlk katman C ++ 'nın soyut olduğu ve ikinci katman soyutlamayı destekleme yükünün 0 olduğu anlamına geliyor. Günümüzün büyük ölçekli yazılım üretimi çağında, nispeten küçük yazılım projeleri için bile, soyutlamayı kullanmak gerekir. Günümüzde neredeyse tüm popüler programlama dilleri, ister Java, ister C # veya F # olsun, soyutlamayı desteklemektedir. Hepsi soyutlamayı desteklese de, bazı diller soyutlama için yüksek bir bedel öder, çok fazla kaynak tüketir ve yavaş çalışır, yani yüksek ek yük. Ve C ++ 0 yük soyutlaması, 0 ekstra yüktür. Bay Bjarne, Java'nın popülaritesini de bilmeli ve C ++ ile Java'nın doğru ve yanlışı hakkındaki tartışmaları duymuş olmalı. C ++ 'nın sıfır ek yüke sahip olduğunu söylemek biraz abartılıdır, ancak yüksek ek yüke sahip diğer dillerle karşılaştırıldığında sıfıra eşdeğerdir. Bunu söylemezseniz, soyutlama yükünün diğer dillere göre çok daha az olduğunu söylemek pek de abartılı olmaz mı? İlk nesil ustalar bunu söylediğinde, kısa ve özdüler ve hiç kimse böyle olmadığını söylemeye cesaret edemezdi.

Şekil 1 C ++ 'ın babası Bay Bjarne, C ++' nın temel avantajlarını tanıtıyor

Bu iki jargon basit ve güçlüdür. Biri yüksek verimlilik, diğeri küçük yüktür.Birlikte, C ++ 'nın temel avantajlarını ortaya çıkarırlar: son derece keskin ve birinci sınıf performans.

Dindar bir yürekle, Bay Bjarne'nin yukarıdaki iki jargonla ilgili tartışmasını dinlerken, bu tarihi anı cep telefonumla fotoğrafladım. Konum, Sheraton Shanghai Pudong Waigaoqiao Hotel'dir ve saat 28 Ekim 2016'da 10: 12'dir.

Ustanın sözleri tekrar etmeye değer ve her C ++ programcısı aklında tutmalıdır. Tasarım yaparken, tasarımımızın basit olup olmadığını ve donanımın performansına tam anlamıyla etki edip edemeyeceğini kontrol etmek için bu iki cümleyi kullanmalıyız. Kodu yazarken ve kontrol ederken, bu iki cümleyi daha fazla düşünmeli, karmaşık mantığı düzeltmeli, gereksiz kodları silmeli, her kod satırını tekrar tekrar optimize etmeli ve donanımın performansını en üst düzeye çıkarmalıyız. Aksi takdirde, C ++ diline nasıl layık olabilirsiniz, Bay Bjarne'a nasıl layık olabilirsiniz?

Şekil 2 C ++ 'ın babası Bay Bjarne'ın C ++ 17'ye eklemeyi umduğu dil özellikleri

Bazı insanlar donanımın çok güçlü olduğunu ve kod yazarken performans sorunlarına çok fazla dikkat etmeniz gerekmediğini söylüyor. Bu gerçekten osuruk ve her sorumlu C ++ programcısı ayağa kalkıp bu tür açıklamaları kınamalı.

Bay Bjarne, C ++ın gelecekteki gelişimini tanıttığında, C ++ 17ye en çok eklemeyi umduğu dil özelliklerinden bahsetti. Bu on maddelik listede, sekizinci madde SIMD vektörleri ve paralelleştirilmiş algoritmalardır. Sadece hazırladığım konuya denk geldi.

SIMD, Single Instruction'ın kısaltmasıdır, Multiple Data - tek talimat çoklu veri anlamına gelir. Intel'de çalışırken bu teknolojiyi duymuştum.Yıllar önce olayı hatırlayamıyordum, ama yine de gözlerimin önündeki ışığı sanki bir güneş ışığı görmüş gibi hatırlıyorum ve bu yaklaşımın ne kadar harika olduğuna hayran kaldım. SIMD düşüncesinin en büyük özelliği ve cazibesi basit ve doğaldır - insanlar dünyayı takip eder, dünya gökyüzünü, gökyüzü Tao'yu ve Tao doğayı takip eder. Neden öyle diyorsun? SIMD düşüncesinin uygulama örnekleri hayatımızın her yerinde görülebildiği için, ortaya çıkış çağı ilkel topluma kadar uzanabilir.

Ekmek yemeyi seviyorum, bu yüzden fırını örnek alalım. Bir atölyenin 1.000 ekmek yapacağını ve her ekmeğin şekillendirilmesi, fırına alınması, pişirilmesi ve çıkarılması gerektiğini varsayalım. Bir seferde yalnızca bir somun çalıştırırsanız, temel işlemlerin çoğu 1.000 kez tekrarlanmalıdır. Ancak, Şekil 3'te gösterildiği gibi üzerinde dört "kutu (bu isimle adlandıralım)" olan basit bir kalıp kullanırsanız, aynı anda dört ekmek çalıştırabilirsiniz. Bu şekilde birçok işlem, bir seferde dört, fırına yerleştirildiğinde bir seferde dört ve çıkarıldığında bir seferde dört olmak üzere gruplar halinde oluşturulur, bu nedenle birçok işlemin tekrar sayısı 1.000'den düşer. 250'de, üretim verimliliği büyük ölçüde geliştirildi.

Şekil 3 SIMD fikri hayattan gelir

Hayata girdiğimde aslında pek çok benzer örnek var. Çocukken kerpiç yapmak için sarı kilin kullanıldığı iş sahnesini görmüştüm. Boş kalıp denen ahşap bir çerçevenin üzerinde birden fazla ızgara var ve her ızgara bir kerpiç parçasına karşılık geliyor. Fabrikaya bakarsanız daha fazlası var. Birçok süreç SIMD fikirlerini ve seri üretimi kullanıyor. Emek bilgeliğe ilham verir ve yazılım meslektaşları gerçek toplumdan öğrenmelidir.

SIMD uzun yıllardır bilgisayar alanında kullanılmaktadır.Şu anda, ünlü ILLIAC IV ana bilgisayarının, modern bilgisayarlarda SIMD'nin ilk gerçekleştirilmesi olduğuna inanılıyor. ILLIAC IV, Amerika Birleşik Devletleri'ndeki Illinois Üniversitesi tarafından tasarlanmış ve Burroughs tarafından inşa edilmiştir. Proje 1965'te başlamış ve altı yılda 40 milyon ABD doları tutarında tamamlanmıştır. Ulusal Havacılık ve Uzay Dairesi'nde (NASA) kurulmuş ve 1981 yılına kadar uzun yıllar hizmet vermiştir. Kapatın ve emekli olun.

ILLIAC IV kılavuzundaki Şekil 4, yalnızca ILLIAC IV'ün temel bileşenlerini açıklamakla kalmaz, aynı zamanda çalışma prensibini de açıklar. Resimdeki PE, Processor Element'in yani işlemci biriminin kısaltmasıdır ve işlevi ve isimlendirmesi bugün dediğimiz Execution Unit (EU) (GPU'daki temel yürütme birimi) ile çok benzerdir. PEM, hesaplanacak verileri ve hesaplama sonuçlarını saklamak için kullanılan İşleme Birimi Belleği, işlem birimi belleğidir.

Şekil 4 ILLIAC IV çalışma prensibi

ILLIAC IV, 64 PE'ye (işlemci birimi) sahiptir ve aynı anda 64 hesaplama yapabilir. Gösterilen şekil, B dizisini ve C dizisini eklemek ve sonucu, bir seferde 64 öğeyi tamamlayan A dizisine koymaktır.

ILLIAC IV el kitabında, bazı ilginç örnekler de görebilirsiniz.Örneğin, Şekil 5'teki karikatür, ILLIAC IV'ün verileri toplu olarak işleme yeteneğini canlı bir şekilde tasvir etmektedir.Personel, büyük bir dosya yığını koymak için büyük bir çatal kullandı. ILLIAC IV'ün koca ağzına oy vermek. ILLIAC IV'ün sayısız hesaplama birimi sıraya dizilmiş ve "beslenmeyi" bekliyor.

IA CPU'da SIMD uygulaması

SIMD fikrini ve ilk uygulamayı tanıttım. Sonra, önce SIMD'nin Intel mimarisine (kısaca IA) uygulanmasını gözden geçirip sonra örnekler vereceğim.

Çoğu kişi SIMD'nin ne olduğunu bilmiyor ama MMX'i biliyor. MMX, Multimedya uzantısı anlamına gelen MultiMedia eXtensions'ın kısaltmasıdır. 1997'de piyasaya sürülen P5 mimarisine dayanan Pentium işlemci, MMX teknolojisini içeren ilk IA CPU'dur. Donanım açısından MMX teknolojisi, 8 tek baytlık tamsayı veya 4 kelime veya 2 çift kelime üzerinde çeşitli birleşik işlemler gerçekleştirebilen MM0-MM7 adı verilen 864-bit yazmaç içerir. MMX, kayan nokta sayılarını değil, yalnızca tam sayı türlerini destekler.

1999 yılında Pentium II işlemciyle birlikte sunulan SSE (Streaming SIMD Extensions) teknolojisi, MMX'in kayan nokta sayıları için destek eksikliğini telafi etti ve kayıt genişliğini 128 bit'e genişletmek ve artık x87'yi çoğaltmamak dahil olmak üzere MMX'te birçok iyileştirme yaptı. Kaydolun ve 70 yeni talimat tanıtın.

2008'de duyurulan AVX (Gelişmiş Vektör Uzantıları), yazmaç genişliğini 256 bite daha da genişletti ve üçlü operatörleri desteklemek için komut formatını yeniledi. 2011'de piyasaya sürülen Sandy Bridge işlemcisi, AVX teknolojisini içerir.

Şekil 5 ILLIAC IV'ün güçlü paralel işleme yeteneklerini gösteren bir karikatür

Şekil 6 IA CPU'da SIMD uygulaması

"Tianhe-2", Ulusal Savunma Teknolojisi Üniversitesi tarafından geliştirilmiş, saniyede 549 milyon kez en yüksek hesaplama hızına ve saniyede 339 milyon kez sürekli bir hesaplama hızına sahip bir süper bilgisayar sistemidir. 17 Kasım 2014'te açıklanan en büyük 500 küresel süper bilgisayar listesinde "Tianhe No. 2" birinci sırada yer aldı. Tianhe-2, on binlerce bilgi işlem düğümünden oluşan devasa bir sistemdir.Her düğümün iki Xeon işlemci ve üç Xeon Phi birlikte işlem yapan hesaplama kartı içerdiği söylenir. Xeon Phi, güçlü paralel hesaplama yeteneklerine sahiptir ve temel teknolojisi AVX-512 adı verilen SIMD teknolojisidir. AVX-512, AVX'in başka bir genişlemesidir. Yazmaç genişliği 512 bite genişletilir ve sayı 16'dan 32'ye iki katına çıkarılır.

Şimdiye kadar, X86 mimarisi CPU'larında SIMD'nin fikrini, tarihçesini ve uygulamasını tanıttık.Ardından, SIMD teknolojisinin belirli bir görüntü işleme örneği aracılığıyla C ++ projelerine nasıl uygulanacağını tanıtacağız, farklı zorluklarla çeşitli çözümleri tartışacağız ve Elde edilen performans gelişimi nasıl ölçülür?

C ++ programında SIMD teknolojisini kullanın

Şekil 7, SIMD teknolojisini kullanmanın çeşitli yöntemlerini listeler, önce her birini yukarıdan aşağıya sırayla kısaca tanıtıyoruz ve ardından montaj dili yöntemine odaklanıyoruz.

Şekil 7 SIMD teknolojisini kullanmanın çeşitli yöntemleri

İlk yöntem ünlü IPP kitaplığını kullanmaktır. IPP'nin tam adı Intel Entegre Performans İlkelleri'dir. Intel tarafından geliştirilen bir dizi çapraz platform yazılım işlevi kitaplığıdır. Yaygın olarak kullanılan çeşitli grafikler, resimler, ses ve video dahil olmak üzere çok çeşitli işlevler sağlar. İşleme işlevi. SIMD teknolojisi kullanılarak birçok işlev optimize edildiğinden, bu kitaplığı kullanmak SIMD teknolojisini kullanmanın hızlı bir yoludur. Daha fazla bilgi için https://software.intel.com/en-us/intel-ipp/ bağlantısını kullanarak IPP'nin resmi tanıtımını ziyaret edebilirsiniz.

İkinci yöntem, derleyicinin otomatik vektörleştirme desteğini kullanmaktır. Örneğin, Şekil 8, Visual Studio'daki (C ++) proje özellikleri iletişim kutusu aracılığıyla otomatik vektörleştirmeyi etkinleştirmenin bir ekran görüntüsüdür.

Şekil 8 Visual Studio'da otomatik vektörleştirme desteğini etkinleştirin

Yazarın analizinden sonra, bazı SIMD talimatları, etkinleştirdikten sonra derlenen programda gerçekten kullanılır.Örneğin, Şekil 9'un sağ tarafında mavi ile vurgulanan satır, SSE2'deki cvtsi2sd komutunu kullanır ve bu, kaynak işlenendeki işareti dönüştürebilir Çift kelimeli tamsayı, hedef işlenende çift duyarlıklı kayan nokta değerine dönüştürülür.

Şekil 9 Derleyicinin otomatik vektörleştirmesi tarafından oluşturulan SIMD talimatlarını gözlemleyin

GCC derleyicisini kullanıyorsanız, aşağıdaki gibi bir komut satırı kullanarak derleyebilirsiniz:

Derleyici tarafından gerçekleştirilen vektörleştirme eylemlerini görmek istiyorsanız, -ftree-vectorizer-verbose = 1 ekleyebilir, böylece çıktı bilgileri Şekil 10'a benzer olabilir.

Şekil 10 GCC kullanarak otomatik vektörleştirme desteği

GDB'nin demontaj işlevini kullanarak, Şekil 11'de gösterildiği gibi GCC tarafından oluşturulan SIMD talimatlarını kolayca gözlemleyebilirsiniz.

Şekil 11 GCC'nin otomatik vektörleştirme işlevi tarafından oluşturulan montaj talimatları

Üçüncü yöntem, derleyici direktifini kullanmaktır. Örneğin, aşağıdaki kodu derlemek için Intelin C / C ++ Derleyicisini (ICC) kullanırsanız, ICC for döngüsünü #pragma simd göstergesi altında vektörleştirecektir. , Ve aşağıdakine benzer çıktı bilgileri verin: açıklama: SIMD DÖNGÜSÜ VEKTÖRLEŞTİRİLDİ.

Dördüncü yöntem, Cilk teknolojisini kullanmaktır. Cilk kelimesi, İpek kelimesinin benzer telaffuzundan türetilmiştir, bu da paralel programlamanın ipek kadar güzel yapılması gerektiğini ima eder. Cilk teknolojisi ilk olarak MIT tarafından geliştirilmiş ve ilk versiyonu 1994 yılında piyasaya sürülmüştür. Daha sonra, geliştiriciler Cilk Arts adlı bir şirket kurdu ve geliştirilmiş bir özel sürüm başlattı. 2009'da Intel, Cilk Arts'ı satın aldı ve Cilk teknolojisini Intel derleyicisine entegre etti. 2012'den sonra Çilk, GCC'de desteklenen açık kaynak kodlu bir proje haline geldi (sürüm 4.8 veya üstü gerektirir). İlgilenen arkadaşlar daha fazla bilgi edinebilir ve ilgili araçları ve örnek kodları https://www.cilkplus.org adresinden indirebilir.

Beşinci yöntem, derleyicinin yerleşik işlevini kullanmaktır (intrinsic), örneğin aşağıdaki döngü, ayrıntılı olarak tartışacağımız görüntü ikilileştirme programının C ++ kodundan gelir.

Yeniden yazmak için Visual C ++ derleyicisinin SIMD özünü kullanırsanız, yeni kod Liste 1'de gösterilir.

Liste 1 İçsel olarak SIMD teknolojisini kullanma

Altıncı yöntem, derleme işlevlerini yazmak için doğrudan derleme dilini kullanmak ve daha sonra daha sonra ayrıntılı olarak açıklanacak olan C ++ kodundan derleme işlevlerini çağırmaktır.

Şekil 7'deki altı yöntemi karşılaştırdığımızda, esneklik ve kontrol edilebilirlik yukarıdan aşağıya gittikçe yükseliyor, ancak bunları kullanmanın zorluğu da giderek büyüyor.

SIMD montajı için yazma ve hata ayıklama işlevleri

C ++ projelerinde derleme kodunu kullanmanın iki yolu vardır: Biri, __asm {} gibi göstergeler aracılığıyla derleme kodunu C ++ işlevlerine gömmek, diğeri ise derleme kodunu ayrı bir uca .asm ile yerleştirmektir. Dosya. Eski yöntem, 64-bit'i desteklemediği için temelde geçersizdir.

İkinci yöntemi kullanırken, önce montaj dosyasını projenin Çözüm Gezgini ağaç denetimine eklemek istediğiniz projeye sağ tıklayın, ardından Şekil 6'da gösterilen iletişim kutusunu çağırmak için Bağımlılıklar Oluştur Özelleştirmeler Oluştur'u seçin ve ardından masm satırını seçin.

Montaj kodunun nasıl yazılacağını ayrıntılı olarak tartışmak, bu makalenin kapsamı dışındadır. Burada yalnızca bir göz atabilirim ve yukarıda tartışılan for döngüsüne (Liste 1'in en üstünde) karşılık gelen bir montaj talimatı bölümü ("Modern x86 Assembly Language Programming" den alıntı) sunabilirim, örneğin Liste 2'de gösterilmektedir.

Liste 2 Gri tonlamalı görüntülerin ikilileştirilmesi için SSE2 derleyicisinin bir parçası

Montaj kodunu uzun süredir yazmamış olan meslektaşlar için Liste 2'deki kodu, özellikle de SIMD talimatlarını anlamak zor olabilir. Aşağıdakiler, yazarın hata ayıklayıcıdaki SIMD'deki olağan hata ayıklama yöntemini anlamanıza yardımcı olacaktır.

Liste 2'deki ilk talimat satırına bir kesme noktası ayarlayın (C ++ kodunda bir kesme noktası ayarlamakla aynı), programı bu montaj işlevini çağırması için tetikleyin ve kesme noktası isabetlerinden sonra bu talimatın üzerinden geçin.

Basitçe ifade etmek gerekirse, bu talimat, edx tarafından işaret edilen ITD yapısının Eşik alanını EAX yazmacına atamak içindir.

Montaj penceresini açın, derlenen talimatlar:

Bu, yapıdaki Eşik alanı ofsetinin 0xC olduğu anlamına gelir. Ctrl + Alt + A, Visual Studio'nun komut penceresini açar ve bellek ve kayıtların değerlerini gözlemler, bu da şunları kanıtlayabilir:

Görünüşe göre bu komutun işlevi, ikili eşiği EAX yazmacına yüklemek.

Bir sonraki talimat, geleneksel EAX yazmacında depolanan eşiği SSE'nin SSE yazmacı XMM1'ine aktaran nispeten basittir. Visual Studio'nun kayıt penceresi varsayılan olarak SIMD kayıtlarını göstermez, ancak bu sorunu kısayol menüsünden kolayca çözebilirsiniz.Şekil 12'de gösterilen kısayol menüsünü açmak için sağ tıklayın ve SSE'yi seçin.

Şekil 12 Yapılandırma, SSE kaydını gösterir

SSE'yi seçtikten sonra, tek adım uygulayın ve ardından kayıt penceresini gözlemleyin, XMM1 değerinin aşağıdaki gibi olduğunu görebilirsiniz:

Sonraki iki talimat, XMM1'in en düşük baytında bulunan eşiği (0x98) diğer baytlara karıştırmaktır.

İki komuttaki p, paketlenmiş anlamına gelir, SIMD'de ortak bir terim olan kombinasyon sayısı ve pshufb, ikinci işlenen tarafından belirtilen kontrol maskesine göre birinci işlenen üzerinde bir karma işlemi gerçekleştiren Paket Karıştırılmış Baytların kısaltmasıdır. Bir kombinasyon numarası üretmek için. Açıklamak biraz kafa karıştırıcı. Bu iki talimatı tek adımda uyguladıktan sonra, etkiye baktıktan sonra etkisini görebilirsiniz:

İlginç. Sonraki talimat (movdqa xmm2, xmmword ptr) PixelScale sabit dizisindeki ölçekleme değerini XMM2'ye atamaktır.

Yürütmeden sonra, XMM2'nin değeri:

Bir sonraki talimat, en SIMD karakteristik işlemi olan birleşik çıkarma yapmaktır.

Tek bir adımın ilk iki kaydının değerleri şunlardır:

Tek bir adımdan sonra:

Yani, 16 tamsayı çıkarma aynı anda gerçekleştirilir.

Çalışmayı hazırladıktan sonra, bir sonraki adım ESI, movdqa xmm0 tarafından gösterilen görüntü verilerini işlemektir, her seferinde 16 bayt XMM0, psubb xmm0, xmm2 eksi yakınlaştırma değeri (128) içine yüklenebilir ve ardından aşağıdakileri kullanın Pcmpgtb komutu karşılaştırma için kullanılır.

Pcmpgtb'nin tam adı, karşılaştırma sonucuna göre hedef baytı tüm 0'lar veya tüm 1'ler (daha büyük) olarak yazacak olan, Paket işaretli bayt tam sayılarını şundan büyük olarak karşılaştır'tır. Örneğin, tek adımdan önce XMM0 ve XMM1 ise:

Sonra tek bir adımdan sonra:

Daha sonra movdqa, xmm0 komutu sonucu EDI tarafından gösterilen hedef tampona yazar. Ardından hem ESI hem de EDI'yi 16 artırın ve sonraki döngüye geçin.

Şekil 13, karşılaştırma için test programı arayüzüdür Liste kontrolü, aynı görüntü üzerinde farklı şekillerde ikili hale getirme işlemi gerçekleştirilerek ölçülen zamanı içerir.

Şekil 13 Farklı hesaplama yöntemleri için test prosedürlerinin karşılaştırılması

Şekil 13'ten görülebileceği gibi, sıradan C ++ koduyla (şekilde ALU ile belirtilmiştir) karşılaştırıldığında, SSE yöntemini kullanmanın hız artışı, orijinal 1000 milisaniyeden 10/20 milisaniyenin üzerine çıktığı çok açıktır. SIMD'nin cazibesi. Burada duralım. İlgilenen arkadaşlar örnek programın tüm kaynak kodunu ( kaynak bölümü) kendileri için deneyimlemek üzere indirebilirler.

2017 programcılarına (iOS, Android ve basılı sürümler dahil) abone olmak için lütfen adresini ziyaret edin.

Voleybol Süper Ligine Odaklanın | Evde BAIC Erkekler Voleybol Rotasyonu, Zhejiang takımını 3-1 yenerek arka arkaya sekiz galibiyete imza attı
önceki
SDCC 2017 · Şangay İstasyonu şok oldu ve ilk grup konuşmacılar ve konular açık (erken rezervasyon biletleri% 50'den az indirimli)
Sonraki
İdealist bir mimar olan Steven Hall, büyük Çin projelerinde baharı buluyor
Gri beton banyo aksesuarları hiç soğuk değil | Bu tasarım harika
2019 CES gösterisi: Mercedes-Benz'in yeni CLA sınıfı resmi olarak yayınlandı
AC Milan Samp'i deplasmanda 2-0 yendi, Cutrone uzatmada iki gol attı
2018'in üçüncü çeyreğinde yayınlanan geniş bant ve 4G ortalama indirme oranı: China Telecom / Unicom lider
CES 2019: Baidu resmi olarak Apollo 3.5'i piyasaya sürdü
Uçuş rötarları ve yüksek hızda kapanmalar ... Bugün Qingdao sis yüzünden "kapandı" ve bilmeniz gereken başka şeyler var
Suning double 11 cep telefonu kredisi takası: önce para verin, sonra eski telefonu geri dönüştürün
2019 CES Fuarı: Hongqi Markası "Flagland" Akıllı Kabin Konsepti
İlk yarı-Chelsea 1-1 Newcastle, Sabre gol attı, William tek kaybetti
"Başkan Yardımcısı" nın son sezonu başlıyor ve HBO, Meyer için bir dizi hatıra pulu bastırdı.
298 yuan Lenovo Air kablosuz Bluetooth müzik kulaklığı piyasaya sürüldü:% 100 ses kalitesi restorasyonu
To Top