diff --git a/include/raptor/search/fpga/min_ibf_fpga_oneapi.hpp b/include/raptor/search/fpga/min_ibf_fpga_oneapi.hpp index 1d7a46d9..9b073b9e 100644 --- a/include/raptor/search/fpga/min_ibf_fpga_oneapi.hpp +++ b/include/raptor/search/fpga/min_ibf_fpga_oneapi.hpp @@ -80,8 +80,8 @@ class min_ibf_fpga_oneapi size_t numberOfQueries; std::vector ids; - unique_utilities_ptr queries_host; // size: currentBufferSize - unique_utilities_ptr querySizes_host; // size: numberOfQueries + unique_utilities_ptr queries_host; + unique_utilities_ptr querySizes_host; unique_utilities_ptr results_host; std::vector kernelEvents; @@ -240,12 +240,14 @@ class min_ibf_fpga_oneapi std::ofstream outputStream(output_path, std::ios::app); std::string result_string{}; + size_t const max_numberOfQueries = bufferSizeBytes / MIN_QUERY_LENGTH; + size_t const chunks_per_result = technical_bins / chunk_bits; + for (buffer_data & state : double_buffer) { - // TODO bufferSizeBytes is a way too high upper bound state.queries_host = malloc_host_utilities(bufferSizeBytes); - state.querySizes_host = malloc_host_utilities(bufferSizeBytes); - state.results_host = malloc_host_utilities(bufferSizeBytes); + state.querySizes_host = malloc_host_utilities(max_numberOfQueries); + state.results_host = malloc_host_utilities(max_numberOfQueries * chunks_per_result); state.kernelEvents.reserve(numberOfKernelCopys * 2 + 2); // +2: Distributor, Collector state.numberOfQueries = 0; @@ -308,21 +310,20 @@ class min_ibf_fpga_oneapi result_string.clear(); - size_t const elements_per_query = technical_bins / 64; - size_t const chunks_per_query = seqan::hibf::divide_and_ceil(technical_bins, chunk_bits); + size_t const elements_per_result = technical_bins / 64; size_t const elements_per_chunk = chunk_bits / 64; - if (elements_per_chunk * chunks_per_query != elements_per_query) - throw std::runtime_error("outputResults: elements_per_query/chunks_per_query mismatch"); + if (elements_per_chunk * chunks_per_result != elements_per_result) + throw std::runtime_error("outputResults: elements_per_result/chunks_per_result mismatch"); for (size_t queryIndex = 0; queryIndex < state.ids.size(); queryIndex++) { // TODO: Use string view? result_string += state.ids.at(queryIndex).substr(1, std::string::npos) + '\t'; - for (size_t chunkOffset = 0; chunkOffset < chunks_per_query; ++chunkOffset) + for (size_t chunkOffset = 0; chunkOffset < chunks_per_result; ++chunkOffset) { - Chunk & chunk = state.results_host.get()[queryIndex * chunks_per_query + chunkOffset]; + Chunk & chunk = state.results_host.get()[queryIndex * chunks_per_result + chunkOffset]; for (size_t elementOffset = 0; elementOffset < elements_per_chunk; ++elementOffset) { diff --git a/src/argument_parsing/search_parsing.cpp b/src/argument_parsing/search_parsing.cpp index d1be0257..a41c193a 100644 --- a/src/argument_parsing/search_parsing.cpp +++ b/src/argument_parsing/search_parsing.cpp @@ -53,7 +53,7 @@ void fpga_check_kernel(search_arguments const & arguments) # undef RAPTOR_TOSTRING } -void fpga_checks(search_arguments const & arguments, size_t const max_query_length) +void fpga_checks(search_arguments const & arguments, size_t const max_query_length, size_t const min_query_length) { if (!arguments.use_fpga) return; @@ -76,6 +76,9 @@ void fpga_checks(search_arguments const & arguments, size_t const max_query_leng if (max_query_length > 250u) throw sharg::parser_error{"The query length is too long. The maximum is 250."}; + if (min_query_length < 50u) + throw sharg::parser_error{"The query length is too short. The minimum is 50."}; + fpga_check_kernel(arguments); } @@ -319,7 +322,7 @@ void search_parsing(sharg::parser & parser) } #if RAPTOR_FPGA - fpga_checks(arguments, max_query_length); + fpga_checks(arguments, max_query_length, min_query_length); #endif // ==========================================