summaryrefslogtreecommitdiff
path: root/benchmarks/CUDA/MUM/mummergpu.cu
diff options
context:
space:
mode:
Diffstat (limited to 'benchmarks/CUDA/MUM/mummergpu.cu')
-rw-r--r--benchmarks/CUDA/MUM/mummergpu.cu1259
1 files changed, 0 insertions, 1259 deletions
diff --git a/benchmarks/CUDA/MUM/mummergpu.cu b/benchmarks/CUDA/MUM/mummergpu.cu
deleted file mode 100644
index 43b3ff5..0000000
--- a/benchmarks/CUDA/MUM/mummergpu.cu
+++ /dev/null
@@ -1,1259 +0,0 @@
-// Includes, system
-#define ulong4 uint4
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <math.h>
-#include <assert.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/time.h>
-
-// includes, kernels
-#include <common.cu>
-
-#include <mummergpu.h>
-#include <mummergpu_kernel.cu>
-
-#define BLOCKSIZE 256
-
-#define CUDA_SAFE_CALL( call) do { \
- cudaError err = call; \
- if( cudaSuccess != err) { \
- fprintf(stderr, "Cuda error in file '%s' in line %i : %s.\n", \
- __FILE__, __LINE__, cudaGetErrorString( err) ); \
- exit(EXIT_FAILURE); \
- } } while (0)
-
-
-////////////////////////////////////////////////////////////////////////////////
-// declaration, forward
-void runTest( int argc, char** argv);
-
-extern "C"
-void computeGold(MatchResults* results,
- char* refstr,
- char* queries,
- int* queryAddrs,
- int* queryLengths,
- PixelOfNode* nodeTexture,
- PixelOfChildren* childrenTexture,
- int numQueries,
- int mismatch_length,
- int rc);
-
-extern "C"
-void getReferenceString(const char * filename, char** refstr, size_t* reflen);
-
-extern "C"
-void createTreeTexture(const char * filename,
- PixelOfNode** nodeTexture, PixelOfChildren** childrenTexture,
- unsigned int* width, unsigned int* height,
- AuxiliaryNodeData** aux_data,
- int* num_nodes,
- const char * dotfilename,
- const char * texfilename);
-
-extern "C"
-void getQueriesTexture(int qfile,
- char** queryTexture,
- size_t* queryLength,
- int** queryAddrs,
- char*** queryNames,
- int** queryLengths,
- unsigned int* numQueries,
- size_t device_memory_avail,
- int min_match_length,
- bool rc);
-
-void printAlignments(char* ref,
- ReferencePage* page,
- char* query,
- int qrylen,
- int nodeid,
- int qrypos,
- int edge_depth,
- int min_match,
- bool rc,
- bool forwardcoordinates);
-
-int countLeafNodes(int nodeid);
-
-// Timer management
-struct Timer_t
-{
- struct timeval start_m;
- struct timeval end_m;
-};
-
-void createTimer(unsigned int * timer)
-{
- unsigned int * ptr = (unsigned int *) malloc(sizeof(struct Timer_t));
- memset(ptr, 0, sizeof(struct Timer_t));
-
- *timer = (unsigned int)(unsigned long long) ptr;
-}
-
-void startTimer(unsigned int ptr)
-{
- gettimeofday(&(((struct Timer_t *)ptr)->start_m), NULL);
-}
-
-void stopTimer(unsigned int ptr)
-{
- gettimeofday(&(((struct Timer_t *)ptr)->end_m), NULL);
-}
-
-float getTimerValue(unsigned int ptr)
-{
- Timer_t * timer = (Timer_t*) ptr;
-
- if (timer == NULL)
- {
- fprintf(stderr, "Uninitialized timer!!!\n");
- return 0.0;
- }
-
- if (timer->end_m.tv_sec == 0) { stopTimer(ptr); }
-
- return (float) (1000.0 * (timer->end_m.tv_sec - timer->start_m.tv_sec)
- + (0.001 * (timer->end_m.tv_usec - timer->start_m.tv_usec)));
-}
-
-void deleteTimer(unsigned int ptr)
-{
- free((Timer_t *)ptr);
-}
-
-extern "C"
-int createReference(const char* fromFile, Reference* ref)
-{
- if (!fromFile || !ref)
- return -1;
-
- getReferenceString(fromFile, &(ref->str), &(ref->len));
-
- return 0;
-}
-
-extern "C"
-int destroyReference(Reference* ref)
-{
- free(ref->h_node_tex_array);
- free(ref->h_children_tex_array);
- free(ref->str);
- free(ref->h_ref_tex_array);
- free(ref->aux_data);
- ref->str = NULL;
- ref->len = 0;
-
- return 0;
-}
-
-extern "C"
-int createQuerySet(const char* fromFile, QuerySet* queries)
-{
-
- fprintf(stderr, "Opening %s...\n", fromFile);
- int qfile = open(fromFile, O_RDONLY);
-
- if (qfile == -1)
- {
- fprintf(stderr, "Can't open %s: %d\n", fromFile, errno);
- exit (1);
- }
-
- queries->qfile = qfile;
-
- return 0;
-}
-
-extern "C"
-int destroyQuerySet(QuerySet* queries)
-{
-
- if (queries->qfile)
- close(queries->qfile);
-
- return 0;
-}
-
-extern "C"
-void printStringForError(int err)
-{
-
-}
-
-extern "C"
-int createMatchContext(Reference* ref,
- QuerySet* queries,
- MatchResults* matches,
- MUMMERGPU_OPTIONS options,
- int min_match_length,
- char* stats_file,
- bool reverse,
- bool forwardreverse,
- bool forwardcoordinates,
- bool showQueryLength,
- MatchContext* ctx)
-{
-
- ctx->queries = queries;
- ctx->ref = ref;
- ctx->full_ref = ref->str;
- ctx->full_ref_len = ref->len;
-
- // break out options here
- ctx->on_cpu = options & ON_CPU;
- ctx->min_match_length = min_match_length;
- ctx->stats_file = stats_file;
- ctx->reverse = reverse;
- ctx->forwardreverse = forwardreverse;
- ctx->forwardcoordinates = forwardcoordinates;
- ctx->show_query_length = showQueryLength;
- return 0;
-}
-
-extern "C"
-int destroyMatchContext(MatchContext* ctx)
-{
- free(ctx->full_ref);
- //destroyReference(ctx->ref);
- destroyQuerySet(ctx->queries);
- return 0;
-}
-
-void buildReferenceTexture(Reference* ref, char* full_ref, size_t begin, size_t end)
-{
- fprintf(stderr, "Building reference texture...\n");
-
-
-
- PixelOfNode* nodeTexture = NULL;
- PixelOfChildren * childrenTexture = NULL;
-
- unsigned int height = 0;
- unsigned int width = 0;
-
- AuxiliaryNodeData* aux_data = NULL;
- int num_nodes;
-
- ref->len = end - begin + 3;
- ref->str = (char*)malloc(ref->len);
- ref->str[0] = 's';
- strncpy(ref->str + 1, full_ref + begin, ref->len - 3);
- strcpy(ref->str + ref->len - 2, "$");
- createTreeTexture(ref->str,
- &nodeTexture,
- &childrenTexture,
- &width, &height,
- &aux_data,
- &num_nodes,
- NULL,
- NULL);
-
- ref->h_node_tex_array = nodeTexture;
- ref->h_children_tex_array = childrenTexture;
- ref->tex_width = width;
- ref->tex_height = height;
-
- ref->aux_data = aux_data;
- ref->num_nodes = num_nodes;
-
- ref->bytes_on_board = width * height * (sizeof(PixelOfNode) + sizeof(PixelOfChildren));
-
- unsigned int refpitch = ref->pitch = 65536;
- int numrows = ceil(ref->len / ((float)refpitch));
- int blocksize = 4;
- numrows += blocksize;
-
- ref->h_ref_tex_array = (char *) malloc(numrows*refpitch);
-
- ref->bytes_on_board += numrows*refpitch;
-
- int z_max = numrows * refpitch;
- for (int z = 0; z < z_max; z++) { ref->h_ref_tex_array[z] = 'Z'; }
-
- int x, y;
- int maxx = 0, maxy = 0;
-
- size_t reflen = ref->len;
- char* refstr = ref->str;
-
-
- int block_dim = refpitch * blocksize;
- for (int i = 0; i < reflen; i++)
- {
- int bigx = i % (block_dim);
- int bigy = i / (block_dim);
-
- y = bigy*blocksize+bigx%blocksize;
- x = bigx / blocksize;
-
- // printf("%d: (%d,%d)=%c\n", i, x, y, refstr[i]);
-
- assert(x < refpitch);
- assert(y < numrows);
-
- ref->h_ref_tex_array[y*refpitch+x] = refstr[i];
-
- if (x > maxx) { maxx = x; }
- if (y > maxy) { maxy = y; }
- }
-
- if ((maxx >= refpitch) || (maxy >= numrows))
- {
- fprintf(stderr, "ERROR: maxx: %d refpitch: %d, maxy: %d numrows: %d\n",
- maxx, refpitch, maxy, numrows);
-
- exit(1);
- }
-
-}
-
-void loadReferenceTexture(MatchContext* ctx)
-{
- Reference* ref = ctx->ref;
- int numrows = ceil(ref->len / ((float)ref->pitch));
- int blocksize = 4;
- numrows += blocksize;
-
- cudaChannelFormatDesc refTextureDesc =
- cudaCreateChannelDesc(8, 0, 0, 0, cudaChannelFormatKindSigned);
-
- if (!ctx->on_cpu)
- {
- unsigned int toboardtimer = 0;
- createTimer(&toboardtimer);
- startTimer(toboardtimer);
-
- fprintf(stderr, "allocating reference texture\n");
- CUDA_SAFE_CALL(cudaMallocArray( (cudaArray**)(&ref->d_ref_tex_array),
- &refTextureDesc,
- ref->pitch,
- numrows));
-
- //ref->bytes_on_board += ref->pitch * numrows;
-
- CUDA_SAFE_CALL(cudaMemcpyToArray( (cudaArray*)(ref->d_ref_tex_array),
- 0,
- 0,
- ref->h_ref_tex_array,
- numrows*ref->pitch,
- cudaMemcpyHostToDevice));
-
- reftex.addressMode[0] = cudaAddressModeClamp;
- reftex.addressMode[1] = cudaAddressModeClamp;
- reftex.filterMode = cudaFilterModePoint;
- reftex.normalized = false;
-
- CUDA_SAFE_CALL(cudaBindTextureToArray( reftex, (cudaArray*)ref->d_ref_tex_array, refTextureDesc));
-
- stopTimer(toboardtimer);
- ctx->statistics.t_moving_tree_pages += getTimerValue(toboardtimer);
- deleteTimer(toboardtimer);
- }
- else
- {
- ref->d_ref_tex_array = NULL;
- }
-
- fprintf(stderr,"done\n");
-
-}
-
-void unloadReferenceTexture(Reference* ref)
-{
- CUDA_SAFE_CALL(cudaUnbindTexture( reftex ) );
- CUDA_SAFE_CALL(cudaFreeArray((cudaArray*)(ref->d_ref_tex_array)));
- ref->d_ref_tex_array = NULL;
-}
-
-
-//loads a tree and text for [begin, end) in the reference
-void loadReference(MatchContext* ctx)
-{
-
- Reference* ref = ctx->ref;
-
- //ref->bytes_on_board = 0;
-
- loadReferenceTexture(ctx);
-
- if (!ctx->on_cpu)
- {
- unsigned int toboardtimer = 0;
- createTimer(&toboardtimer);
- startTimer(toboardtimer);
-
- cudaChannelFormatDesc nodeTextureDesc =
- cudaCreateChannelDesc(32, 32, 32, 32, cudaChannelFormatKindUnsigned);
-
- CUDA_SAFE_CALL( cudaMallocArray( (cudaArray**)(&ref->d_node_tex_array),
- &nodeTextureDesc,
- ref->tex_width,
- ref->tex_height ));
-
- //ref->bytes_on_board += ref->tex_width * ref->tex_height * (sizeof(PixelOfNode));
-
- CUDA_SAFE_CALL( cudaMemcpyToArray( (cudaArray*)(ref->d_node_tex_array),
- 0,
- 0,
- ref->h_node_tex_array,
- ref->tex_width * ref->tex_height * sizeof(PixelOfNode),
- cudaMemcpyHostToDevice));
-
- nodetex.addressMode[0] = cudaAddressModeClamp;
- nodetex.addressMode[1] = cudaAddressModeClamp;
- nodetex.filterMode = cudaFilterModePoint;
- nodetex.normalized = false; // access with normalized texture coordinates
-
- CUDA_SAFE_CALL( cudaBindTextureToArray( nodetex,
- (cudaArray*)ref->d_node_tex_array,
- nodeTextureDesc));
-
- cudaChannelFormatDesc childrenTextureDesc =
- cudaCreateChannelDesc(32, 32, 32, 32, cudaChannelFormatKindUnsigned);
-
- CUDA_SAFE_CALL( cudaMallocArray( (cudaArray**)(&ref->d_children_tex_array),
- &childrenTextureDesc,
- ref->tex_width,
- ref->tex_height ));
-
- //ref->bytes_on_board += ref->tex_width * ref->tex_height * sizeof(PixelOfNode);
-
- CUDA_SAFE_CALL( cudaMemcpyToArray((cudaArray*)(ref->d_children_tex_array),
- 0,
- 0,
- ref->h_children_tex_array,
- ref->tex_width * ref->tex_height * sizeof(PixelOfChildren),
- cudaMemcpyHostToDevice));
-
- childrentex.addressMode[0] = cudaAddressModeClamp;
- childrentex.addressMode[1] = cudaAddressModeClamp;
- childrentex.filterMode = cudaFilterModePoint;
- childrentex.normalized = false; // access with normalized texture coordinates
-
- CUDA_SAFE_CALL( cudaBindTextureToArray( childrentex,
- (cudaArray*)(ref->d_children_tex_array),
- childrenTextureDesc));
- fprintf(stderr, "done\n");
-
- stopTimer(toboardtimer);
- ctx->statistics.t_moving_tree_pages += getTimerValue(toboardtimer);
- deleteTimer(toboardtimer);
- }
- else
- {
- ref->d_node_tex_array = NULL;
- ref->d_children_tex_array = NULL;
- }
-}
-
-void unloadReference(MatchContext* ctx)
-{
- Reference* ref = ctx->ref;
-
- CUDA_SAFE_CALL(cudaUnbindTexture( nodetex ) );
- CUDA_SAFE_CALL(cudaFreeArray((cudaArray*)(ref->d_node_tex_array)));
- ref->d_node_tex_array = NULL;
-
- CUDA_SAFE_CALL(cudaUnbindTexture( childrentex ) );
- CUDA_SAFE_CALL(cudaFreeArray((cudaArray*)(ref->d_children_tex_array)));
- ref->d_children_tex_array = NULL;
-
- unloadReferenceTexture(ctx->ref);
-}
-
-
-
-void loadQueries(MatchContext* ctx)
-{
- unsigned int toboardtimer = 0;
- createTimer(&toboardtimer);
- startTimer(toboardtimer);
-
- QuerySet* queries = ctx->queries;
- queries->bytes_on_board = 0;
-
- unsigned int numQueries = queries->count;
-
- if (!ctx->on_cpu)
- {
- fprintf(stderr, "loadQueries on GPU: Allocating device memory for queries...\n");
-
- CUDA_SAFE_CALL( cudaMalloc((void**) &queries->d_tex_array, queries->texlen));
-
- queries->bytes_on_board += queries->texlen;
-
- CUDA_SAFE_CALL( cudaMemcpy((void*) queries->d_tex_array,
- queries->h_tex_array + queries->h_addrs_tex_array[0],
- queries->texlen,
- cudaMemcpyHostToDevice));
-
- CUDA_SAFE_CALL( cudaMalloc((void**) &queries->d_addrs_tex_array,
- numQueries * sizeof(int)));
-
- queries->bytes_on_board += numQueries * sizeof(int);
-
- CUDA_SAFE_CALL( cudaMemcpy((void*) queries->d_addrs_tex_array,
- queries->h_addrs_tex_array,
- numQueries * sizeof(int),
- cudaMemcpyHostToDevice));
-
- CUDA_SAFE_CALL( cudaMalloc((void**) &queries->d_lengths_array,
- numQueries * sizeof(int)));
-
- queries->bytes_on_board += numQueries * sizeof(int);
-
- CUDA_SAFE_CALL( cudaMemcpy((void*) queries->d_lengths_array,
- queries->h_lengths_array,
- numQueries * sizeof(int),
- cudaMemcpyHostToDevice));
-
- fprintf(stderr, "loadQueries on GPU: allocated %ld bytes done\n", 2 * numQueries*sizeof(int) + queries->texlen);
- }
- else
- {
- queries->d_addrs_tex_array = NULL;
- queries->d_tex_array = NULL;
- queries->d_lengths_array = NULL;
- fprintf(stderr, "loadQueries on CPU: allocated %ld bytes done\n", numQueries*sizeof(int) + queries->texlen);
- }
-
- stopTimer(toboardtimer);
- ctx->statistics.t_to_board += getTimerValue(toboardtimer);
- deleteTimer(toboardtimer);
-}
-
-void unloadQueries(MatchContext* ctx)
-{
- QuerySet* queries = ctx->queries;
-
- CUDA_SAFE_CALL(cudaFree(queries->d_tex_array));
- queries->d_tex_array = NULL;
-
- CUDA_SAFE_CALL(cudaFree(queries->d_addrs_tex_array));
- queries->d_addrs_tex_array = NULL;
-
- CUDA_SAFE_CALL(cudaFree(queries->d_lengths_array));
- queries->d_lengths_array = NULL;
-
- queries->bytes_on_board = 0;
-}
-
-void loadResultBuffer(MatchContext* ctx)
-{
- unsigned int numQueries = ctx->queries->count;
-
- assert (numQueries);
-
- int match_length = ctx->min_match_length;
-
- unsigned int numCoords = 0;
-
- numCoords = ctx->queries->texlen - numQueries * (match_length + 1);
-
- ctx->results.numCoords = numCoords;
-
- fprintf(stderr, "Allocating result array for %d queries (%d bytes) ...",numQueries, numCoords*sizeof(MatchCoord) );
- ctx->results.h_match_coords = (MatchCoord*) calloc( numCoords, sizeof(MatchCoord));
-
- if (!ctx->on_cpu)
- {
- unsigned int toboardtimer = 0;
- createTimer(&toboardtimer);
- startTimer(toboardtimer);
-
- ctx->results.bytes_on_board = 0;
-
- CUDA_SAFE_CALL( cudaMalloc( (void**) &ctx->results.d_match_coords,
- numCoords * sizeof(MatchCoord)));
- ctx->results.bytes_on_board += numCoords * sizeof(MatchCoord);
-
- CUDA_SAFE_CALL( cudaMemset( (void*)ctx->results.d_match_coords, 0,
- numCoords * sizeof(MatchCoord)));
-
- stopTimer(toboardtimer);
- ctx->statistics.t_to_board += getTimerValue(toboardtimer);
- deleteTimer(toboardtimer);
- }
- else
- {
- ctx->results.d_match_coords = NULL;
- }
-
- fprintf(stderr, "done\n");
-}
-
-void unloadResultBuffer(MatchContext* ctx)
-{
- CUDA_SAFE_CALL(cudaFree(ctx->results.d_match_coords));
-
- ctx->results.bytes_on_board = 0;
-}
-
-
-void freeResults(MatchContext* ctx, ReferencePage pages[], unsigned int num_pages)
-{
- for (int i = 0; i < num_pages; ++i)
- {
- free(pages[i].results.h_match_coords);
- }
-}
-
-void transferResultsFromDevice(MatchContext* ctx)
-{
- if (!ctx->on_cpu)
- {
- unsigned int fromboardtimer = 0;
- createTimer(&fromboardtimer);
- startTimer(fromboardtimer);
-
- CUDA_SAFE_CALL(cudaMemcpy(ctx->results.h_match_coords,
- ctx->results.d_match_coords,
- ctx->results.numCoords * sizeof(MatchCoord),
- cudaMemcpyDeviceToHost) );
-
- stopTimer(fromboardtimer);
- ctx->statistics.t_from_board += getTimerValue(fromboardtimer);
- deleteTimer(fromboardtimer);
- }
-
-}
-
-
-int flushOutput();
-int addToBuffer(char* string);
-
-inline int match_coord_addrs(int qryid, int qry_addrs, int match_length)
-{
- return qry_addrs - qryid * (match_length + 1);
-}
-
-#define MAX_QUERY_LEN 8192
-
-struct packed_slot
-{
- unsigned short page;
- unsigned short qpos;
- MatchCoord coord;
-};
-
-struct packed_slot_array
-{
- packed_slot* slots;
- unsigned int num_slots;
-};
-
-void addPackedOutput(MatchContext* ctx, packed_slot_array** curr_output, packed_slot_array slot_array[])
-{
- unsigned int numQueries = ctx->queries->count;
- if (*curr_output == NULL)
- {
- *curr_output = slot_array;
- }
- else
- {
- for (int i = 0; i < numQueries; i++)
- {
- if (slot_array[i].num_slots)
- {
- //packed_slot_array* slots = &(slot_array[i]);
- (*curr_output)[i].slots = (packed_slot*)realloc((*curr_output)[i].slots,
- ((*curr_output)[i].num_slots + slot_array[i].num_slots) * sizeof(packed_slot));
- memcpy((*curr_output)[i].slots + (*curr_output)[i].num_slots,
- slot_array[i].slots,
- slot_array[i].num_slots * sizeof(packed_slot));
- (*curr_output)[i].num_slots += slot_array[i].num_slots;
- free(slot_array[i].slots);
- }
- }
- free(slot_array);
- }
-}
-
-char numbuffer[32];
-
-void printRCSlots(MatchContext * ctx, ReferencePage pages[], int qry, packed_slot_array * slots)
-{
- char* h_tex_array = ctx->queries->h_tex_array;
- int* h_addrs_tex_array = ctx->queries->h_addrs_tex_array;
- int qrylen = ctx->queries->h_lengths_array[qry];
-
- addToBuffer("> ");
- addToBuffer(*(ctx->queries->h_names + qry));
- addToBuffer(" Reverse");
-
- if (ctx->show_query_length)
- {
- addToBuffer(" Len = ");
- sprintf(numbuffer, "%d", qrylen);
- addToBuffer(numbuffer);
- }
-
- addToBuffer("\n");
-
- for (int j = 0; j < slots->num_slots; ++j)
- {
- packed_slot slot = slots->slots[j];
-
- if (slot.coord.edge_match_length & FRMASK)
- {
- printAlignments(ctx->full_ref,
- &(pages[slot.page]),
- h_tex_array + h_addrs_tex_array[qry],
- qrylen,
- slot.coord.node,
- slot.qpos,
- (slot.coord.edge_match_length & FRUMASK),
- ctx->min_match_length,
- 1,
- ctx->forwardcoordinates);
- }
- }
-}
-int FOO;
-void printForwardSlots(MatchContext * ctx, ReferencePage pages[], int qry, packed_slot_array * slots)
-{
- char* h_tex_array = ctx->queries->h_tex_array;
- int* h_addrs_tex_array = ctx->queries->h_addrs_tex_array;
- int qrylen = ctx->queries->h_lengths_array[qry];
-
- addToBuffer("> ");
- addToBuffer(*(ctx->queries->h_names + qry));
-
- if (ctx->show_query_length)
- {
- addToBuffer(" Len = ");
- sprintf(numbuffer, "%d", qrylen);
- addToBuffer(numbuffer);
- }
-
- addToBuffer("\n");
-
- for (int j = 0; j < slots->num_slots; ++j)
- {
- packed_slot slot = slots->slots[j];
- if (!(slot.coord.edge_match_length & FRMASK))
- {
- printAlignments(ctx->full_ref,
- &(pages[slot.page]),
- h_tex_array + h_addrs_tex_array[qry],
- qrylen,
- slot.coord.node,
- slot.qpos,
- slot.coord.edge_match_length,
- ctx->min_match_length,
- 0,
- ctx->forwardcoordinates);
- }
- }
- FOO += slots->num_slots;
-}
-
-void printPackedResults(MatchContext* ctx, ReferencePage pages[], packed_slot_array slot_array[])
-{
- unsigned int numQueries = ctx->queries->count;
- FOO = 0;
- for (int qry = 0; qry < numQueries; qry++)
- {
- packed_slot_array* slots = &(slot_array[qry]);
-
- if (ctx->reverse)
- {
- printRCSlots(ctx, pages, qry, slots);
- }
- else
- {
- printForwardSlots(ctx, pages, qry, slots);
-
- if (ctx->forwardreverse)
- {
- printRCSlots(ctx, pages, qry, slots);
- }
- }
- }
- printf("FOO = %d\n", FOO);
- flushOutput();
-}
-
-void packSlots(MatchContext* ctx, MatchResults* results, unsigned int page_num, packed_slot_array** slot_arrays, bool rc)
-{
- unsigned int numQueries = ctx->queries->count;
-
- int* h_addrs_tex_array = ctx->queries->h_addrs_tex_array;
-
- int match_length = ctx->min_match_length;
-
- *slot_arrays = (packed_slot_array*)calloc(numQueries, sizeof(packed_slot_array));
-
- for (int i = 0; i < numQueries; i++)
- {
- int qlen;
-
- if (i == numQueries - 1)
- qlen = ctx->queries->texlen - h_addrs_tex_array[i] - match_length;
- else
- qlen = h_addrs_tex_array[i + 1] - h_addrs_tex_array[i] - match_length;
-
- packed_slot* qslots = (packed_slot*)calloc(qlen, sizeof(packed_slot));
- int filled = 0;
- for (int p = 0; p < qlen; ++p)
- {
- MatchCoord* coords = results->h_match_coords;
-
- int query_coord_begin = match_coord_addrs(i, h_addrs_tex_array[i], match_length);
- int query_coord_end = i < numQueries - 1 ?
- match_coord_addrs(i + 1, h_addrs_tex_array[i + 1], match_length) : results->numCoords;
-
- int query_coord = query_coord_begin + p;
-
- if ((query_coord < query_coord_end) &&
- (coords[query_coord].node > 1) &&
- (!(coords[query_coord].edge_match_length & FRMASK) == !rc))
- {
- packed_slot s;
- s.page = page_num;
- s.qpos = p;
- s.coord = coords[query_coord];
- qslots[filled++] = s;
- }
- }
-
- if (filled)
- {
- packed_slot* pslots = (packed_slot*)calloc(filled, sizeof(packed_slot));
- memcpy(pslots, qslots, (filled)*sizeof(packed_slot));
-
- (*slot_arrays)[i].slots = pslots;
- (*slot_arrays)[i].num_slots = filled;
- }
- else
- {
- (*slot_arrays)[i].slots = NULL;
- (*slot_arrays)[i].num_slots = 0;
- }
-
- free(qslots);
- }
-}
-
-int getQueryBlock(MatchContext* ctx, size_t device_mem_avail)
-{
- QuerySet* queries = ctx->queries;
- char * queryTex = NULL;
- int* queryAddrs = NULL;
- int* queryLengths = NULL;
- unsigned int numQueries;
- size_t queryLen;
- char** names;
-
- unsigned int queryreadtimer = 0;
- createTimer(&queryreadtimer);
- startTimer(queryreadtimer);
-
- getQueriesTexture(queries->qfile,
- &queryTex,
- &queryLen,
- &queryAddrs,
- &names,
- &queryLengths,
- &numQueries,
- device_mem_avail,
- ctx->min_match_length,
- ctx->reverse || ctx->forwardreverse);
-
- stopTimer(queryreadtimer);
- ctx->statistics.t_query_read += getTimerValue(queryreadtimer);
- deleteTimer(queryreadtimer);
-
- queries->h_tex_array = queryTex;
- queries->count = numQueries;
- queries->h_addrs_tex_array = queryAddrs;
- queries->texlen = queryLen;
- queries->h_names = names;
- queries->h_lengths_array = queryLengths;
-
- return numQueries;
-}
-
-
-void destroyQueryBlock(QuerySet* queries)
-{
- free(queries->h_tex_array);
- queries->h_tex_array = NULL;
-
- for (int i = 0; i < queries->count; ++i)
- free(queries->h_names[i]);
-
- free(queries->h_names);
-
- queries->count = 0;
- queries->texlen = 0;
-
- free(queries->h_addrs_tex_array);
- queries->h_addrs_tex_array = NULL;
-
- free(queries->h_lengths_array);
- queries->h_lengths_array = NULL;
-}
-
-
-void writeStatisticsFile(MatchContext* ctx, char* stats_filename)
-{
- if (!stats_filename)
- return;
-
- FILE* f = fopen(stats_filename, "w");
-
- if (!f)
- {
- fprintf(stderr, "WARNING: could not open %s for writing\n", stats_filename);
- return;
- }
-
- fprintf(f, "Total,%f\n", ctx->statistics.t_total);
- fprintf(f, "Kernel,%f\n", ctx->statistics.t_kernel);
- fprintf(f, "Print matches,%f\n", ctx->statistics.t_output);
- fprintf(f, "Copy queries to GPU,%f\n", ctx->statistics.t_to_board);
- fprintf(f, "Copy output from GPU,%f\n", ctx->statistics.t_from_board);
- fprintf(f, "Copy suffix tree to GPU,%f\n", ctx->statistics.t_moving_tree_pages);
- fprintf(f, "Read queries from disk,%f\n", ctx->statistics.t_query_read);
- fprintf(f, "Suffix tree constructions,%f\n", ctx->statistics.t_construction);
-
- fprintf(f, "Minimum substring length, %d\n", ctx->min_match_length);
- fprintf(f, "Average query length, %f\n", ctx->statistics.bp_avg_query_length);
- fclose(f);
-}
-
-int matchSubset(MatchContext* ctx,
- int query_block_offset,
- ReferencePage pages[],
- unsigned int num_pages)
-{
-
- loadQueries(ctx);
- packed_slot_array* packed_slots = NULL;
- for (unsigned int i = 0; i < num_pages; ++i)
- {
- ctx->ref = &(pages[i].ref);
- loadReference(ctx);
- loadResultBuffer(ctx);
-
- unsigned int ktimer = 0;
- createTimer(&ktimer);
-
- unsigned int numQueries = ctx->queries->count;
- int blocksize = (numQueries > BLOCKSIZE) ? BLOCKSIZE : numQueries;
-
- dim3 dimBlock(blocksize,1,1);
- dim3 dimGrid(ceil(numQueries/(float)BLOCKSIZE), 1, 1);
-
- if (!ctx->on_cpu)
- {
- fprintf(stderr,"Using blocks of %d x %d x %d threads\n",
- dimBlock.x, dimBlock.y, dimBlock.z);
- fprintf(stderr,"Using a grid of %d x %d x %d blocks\n",
- dimGrid.x, dimGrid.y, dimBlock.z);
- fprintf(stderr,"Memory footprint is:\n\tqueries: %d\n\tref: %d\n\tresults: %d\n",
- ctx->queries->bytes_on_board,
- ctx->ref->bytes_on_board,
- ctx->results.bytes_on_board);
- }
-
- startTimer(ktimer);
-
- bool alignRC = ctx->reverse;
-
- if (ctx->on_cpu)
- {
- if (alignRC)
- {
- computeGold(&ctx->results,
- ctx->ref->str,
- ctx->queries->h_tex_array,
- ctx->queries->h_addrs_tex_array,
- ctx->queries->h_lengths_array,
- (PixelOfNode*)(ctx->ref->h_node_tex_array),
- (PixelOfChildren*)(ctx->ref->h_children_tex_array),
- ctx->queries->count,
- ctx->min_match_length,
- REVERSE);
- }
- else
- {
- computeGold(&ctx->results,
- ctx->ref->str,
- ctx->queries->h_tex_array,
- ctx->queries->h_addrs_tex_array,
- ctx->queries->h_lengths_array,
- (PixelOfNode*)(ctx->ref->h_node_tex_array),
- (PixelOfChildren*)(ctx->ref->h_children_tex_array),
- ctx->queries->count,
- ctx->min_match_length,
- FORWARD);
- }
- }
- else
- {
-
- if (alignRC)
- {
- mummergpuRCKernel<<< dimGrid, dimBlock, 0 >>>(ctx->results.d_match_coords,
- ctx->queries->d_tex_array,
- ctx->queries->d_addrs_tex_array,
- ctx->queries->d_lengths_array,
- numQueries,
- ctx->min_match_length);
- }
- else
- {
- mummergpuKernel<<< dimGrid, dimBlock, 0 >>>(ctx->results.d_match_coords,
- ctx->queries->d_tex_array,
- ctx->queries->d_addrs_tex_array,
- ctx->queries->d_lengths_array,
- numQueries,
- ctx->min_match_length);
- }
-
- }
-
- cudaThreadSynchronize();
-
- // check if kernel execution generated an error
- cudaError_t err = cudaGetLastError();
- if( cudaSuccess != err)
- {
- fprintf(stderr, "Kernel execution failed: %s.\n",
- cudaGetErrorString(err));
- exit(EXIT_FAILURE);
- }
-
- stopTimer(ktimer);
-
- float ktime = getTimerValue(ktimer);
- ctx->statistics.t_kernel += ktime;
- fprintf(stderr,"kernel time= %f\n", ktime);
- deleteTimer(ktimer);
-
- transferResultsFromDevice(ctx);
- pages[i].results = ctx->results;
-
- packed_slot_array* packed;
- packSlots(ctx, &(pages[i].results), i, &packed, ctx->reverse);
- addPackedOutput(ctx, &packed_slots, packed);
-
- // now compute the reverse matches.
- if (ctx->forwardreverse)
- {
- unsigned int rctimer = 0;
- createTimer(&rctimer);
- startTimer(rctimer);
-
- if (ctx->on_cpu)
- {
- computeGold(&ctx->results,
- ctx->ref->str,
- ctx->queries->h_tex_array,
- ctx->queries->h_addrs_tex_array,
- ctx->queries->h_lengths_array,
- (PixelOfNode*)(ctx->ref->h_node_tex_array),
- (PixelOfChildren*)(ctx->ref->h_children_tex_array),
- ctx->queries->count,
- ctx->min_match_length,
- REVERSE);
- }
- else
- {
-
- mummergpuRCKernel<<< dimGrid, dimBlock, 0 >>>(ctx->results.d_match_coords,
- ctx->queries->d_tex_array,
- ctx->queries->d_addrs_tex_array,
- ctx->queries->d_lengths_array,
- numQueries,
- ctx->min_match_length);
- cudaThreadSynchronize();
- }
-
- stopTimer(rctimer);
-
- float rctime = getTimerValue(rctimer);
- ctx->statistics.t_kernel += rctime;
- fprintf(stderr,"rc kernel time= %f\n", rctime);
- deleteTimer(rctimer);
-
- transferResultsFromDevice(ctx);
- pages[i].results = ctx->results;
-
- packed_slot_array* packed;
- packSlots(ctx, &(pages[i].results), i, &packed, 1);
- addPackedOutput(ctx, &packed_slots, packed);
- }
-
- free(pages[i].results.h_match_coords);
- pages[i].results.h_match_coords = NULL;
-
- unloadReference(ctx);
- unloadResultBuffer(ctx);
- }
-
-
- unsigned int otimer = 0;
- createTimer(&otimer);
- startTimer(otimer);
-
- printPackedResults(ctx, pages, packed_slots);
-
- stopTimer(otimer);
- ctx->statistics.t_output += getTimerValue(otimer);
- deleteTimer(otimer);
-
- for (int i = 0; i < ctx->queries->count; ++i)
- {
- free(packed_slots[i].slots);
- }
- free(packed_slots);
-
- unloadQueries(ctx);
- return 0;
-}
-
-#define BREATHING_ROOM (64 * 1024 * 1024)
-#define BASES_PER_TREE_PAGE 7500000
-#define CHUMP_CHANGE 1500000
-
-extern "C"
-int matchQueries(MatchContext* ctx)
-{
- assert(sizeof(struct PixelOfNode) == sizeof(ulong4));
- assert(sizeof(struct PixelOfChildren) == sizeof(ulong4));
-
- ctx->statistics.t_kernel = 0.0;
- ctx->statistics.t_output = 0.0;
- ctx->statistics.t_to_board = 0.0;
- ctx->statistics.t_from_board = 0.0;
- ctx->statistics.t_moving_tree_pages = 0.0;
- ctx->statistics.t_query_read = 0.0;
- ctx->statistics.t_total = 0.0;
- ctx->statistics.t_construction = 0.0;
- ctx->statistics.bp_avg_query_length = 0.0;
-
- unsigned int ttimer = 0;
- createTimer(&ttimer);
- startTimer(ttimer);
-
- unsigned int ctimer = 0;
- createTimer(&ctimer);
- startTimer(ctimer);
-
-
- unsigned int bases_in_ref = ctx->full_ref_len - 3;
-
- unsigned int page_size = BASES_PER_TREE_PAGE < bases_in_ref ? BASES_PER_TREE_PAGE : bases_in_ref;
- unsigned int num_reference_pages = bases_in_ref / page_size;
-
- ReferencePage* pages = (ReferencePage*)calloc(num_reference_pages, sizeof(ReferencePage));
-
- unsigned int page_overlap = MAX_QUERY_LEN + 1;
-
-
- pages[0].begin = 1;
- pages[0].end = pages[0].begin +
- page_size +
- ceil(page_overlap / 2.0) + 1; //the 1 is for the 's' at the beginning
- pages[0].shadow_left = -1;
- pages[0].id = 0;
-
- buildReferenceTexture(&(pages[0].ref), ctx->full_ref, pages[0].begin, pages[0].end);
-
- for (int i = 1; i < num_reference_pages - 1; ++i)
- {
- pages[i].begin = pages[i - 1].end - page_overlap;
- pages[i].end = pages[i].begin + page_size + page_overlap;
-
- pages[i - 1].shadow_right = pages[i].begin;
- pages[i].shadow_left = pages[i-1].end;
- pages[i].id = i;
- buildReferenceTexture(&(pages[i].ref), ctx->full_ref, pages[i].begin, pages[i].end);
- }
-
- if (num_reference_pages > 1)
- {
- int last_page = num_reference_pages - 1;
- pages[last_page].begin = pages[last_page - 1].end - page_overlap;
- pages[last_page].end = ctx->full_ref_len - 1;
- pages[last_page - 1].shadow_right = pages[last_page].begin;
- pages[last_page].shadow_right = -1;
- pages[last_page].shadow_left = pages[last_page - 1].end;
- pages[last_page].id = last_page;
- buildReferenceTexture(&(pages[last_page].ref),
- ctx->full_ref,
- pages[last_page].begin,
- pages[last_page].end);
- }
-
- stopTimer(ctimer);
- ctx->statistics.t_construction += getTimerValue(ctimer);
- deleteTimer(ctimer);
-
- cudaDeviceProp props;
- if (!ctx->on_cpu)
- {
- int deviceCount = 0;
- cudaGetDeviceCount(&deviceCount);
-
- if (deviceCount != 1)
- {
- //fprintf(stderr, "Fatal error: no CUDA-capable device found, exiting\n");
- //return -1;
- }
-
- cudaGetDeviceProperties(&props, 0);
- fprintf(stderr, "Running under CUDA %d.%d\n", props.major, props.minor);
- fprintf(stderr, "CUDA device has %d bytes of memory\n", props.totalGlobalMem);
- }
- else
- {
- props.totalGlobalMem = 804585472; // pretend we are on a 8800 GTX
- }
-
- size_t mem_avail = 0;
- for (int i = 0; i < num_reference_pages; ++i)
- {
- mem_avail = max((unsigned int)pages[i].ref.bytes_on_board,
- (unsigned int)mem_avail);
- }
-
- mem_avail = props.totalGlobalMem - mem_avail;
-
- fprintf(stderr, "There are %d bytes left on the board\n", mem_avail);
-
- mem_avail -= BREATHING_ROOM;
-
- while (getQueryBlock(ctx, mem_avail))
- {
- matchSubset(ctx, 0, pages, num_reference_pages);
- ctx->statistics.bp_avg_query_length = ctx->queries->texlen/(float)(ctx->queries->count) - 2;
- destroyQueryBlock(ctx->queries);
- cudaThreadExit();
- }
-
- for (int i = 0; i < num_reference_pages; ++i)
- {
- destroyReference(&(pages[i].ref));
- }
- free(pages);
-
- stopTimer(ttimer);
- ctx->statistics.t_total += getTimerValue(ttimer);
- deleteTimer(ttimer);
-
- writeStatisticsFile(ctx, ctx->stats_file);
-
- return 0;
-}
-