Skip to content

Commit 9d1f749

Browse files
Merge pull request #997 from ChunShow/tmp
Update setupKmerSplits to avoid redundant writes in fillKmerPositionA…
2 parents e452151 + 48ab43c commit 9d1f749

File tree

1 file changed

+22
-19
lines changed

1 file changed

+22
-19
lines changed

src/linclust/kmermatcher.cpp

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -222,27 +222,29 @@ std::pair<size_t, size_t> fillKmerPositionArray(KmerPosition<T> * kmerArray, siz
222222

223223
// add k-mer to represent the identity
224224
if (static_cast<unsigned short>(seqHash) >= hashStartRange && static_cast<unsigned short>(seqHash) <= hashEndRange) {
225-
threadKmerBuffer[bufferPos].kmer = seqHash;
226-
threadKmerBuffer[bufferPos].id = seqId;
227-
threadKmerBuffer[bufferPos].pos = 0;
228-
threadKmerBuffer[bufferPos].seqLen = seq.L;
229225
if(hashDistribution != NULL){
230226
__sync_fetch_and_add(&hashDistribution[static_cast<unsigned short>(seqHash)], 1);
231227
}
232-
bufferPos++;
233-
if (bufferPos >= BUFFER_SIZE) {
234-
size_t writeOffset = __sync_fetch_and_add(&offset, bufferPos);
235-
if(writeOffset + bufferPos < kmerArraySize){
236-
if(kmerArray!=NULL){
237-
memcpy(kmerArray + writeOffset, threadKmerBuffer, sizeof(KmerPosition<T>) * bufferPos);
228+
else{
229+
threadKmerBuffer[bufferPos].kmer = seqHash;
230+
threadKmerBuffer[bufferPos].id = seqId;
231+
threadKmerBuffer[bufferPos].pos = 0;
232+
threadKmerBuffer[bufferPos].seqLen = seq.L;
233+
bufferPos++;
234+
if (bufferPos >= BUFFER_SIZE) {
235+
size_t writeOffset = __sync_fetch_and_add(&offset, bufferPos);
236+
if(writeOffset + bufferPos < kmerArraySize){
237+
if(kmerArray!=NULL){
238+
memcpy(kmerArray + writeOffset, threadKmerBuffer, sizeof(KmerPosition<T>) * bufferPos);
239+
}
240+
} else{
241+
Debug(Debug::ERROR) << "Kmer array overflow. currKmerArrayOffset="<< writeOffset
242+
<< ", kmerBufferPos=" << bufferPos
243+
<< ", kmerArraySize=" << kmerArraySize <<".\n";
244+
EXIT(EXIT_FAILURE);
238245
}
239-
} else{
240-
Debug(Debug::ERROR) << "Kmer array overflow. currKmerArrayOffset="<< writeOffset
241-
<< ", kmerBufferPos=" << bufferPos
242-
<< ", kmerArraySize=" << kmerArraySize <<".\n";
243-
EXIT(EXIT_FAILURE);
246+
bufferPos = 0;
244247
}
245-
bufferPos = 0;
246248
}
247249
}
248250

@@ -299,14 +301,15 @@ std::pair<size_t, size_t> fillKmerPositionArray(KmerPosition<T> * kmerArray, siz
299301
// tmpKmerIdx=BIT_CLEAR(tmpKmerIdx, 63);
300302
// std::cout << seqId << "\t" << (kmers + kmerIdx)->score << "\t" << tmpKmerIdx << std::endl;
301303
// }
304+
if(hashDistribution != NULL){
305+
__sync_fetch_and_add(&hashDistribution[(kmers + kmerIdx)->score], 1);
306+
continue;
307+
}
302308
threadKmerBuffer[bufferPos].kmer = (kmers + kmerIdx)->kmer;
303309
threadKmerBuffer[bufferPos].id = seqId;
304310
threadKmerBuffer[bufferPos].pos = (kmers + kmerIdx)->pos;
305311
threadKmerBuffer[bufferPos].seqLen = seq.L;
306312
bufferPos++;
307-
if(hashDistribution != NULL){
308-
__sync_fetch_and_add(&hashDistribution[(kmers + kmerIdx)->score], 1);
309-
}
310313

311314
if (bufferPos >= BUFFER_SIZE) {
312315
size_t writeOffset = __sync_fetch_and_add(&offset, bufferPos);

0 commit comments

Comments
 (0)