Ignore:
Timestamp:
Mar 10, 2016, 2:38:50 PM (3 years ago)
Author:
lindanl
Message:

Multiple input files can run on separate threads.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/icgrep.cpp

    r4963 r4967  
    2626
    2727#include <boost/uuid/sha1.hpp>
     28#include <toolchain.h>
     29#include <atomic>
    2830
    2931static cl::OptionCategory aRegexSourceOptions("Regular Expression Options",
     
    4951static cl::opt<std::string> RegexFilename("f", cl::desc("Take regular expressions (one per line) from a file"), cl::value_desc("regex file"), cl::init(""), cl::cat(aRegexSourceOptions));
    5052static cl::opt<std::string> IRFileName("precompiled", cl::desc("Use precompiled regular expression"), cl::value_desc("LLVM IR file"), cl::init(""), cl::cat(aRegexSourceOptions));
     53
     54static cl::opt<int> Threads("t", cl::desc("Total number of threads."), cl::init(1));
    5155
    5256
     
    110114}
    111115
     116GrepEngine grepEngine;
     117std::atomic<int> fileCount;
     118
     119void *DoGrep(void *threadid)
     120{
     121    long tid;
     122    tid = (long)threadid;
     123    if (tid+1 < inputFiles.size())
     124        grepEngine.doGrep(inputFiles[tid+1]);
     125
     126    pthread_exit(NULL);
     127}
    112128
    113129int main(int argc, char *argv[]) {
     
    143159    std::string module_name = "grepcode:" + sha1sum(allREs) + ":" + std::to_string(globalFlags);
    144160   
    145     GrepEngine grepEngine;
    146161    grepEngine.grepCodeGen(module_name, re_ast);
    147    
    148     for (unsigned i = firstInputFile; i != inputFiles.size(); ++i) {
    149         if (grepEngine.openMMap(inputFiles[i])) {
    150             grepEngine.doGrep();
    151             grepEngine.closeMMap();
     162
     163
     164    initResult(inputFiles, inputFiles.size());
     165
     166    if(Threads == 1){
     167        for (unsigned i = firstInputFile; i != inputFiles.size(); ++i) {
     168            grepEngine.doGrep(inputFiles[i]);
     169        }       
     170    }
     171    else if (Threads > 1) {
     172
     173        pthread_t threads[100];
     174        int rc;
     175        long t;
     176        void *status;
     177
     178        for(t=0; t<Threads; t++){
     179          rc = pthread_create(&threads[t], NULL, DoGrep, (void *)t);
     180          if (rc){
     181             printf("ERROR; return code from pthread_create() is %d\n", rc);
     182             exit(-1);
     183          }
    152184        }
    153     }
     185
     186        for(t=0; t<Threads; t++) {
     187            rc = pthread_join(threads[t], &status);
     188            if (rc) {
     189                printf("ERROR; return code from pthread_join() is %d\n", rc);
     190                exit(-1);
     191            }
     192        }
     193    }
     194    else {
     195        std::cerr << "Invalid number of threads :" << Threads << std::endl;
     196    }
     197
     198    PrintResult();   
    154199   
    155200    return 0;
Note: See TracChangeset for help on using the changeset viewer.