Zadanie to jest bardzo proste, pisząc do seqence zmiennej całkowitej pamięci:Szybki (est) sposób na zapisanie sekwencji całkowitej do pamięci globalnej?
kod oryginalny:
for (size_t i=0; i<1000*1000*1000; ++i)
{
data[i]=i;
};
kod parallelized:
size_t stepsize=len/N;
#pragma omp parallel num_threads(N)
{
int threadIdx=omp_get_thread_num();
size_t istart=stepsize*threadIdx;
size_t iend=threadIdx==N-1?len:istart+stepsize;
#pragma simd
for (size_t i=istart; i<iend; ++i)
x[i]=i;
};
Wydajność ssie, trwa 1,6 sek do pisania zmiennych 1G uint64
(co odpowiada 5 GB na sekundę), poprzez prostą równoległość (open mp parallel
) powyższego kodu, zwiększenie prędkości nieco, ale wydajność wciąż bani się 1,4 sek z 4 gwintów i 1.35 z 6 włókien o i7 3970.
theortical przepustowości pamięci mego wiertniczego (i7 3970/64G DDR3-1600) jest 51,2 GB/sek., dla powyższego przykładu, uzyskana przepustowość pamięci to tylko około 1/10 z theoritcal przepustowości, nawet za pomocą aplikacji jest dość ograniczona przepustowość pamięci.
Ktoś wie, jak poprawić kod?
Napisałem dużo kodu związanego z pamięcią na GPU, dość łatwo GPU, aby w pełni wykorzystać przepustowość pamięci urządzenia GPU (na przykład 85% + szerokości pasma).
EDIT:
Kod jest opracowany przez Intel MTK 13.1 do 64bit binarny, a przy maksymalnym optimzation (O3) i kod na ścieżce AVX, jak również auto-wektoryzacji.
UPDATE:
Próbowałem wszystkie z poniższych kodów (dzięki Paul R), nic specjalnego się dzieje, uważam, że kompilator jest w pełni zdolny do tego rodzaju optymalizacji SIMD/wektoryzacja.
Jak, dlaczego chcę wypełnić numery tam, dobrze, krótko mówiąc:
Jego częścią wysokiej wydajności niejednorodny obliczeniowej algorthim, po stronie urządzenia, po wykonaniu algorthim jest bardzo wydajny do tego stopnia, że zestaw wielu GPU jest tak szybki, że znalazłem wąskie gardło wydajności, gdy procesor próbuje zapisać kilka liczb w pamięci.
Przyczyny wiedząc, że procesor zasysa w wypełnienie liczby (w przeciwieństwie, GPU może wypełnić seqence numeru prędkością bardzo blisko (238GB/s z 288GB/s na GK110 vs żałosnym 5 GB/s. z 51,2GB/s. na procesor) do teoretycznej przepustowości globalnej pamięci GPU), mógłbym nieco zmienić mój algortym, ale zastanawiam się, dlaczego procesor jest tak kiepski w wypełnianiu numerów liczb tutaj.
chodzi o przepustowość pamięci mojej platformie, wierzę przepustowość (51.2GB) wynosi około poprawna, na podstawie mojego testu memcpy()
, osiągnięty przepustowość jest o 80% + z obrona teoretycznej przepustowości (> 40GB/s).
Czy próbowałeś zoptymalizować kod? Na przykład. użyć -O3, jeśli używasz 'gcc'? –
Powinieneś przynajmniej spróbować go rozwinąć. * Optymalizacja fotela *. – unwind
Spróbuj wykonać 2 zapisy w każdej iteracji. Może 4, 8, 16. –