Hatalar, hatalar, sorular - sayfa 2506

 
Vict :
Savunmak

Kayıtlar bayt cinsinden değil, bit cinsinden ölçülür. Bu nedenle, bu satır kodun geri kalanında yanlış kullanılmıştır:

 #define CACHE_LINE_SIZE 64
 
Francuz :

Kayıtlar bayt cinsinden değil, bit cinsinden ölçülür. Bu nedenle, bu satır kodun geri kalanında yanlış kullanılmıştır:

Hayır, garip bir şey söylüyorsun. Bunu kanıtlamayacağım. İşlemci belgelerine bakın, burayı okuyun https://stackoverflow.com/questions/7281699/aligning-to-cache-line-and-knowing-the-cache-line-size/7284876

x86 önbellek satırlarında 64 bayttır

Kayıtlara ihtiyacım yok, onlardan hiç bahsetmiyorum.

Aligning to cache line and knowing the cache line size
Aligning to cache line and knowing the cache line size
  • 2011.09.02
  • MetallicPriestMetallicPriest 12.1k2929 gold badges135135 silver badges259259 bronze badges
  • stackoverflow.com
To prevent false sharing, I want to align each element of an array to a cache line. So first I need to know the size of a cache line, so I assign each element that amount of bytes. Secondly I want the start of the array to be aligned to a cache line. I am using Linux and 8-core x86 platform...
 
Vict :

Hayır, garip bir şey söylüyorsun. Bunu kanıtlamayacağım. İşlemci belgelerine bakın, burayı okuyun https://stackoverflow.com/questions/7281699/aligning-to-cache-line-and-knowing-the-cache-line-size/7284876

Kayıtlara ihtiyacım yok, onlardan hiç bahsetmiyorum.

Hmm tamam. Genel olarak, farklı işlemci modelleri için önbellek farklıdır. Ve programlı olarak boyutu bilinmiyor. Bu yüzden ona bakmak aptalca. Ancak tüm işlemcilerin kayıtları iki tiptir ve deneyimli programcılar kayıtların boyutuna göre yönlendirilir. Derleyici ve işletim sistemi program ve işlemci arasında olduğundan, kayıtlara yönlendirme bile her zaman kaydetmez.

Ayrıca, bu satır yanlış hesaplanmıştır ve büyük/küçük harfe duyarlı değildir:

 int index = int (CACHE_LINE_SIZE - getaddr(data[rndnum].ar[ 0 ]) % CACHE_LINE_SIZE) / sizeof ( int );
 
Francuz :

Hmm tamam. Genel olarak, farklı işlemci modelleri için önbellek farklıdır. Ve programlı olarak boyutu bilinmiyor. Bu yüzden ona bakmak aptalca. Ancak tüm işlemcilerin kayıtları iki tiptir ve deneyimli programcılar kayıtların boyutuna göre yönlendirilir. Derleyici ve işletim sistemi program ve işlemci arasında olduğundan, kayıtlara yönlendirme bile her zaman kaydetmez.

Yine, her şey gelişiyor, çoklu iş parçacığına giderek daha fazla vurgu yapılıyor ve burada hoş geldiniz - cross std kitaplığı size her şeyi anlatacak

https://en.cppreference.com/w/cpp/thread/hardware_stitution_interference_size

Ayrıca, bu satır yanlış hesaplanmıştır ve büyük/küçük harfe duyarlı değildir:
Olabilir, ama beni henüz ikna etmedin.
std::hardware_destructive_interference_size, std::hardware_constructive_interference_size - cppreference.com
  • en.cppreference.com
These constants provide a portable way to access the L1 data cache line size.
 
Vict :

Yine, her şey gelişiyor, çoklu iş parçacığına giderek daha fazla vurgu yapılıyor ve burada hoş geldiniz - cross std kitaplığı size her şeyi anlatacak

https://en.cppreference.com/w/cpp/thread/hardware_stitution_interference_size

Olabilir, ama beni henüz ikna etmedin.

Söylemiyor, tahmin ediyor. Spesifikasyonu dikkatlice okuyun.


Ne tür bir ofset almak istediğinizi tam olarak anlamamış olsam da, bunu anlamak kolay: mutlak adres hesaplamalarda tamamen işe yaramaz. Bellek için referans noktasının yapının adresi olduğunu unuttunuz mu? Ve muhtemelen yapının bellek bloğunda dizinin ofsetini almak istediniz? Bu da yapının adresleri ile dizinin sıfır elemanı arasındaki farktan elde edilir.

 
Artyom Trishkin :

Çubuktaki arabellekte değer yoksa, bunun arabelleğe açıkça yazılması gerekir. Yani hesaplanan değerin tampona çıkması gerekiyorsa tampona yazarız, aksi halde boş bir değer yazarız.

Artem'e teşekkürler.

 
Francuz :

Ne tür bir ofset almak istediğinizi tam olarak anlamamış olsam da, bunu anlamak kolay: mutlak adres hesaplamalarda tamamen işe yaramaz. Bellek için referans noktasının yapının adresi olduğunu unuttunuz mu? Ve muhtemelen yapının bellek bloğunda dizinin ofsetini almak istediniz? Bu da yapının adresleri ile dizinin sıfır elemanı arasındaki farktan elde edilir.

 int index = int (CACHE_LINE_SIZE - getaddr(data[rndnum].ar[ 0 ]) % CACHE_LINE_SIZE) / sizeof ( int );
                                3        1                    2                  4

Eylemler sırayla:

1 - mevcut veri yapısındaki ilk ar[] öğesinin adresini alın.

2. Önbellek satırının başlangıcından itibaren ofsetlerini bulun

3. Önbellek satırının sonuna kadar olan bayt sayısını bulun

4. Önbellek satırının sonuna kadar bu alana sığacak ints sayısını bulun.


kendin mi fırlattın Hız farkı var mı? Yoksa sadece ben miyim?

 
Vict :

2. Önbellek satırının başlangıcından itibaren ofsetlerini bulun

Bir tür denkleştirme belirleyebileceğiniz fikrini nereden aldınız?

 
Bu frenler ne için?

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

fxsaber , 2019.07.09 11:13

    Data data[];
   
   ArrayResize (data, 32768 );

6 kat yavaşlama var!

 
fxsaber :
Bu frenler neyden?
dinamik bir dizinin daha fazla kontrolü var, Renat bir keresinde yazmıştı, bir gönderi bulamıyorum, sadece dizine göre erişim hakkında bir konuşmada, neden artılardan çok daha yavaş
Neden: