Intel, SSE4.2 komut setinde belirli bir CRC32
instruction ürününe sahiptir. CRC32 hesaplamalarını hızlandırmak için bu talimatı nasıl kullanabilirim? Tüm Intel'in CRC32
öğretimCRC32, Intel'e özgü talimatlardan nasıl yararlanılır?
8
A
cevap
7
İlk yapabilirsiniz gcc
kullanarak CRC32C için Intel'in donanım hızlandırma kullanmak için
(. bu farklı bir polinomu düzenli CRC32 Wikipedia CRC32 girişi bak kullanır) CRC-32C
hesaplamak için hizmet eder:
- Inline derleme dil
- Kullanım intrinsics
_mm_crc32_u8
,_mm_crc32_u16
,_mm_crc32_u32
veya_mm_crc32_u64
. Intel'inicc
derleyicisinin açıklamaları için Intel Intrinsics Guide'a bakın ancakgcc
da bunları uygular.
asm
özetinden C kodunda
Bu bunu bir seferde 8 bayt sürdüğü ileri performans artışı verecekti __mm_crc32_u64
kullanarak, her seferinde bir bayt alır __mm_crc32_u8
ile bunu yapacağını nasıl.
uint32_t sse42_crc32(const uint8_t *bytes, size_t len)
{
uint32_t hash = 0;
size_t i = 0;
for (i=0;i<len;i++) {
hash = _mm_crc32_u8(hash, bytes[i]);
}
return hash;
}
Eğer
CFLAGS
yılında
-msse4.2
geçmesi gerekiyor bu derlemek için.
gcc -g -msse4.2 test.c
gibi, aksi takdirde
undefined reference to _mm_crc32_u8
hakkında şikayette bulunacaktır.
Düz bir C uygulamasına geri dönmek istiyorsanız, yürütülebilir dosyanın çalıştığı platformda mevcut değilse, GCC'nin ifunc
özniteliğini kullanabilirsiniz.
uint32_t sse42_crc32(const uint8_t *bytes, size_t len)
{
/* use _mm_crc32_u* here */
}
uint32_t default_crc32(const uint8_t *bytes, size_t len)
{
/* pure C implementation */
}
/* this will be called at load time to decide which function really use */
/* sse42_crc32 if SSE 4.2 is supported */
/* default_crc32 if not */
static void * resolve_crc32(void) {
__builtin_cpu_init();
if (__builtin_cpu_supports("sse4.2")) return sse42_crc32;
return default_crc32;
}
/* crc32() implementation will be resolved at load time to either */
/* sse42_crc32() or default_crc32() */
uint32_t crc32(const uint8_t *bytes, size_t len) __attribute__ ((ifunc ("resolve_crc32")));
1
gibi CRC-32C hızlı donanım ve yazılım uygulamaları için this answer bakınız. Donanım uygulaması, hız için paralel olarak üç crc32
yönergesini etkin bir şekilde çalıştırır.
İlgili konular
- 1. Raporlamadan çıkarma sonucundan nasıl yararlanılır
- 2. Crc32 C uygulaması - çalışmaz
- 3. Kendi programlama dilinizle VDSO nesnesinden nasıl yararlanılır?
- 4. Bir dizgenin CRC32'sini nasıl hesaplar
- 5. PHP'nin crc32 hash'i MySQL eşdeğerine nasıl dönüştürülür?
- 6. Python'da kütüphaneleri kullanmadan CRC32 hesaplaması
- 7. JAR dosyasının ana kaynak klasöründen doğrudan nasıl yararlanılır Java
- 8. ggplot'a özgü kalın çizgi
- 9. Çevrimiçi sonuçları eşleştirmek için CRC32'yi Python ile nasıl hesaplarsınız?
- 10. django özgü ayarlar app
- 11. xmlstarlet özgü sınıf s
- 12. Sınıfa özgü yeni/sil
- 13. Lambdaya özgü değişken
- 14. NSDateFormatter yerel ortama özgü tarihi nasıl gösterir?
- 15. Windows'ta add_custom_command yapılandırmasına özgü nasıl yapılır?
- 16. log4j: pakete özgü günlüğe kaydetme
- 17. laravel 5 Dil özgü yol
- 18. kullanın alternatif yazı özgü karakteri
- 19. Vista'da Özel Uygulamaya Özgü Uygulama
- 20. CoreNLP Başarısızlık Dil Özgü Özellikler '
- 21. Uygulamamda ek içeriğe özgü özellikler
- 22. Varlık çerçevesi Çekirdek Güncelleştirme-veritabanına özgü geçiş
- 23. grep'e özgü belirli dosya türleri MAC
- 24. Özel, makineye özgü yapılandırma dosyalarını Salt
- 25. Bağımlılıkları ifade etmek için desene özgü değişkenler
- 26. md5 parmak izi olmadan önceliğe özgü varlıklar
- 27. Bir ASP.NET isteğine özgü log4net içerik özelliği nasıl ayarlanır?
- 28. Windows'a özgü kullanıcı ana bilgisayar dosyası nasıl yapılandırılır?
- 29. nasıl okunmalı/baskı özgü sütun ve satırlar piton csv
- 30. GWT günlüğünde sınıfa özgü günlük düzeyi nasıl yapılandırılır? logging.properties yapılandırılabilir
LGPL kodunu okumak sizin için yasal ise, bkz. Http://code.woboq.org/qt5/qtbase/src/corelib/tools/qhash.cpp.html#95 – peppe