Pytania PRIR 2015
Grupa 1
1. Co to jest taksonomia Flynna
2. W jakich językach programowania można pisać programy na karty graficzne wspierające technologię CUDA?
3. Co to jest (S)MP w nomenklaturze CUDA
symetric multiprocesing - kilka procesów może wykonywać to samo zadanie w tym samym czasie
4. Napisz fragment kodu alokujący i przesyłający tablicę dwuwymiarową w MPI, gdzie proces 0 wysyła a proces 1 odbiera tablicę.
5. Opisz działanie klauzul barrier i nowait.
6. Opisz pamieć lokalną i tekstur. Jak utworzyć w nich zmienną?
7. Co to jest gridDim, blockIdx, blockDim, threadIdx?
8. Czy wywołania funkcji z przedrostkiem cuda* są synchroniczne? Czy programista ma jakieś mechanizmy do zarządzania synchronizacją?
CudaMemCpy - synchroniczne
CudaMemCpyAsynch -
asynchroniczne
Mechanizmy:
cudaThreadSynchronize - synchronizacja CPU
__syncThreads -
synchronizacja GPU
9. W jaki sposób kompilować i uruchamiać programy w MPI?
mpicxx main.cpp -o main
mpirun -np 3 ./main
Grupa 2
1. CUDA - rozwinąć skrót i co to jest
2. Pamięć wspólna i rozproszona - z wykładu
3. Co wypisze program napisany w OpenMP (był fragment), miał w sobie jedno zrównoleglenie, single. Ważne było żeby napisać, że kolejność nie jest znana dla fragmentów
4. Algorytm w pseudokodzie mnożenia macierzy na GPU
5. Opisz taksonomię SISD i podaj przykłady użycia
komputer 1 procesorowy
6. Pamięci Constant i Global w CUDA, w jaki sposób zadeklarować
zmienne w tych pamięciach
globalna:
_device_ int
a[5]
stała:
_device_ _constant_ int a[5]
deklaracja ta musi być przed main
a w main musimy skopiować
jakieś dane do tej zmiennej w pamieci stałej
poprzez:
cudaMemcpyToSymbol(wartośc, *a, rozmiar)
zwykłe cudaMemCpy kopiuje do pamięci globalnej
7. Proces a wątek - różnice. Który z nich jest "lżejszy".
8. Na jakich typach danych mogą operować karty graficzne
int float double (raczej zalezne od karty)
9. W jaki sposób przesłać swój typ danych w MPI?
Grupa 3
1. Taksonomia MISD
2. W jakiej taksonomii pracuję się na GPGPU - SIMD
3. Kod OpenMP a w nim bariery, co program wypisze (głównie chodziło o to, że kolejność wątków wchodzących i wychodzących z bariery jest losowa)
4. Superskalarność(czy efektywność/przyspieszenie* może być większa niż 1 odpowiedź uzasadnij)
*jakiś parametr
Efektywnośc(od ilości procesorów) =
Przyspieszenie / ilość procesorów. Może być. Dzieje się tak,
gdy większość elementów programu, lub caly mieści się w pamięci
podręcznej procesorów
5. Jest 1536 MB pamięci i dwie macierze do pomnożenia+ docelowa, jakiego max. rozmiaru macierze można pomnożyć
6. MPI_Bcast i MPI_Reduce do czego służą.
7. Opisz pamieć wspólną i rejestrów. Jak utworzyć w nich zmienną?
8. Firstprivate i lastprivate
9.
Grupa 4
1. SIMD, przykład - Single Instruction Multiple Data, np. komputer wektorowy, z technologii CUDA
2. Co to MPI?
3.
4. Reduction OpenMP - co to jest oraz wypisać operatory?
5. Jak się mierzy czas w CUDA?
6. __device__, __global__ i __host__ czym się różnią i które można łączyć i po co to robić? (w kontekście funkcji na cuda a nie zmiennych czy pamięci)
7. Jak możemy wypisać tekst na standardowe wyjście w Kernelu?
Dla kart graficznych z Compute Capability wersji 2.0 i wzwyż możemy wykorzystywać standardową metodę “printf”, natomiast dla niższych wersji wykorzystujemy metodę “cuprintf”, która dostepna jest tylko dla zarejestrowanych programistów (ograniczony dostęp) (źródło http://stackoverflow.com/a/2175515/4043989)
8. Czym się różni __syncThreads od cudaSynchronize?
cudaSynchronize - synchronizacja w CPU, wszystkie dane GPU muszą
zostać zainicjalizowane przed uruchmieniem kernela.
__syncThreads
- synchronizacja wątków na GPU. Czeka, aż wszystkie zakończą
działanie/obliczenia. Rodzaj bariery.
9.MPI_Comm_Rank, MPI_COMM_WORLD - wyjaśnić, do czego służą co robią itd.
MPI_COMM
- struktura przechowująca atrybuty komunikatora
MPI_COMM_WORLD
- domyślny i podstawowy komunikator w MPI
MPI_COMM_RANK - nr
procesu
MPI_COMM_SIZE - ilość procesów w komunikatorze