OpenCL: zadanie zaliczeniowe
ostatnie modyfikacje:
- 31 Maj, 10:15: zmiana długości sekwencji do 101; pomiary na każdym wzorcu i wszystkich na raz
- 28 Maj, 17:00 — termin: 5 czerwca 18:00; nowy opis dopasowań insercja/delecja; limit 100M BP na wzorzec
Zadaniem jest napisanie programu, który dopasowuje krótkie sekwencje do wzorca.
Terminem oddania jest 5 czerwca, 18:00. Podczas weekendu maszyny nvidia1 i nvidia2 będą bez nadzoru operatorów!
Informacja genetyczna każdego osobnika jest zapisana w genomie - ciągu zasad (BP, ang. base pair). Każde BP to jeden z symboli {A,C,G,T}, zatem genom możemy traktować jako skończony ciąg nad alfabetem {A,C,G,T}. ( http://en.wikipedia.org/wiki/Human_genome ).
By odczytać informację genetyczną osobnika, stosuje się obecnie urządzenia - sekwenatory DNA - które odczytują interesujące badaczy fragmenty genomu produkując ok. 60 milionów krótkich sekwencje (o długości, zależnie od sekwenatora, od 30 do 1000 BP). Każda taka sekwencja to spójny podciąg genomu. Sekwenator DNA produkuje sekwencje tak , że każdy element genomu pojawia się w kilku-kilkudziesięciu sekwencjach. Takie sekwencje dopasowuje się następnie do pewnego wzorca (ang. reference genome); różnice między sekwencjami osobnika a tym wzorcem mogą mieć istotne, medyczne konsekwencje.
Wzorzec ma długość od kilkuset BP do 3 mld BP (na potrzeby tego zadania można przyjąć że wzorzec mieści się w pamięci karty); dopasowujemy do niego sekwencje lub sekwencje antyrównolegle komplementarne. Sekwencja antyrównolegle komplementarna to sekwencja odczytywana od tyłu z symbolami zmienionymi na komplementarne (A<->T, C<->G), np. dla sekwencji ACGTATTA sekwencją antyrównoległą komplementarną jest TAATACGT
Sekwencja może nie pasować idealnie do wzorca. Dopuszczamy:
- snipy (i błędy odczytu)- zamiany pojedynczej BP na inną;
- insercje/delecje - sekwencja może mieć wstawione lub usunięte fragmenty dowolnej długości, np: wzorzec ACGTATTA i sekwencja ACCCCGTATTA (insercja) lub AATTA (delecja)
Jeśli sekwencja pasuje do kilku miejsc we wzorcu, wybieramy to do którego pasuje najlepiej, przy czym:
- dopasowanie z dłuższą insercją/delecją jest gorsze od dopasowania z krótszą insercją/delecją (jeśli oba dopasowania mają taką samą liczbę snipów)
- dopasowanie z insercją/delecją o dowolnej długości jest gorsze od dopasowania bez insercji/delecji, ale z \(k\) snipami; (przy czym max liczba snipów jest ograniczona parametrem programu). Można przyjąć, że każda insercja/delecja, niezależnie od długości, ``kosztuje'' \(k+1\) punktów karnych. Preferowane jest więc dopasowanie z \(j-1\) snipami i insercją długości \(l+1\) od dopasowania z \(j\) snipami i insercją długości \(l\) (\(j>1, l>0\)).
- dopasowanie z \(k\) snipami jest gorsze od dopasowania z \(k-1\) snipami (każdy snip ``kosztuje'' 1 punkt karny)
Spis treści
1 Wywołanie programu
./seqmat <max_snip_count> <max_ins_deletion_count> <reference_genome> <seq>
gdzie:
<max_snip_count>
to maksymalna liczba błędów/snipów przy dopasowaniu sekwencji (wartość maksymalna to 10, typowa wartość parametru: 1-5);<max_ins_deletion_count>
to maksymalna liczba insercji i delecji w sumie, maksymalna wartość parametru 1, czyli dopuszczamy maksymalnie jedną insercję albo jedną delecję- maksymalna długość delecji (liczba BP ze wzorca nieobecnych w sekwencji) jest ograniczona parametrem
MAX_DEL_LEN=50
; - maksymalna długość insercji jest taka, że co najmniej
MIN_INS_COMMON=50
BP musi się dopasować do wzorca, np: wzorzec TTTACGTATTATTTT, sekwencja z insercja ACCCCGTATTA, do wzorca dopasuje się 'AC' i 'GTATTA', czyli w sumie 8 BP; - algorytm powinien działać poprawnie również dla innych, także różniących się od siebie, wartości stałych
MAX_DEL_LEN
iMIN_INS_COMMON
; <reference_genome>
to nazwa pliku zawierającego referencyjne wzorce; kolejne wzorce zapisane są w kolejnych parach wierszy z których- pierwszy wiersz to nazwa wzorca;
- drugi wiersz to kod DNA wzorca (od kilkuset BP do kilkudziesięciu milionów BP);
<seq>
to plik z sekwencjami; Każdy wiersz zawiera jedną sekwencję o długości do 101 BP. Jeśli sekwencja jest krótsza niż 10 BP, nie należy jej dopasowywać do wzorca.
Zakładamy, że łączna długość wszystkich wzorców to mniej niż 100 milionów BP.
Zakładamy że wszystkie wzorce i rozsądna (co najmniej tysiące) ilość sekwencji (na raz) mieszczą się w pamięci karty (przy kodowaniu 1 bajt na 1 BP). Do wyliczenia dokładniejszej liczby sekwencji mieszczącej się w pamięci karty proszę użyć parametry kart z maszyn nvidia1-2.
2 Wyjście
Rezultatem programu jest przypisanie pasujących sekwencji do wzorców. Program na standardowe wyjście wypisuje dane w formacie CSV składające się z oddzielonych przecinkami kolumn:
- indeks sekwencji (czyli numer wiersza sekwencji z pliku
<seq>
; wiersze są numerowane od 1) - indeks wzorca (numer kolejny wzorca z pliku
<reference_genome>
; wzorce są numerowane od 1); - offset pierwszej BP ze wzorca pasującej do sekwencji, licząc od początku wzorca (BP są numerowane od 1);
- informacja o tym czy dopasowanie sekwencji jest normalne (0), czy komplementarne (1)
- długość insercji / delecji (jeśli nie występuje, 0)
- indeks (w sekwencji) początku insercji / delecji (jeśli nie występuje, 0)
Wiersze są uporządkowane po indeksach sekwencji.
Jeśli sekwencja pasuje do wzorca w kilku miejscach, program powinien wypisać jedno dopasowanie o minimalnym indeksie spośród najlepszych dopasowań. Jeśli sekwencja pasuje do kilku wzorców, program powinien wypisać jednen wiersz dla każdego pasującego wzorca.
Program na standardowe wyjście błędów wypisuje dwa wiersze, każdy zawierający pojedynczą liczbę:
- czas działania kernela (w milisekundach)
- czas działania kernela i transferów pomiędzy pamięcią hosta i karty (w milisekundach); do tej wartości nie należy wliczać czasu potrzebnego na odczyt danych wejściowych z dysku i zapis rezultatów na konsolę.
3 Dane
Znajdziecie w katalogu /usr/local/sekwencje
na komputerach nvidia1 i nvidia2.
- pliki .fastaplus to przykładowe wzorce;
- pliki
MZ1_10M.fastq
iMZ2_10M.fastq
to fragment odczytu z sekwenatora zawierający 2.5M sekwencji;_40M.fastq
zawierają po 10M sekwencji. Znaki spoza {A,T,C,G} proszę traktować jako błędy odczytu - czyli tak samo jak snip.
4 Kryteria oceny
Prosimy o zaimplementowanie algorytmu (bądź kilku algorytmów) i zastosowanie poznanych technik optymalizacji na GPU. Wraz z programem prosimy również o oddanie krótkiego raportu opisującego czas działania różnych wersji programu dla danych testowych.
Oceniamy szybkość działania najszybszej z przedstawionych wersji (50%); zastowanie technik optymalizacji (25%); raport (25%).
W raporcie prosimy o podanie czasu wykonania (kernela, kernela i transferów) dla sekwencji z plików MZ-10M.plain
i MZ-30M.plain
; parametrów
<max_snip_count>=5
<max_ins_deletion_count>=1
to maksymalna liczba insercji i delecji w sumie, maksymalna wartość parametru 1, czyli dopuszczamy maksymalnie jedną insercję albo jedną delecjęMAX_DEL_LEN=50
MIN_INS_COMMON=50
oraz wzorców (prosimy o osobne uruchomienie programu dla każdej z poniższych linii):
col9a3.fasta
fas.fasta
nf1.fasta
tp53.fasta
- wszystkich (
col9a3.fasta
,fas.fasta
,nf1.fasta
,tp53.fasta
) wzorców na raz
Jeśli program testować będziesz na innej karcie niż GF470 z maszyn nvidia1/nvidia2, prosimy o podanie parametrów karty:
- nazwa i typ karty
- liczba wieloprocesorów
- wielkość pamięci
- teoretyczna szczytowa wydajność w GFLOPs (np. kolumna GFLOPS - FMA z tabelki http://en.wikipedia.org/wiki/Comparison_of_Nvidia_graphics_processing_units#GeForce_500_Series )
5 Wykorzystanie algorytmów i kodu
W części OpenCL nie dopuszczamy wykorzystania cudzego kodu.
W innych częściach można wykorzystywać ogólnodostępny kod pod warunkiem jednoznacznego oznaczenia całego takiego kodu oraz informacji w raporcie.
Dopuszczamy korzystanie z algorytmów i publikacji naukowych. W raporcie prosimy o informacje o wykorzystywanych źródłach.