GCC

2014-11-01 23 views
5

ile 16 bayt CAS kullanırken Tanımsız başvuru bağlayıcı hatası, Debian üzerinde GCC 4.7.2 kullanıyorum ve 16 baytlık değerleri olan <atomic> olanaklarını kullanmaya çalıştığımda bağlayıcı hataları alıyorum. CMPXCHG16B talimatını destekleyebilen bir x86_64 VM çalıştırıyorum - ancak gerekli donanıma sahip olmasam bile, burada neden bir linker hatasının üretileceğini anlamıyorum. Bildiğim kadarıyla, <atomic> kütüphanesinin donanımın gerekli CAS operasyonunu desteklememesi durumunda normal kilitleri kullanarak geri düşmesi bekleniyor. Bu derleme yaparkenGCC

#include <atomic> 
#include <cstdint> 

struct foo 
{ 
    std::uint64_t x; 
    std::uint64_t y; 
}; 

int main() 
{ 
    std::atomic<foo> f1({0,0}); 
    foo f2 = {0,0}; 
    foo f3 = {1,1}; 
    f1.compare_exchange_strong(f2, f3); 
} 

, alıyorum:: Ben programı değiştirmek eğer foo böylece o

# g++ test.cpp -o test -std=c++11 -g3 
/tmp/ccziKZis.o: In function `std::atomic<foo>::compare_exchange_strong(foo&, foo, std::memory_order, std::memory_order)': 
/usr/include/c++/4.7/atomic:259: undefined reference to `__atomic_compare_exchange_16' 
collect2: error: ld returned 1 exit status 

Not

Neyse

, burada bu sorunu yeniden oluşturmak için çok basit bir test durumu var sadece 8 bayt, bağlayıcı hatası almıyorum. Burada neler oluyor?

+0

İlginç, 4.8.2 ve clang ++ 3.6 g ++ ile bu üreme olabilir. Altta yatan sorunun ne olduğundan emin değil - standart kütüphanede bir hata gibi görünüyor ya da bunlardan bazıları. –

cevap

6

Basit cevap, bunu biliyorsun bir kere: -mcx16 ile

çağırır g++.

gr ++ dokümanlar ki:

Bu seçenek oluşturulan kodda CMPXCHG16B komutunu kullanmak üzere GCC sağlayacaktır. CMPXCHG16B, 128 bit çift quadword (veya oword) veri türlerinde atomik işlemlere izin verir. Bu, çok sayıda işlemcisi (veya çekirdek) tarafından güncelleştirilebilen yüksek çözünürlüklü sayıcıları için kullanışlıdır. Bu talimat, atomik dahili fonksiyonların bir parçası olarak üretilmiştir: detaylar için bakınız * not Atomic Builtins ::.

(bu clang için çalışmıyor unutmayın! - Ben bir hata olduğunu düşünüyorum)

+0

Huh ... garip. GCC'nin, eğer varsa otomatik olarak cmpxchg16b'yi otomatik olarak desteklemesi gerektiğini düşünürdüm ya da bir kilit kullanarak tekrar geri dönmeyi düşünürdüm – Siler

+0

Evet, biri bunu beklerdi. Sanırım bazı erken versiyonlarına (Intel'in bu yana AMD'nin en başından beri olduğunu hatırlıyorum - ama emin olamıyorum) x86-64'ün buna sahip olmadığını hatırlıyorum. –