___________________________________________________________________________________
* Copyright 2008 by Gregory Striemer.  All rights reserved. This program 
* is for educational purposes only. It may not be sold or incorporated 
* into a commercial product in whole or in part, without written consent 
* of Gregory Striemer.  For further information regarding permission for 
* use or reproduction, contact: Gregory Striemer at gmstrie@email.ece.arizona.edu                  
___________________________________________________________________________________



This program is an implementation of the Smith-Waterman Algorithm for use on 
an NVIDIA GPU using CUDA. To compile and run, simply copy the folder "SmithWaterman"
to the NVIDIA CUDA SDK projects directory, open the project using Visual Studio 2005, then build and run. 
There are a few items which have been hard coded into the program which the user will
need to change to test different query sequences. On line 62 of SmithWaterman_kernel.cu
the actual query sequence is hard coded, as well as its length on line 66. The query length
is also hard coded in SmithWaterman.cu on lines 252, 258, 266, and SmithWaterman_gold.cpp on 
line 300. These values will need to change with respect to the query sequence which is 
being tested. The database file is read by the program and must be in the fasta file format. (file
extension can be .fasta or .txt). The path to the file to be scanned is entered through the command
line in the program. For example: C:\user\Desktop\database.txt. Reading of the database file is not optimized 
for speed, as the focus of this study was not reading databases, so expect fairly slow read times for the CPU for the database.
Results from the alignments are written to a file as directed by the user after running Smith-Waterman
on the GPU. Timing results for the alignments on the GPU are printed to the screen in milliseconds. 
"All" alignment scores are written for each sequence to the specified file.  
Tracebacks are not performed in this program. This code was created for use on
the NVIDIA Tesla C870, which has 1.5GB main memory. If a card with smaller memories is used
memory issues may occur. If this happens simply use a smaller database to scan. The program
does not have a built in cutoff point for number of sequences. With the Tesla I have had no
problems scanning databases with over 300,000 sequences. This code was originally
optimized for query sequences which were multiples of 4. Additional support has been added for 
sequences which are not multiples of 4, however a slight drop in performance may be encountered.




If you have any questions or comments, please feel
free to contact me at gmstrie@ece.arizona.edu.


