Exemplo n.º 1
0
Arquivo: scan.cpp Projeto: nchong/scan
void Scan::scan(int *data, int n) {
  int k = (int) ceil((float)n/(float)m);
  cl_mem d_data = clw.dev_malloc(sizeof(int)*k*m);
  m0 += clw.memcpy_to_dev(d_data, sizeof(int)*n, data);
  recursive_scan(d_data, n);
  m1 += clw.memcpy_from_dev(d_data, sizeof(int)*n, data);
  clw.dev_free(d_data);
}
Exemplo n.º 2
0
Arquivo: scan.cpp Projeto: nchong/scan
void Scan::scan(cl_mem data, int n) {
  int k = (int) ceil((float)n/(float)m);
  cl_mem d_data = clw.dev_malloc(sizeof(int)*k*m);
  c0 += clw.copy_buffer(data, d_data, sizeof(int)*n);
  recursive_scan(d_data, n);
  c1 += clw.copy_buffer(d_data, data, sizeof(int)*n);
  clw.dev_free(d_data);
}
Exemplo n.º 3
0
Arquivo: scan.cpp Projeto: nchong/scan
void Scan::recursive_scan(cl_mem d_data, int n) {
  int k = (int) ceil((float)n/(float)m);
  //size of each subarray stored in local memory
  size_t bufsize = sizeof(int)*m;
  if (k == 1) {
    clw.kernel_arg(scan_pad_to_pow2,
      d_data, bufsize, n);
    k0 += clw.run_kernel_with_timing(scan_pad_to_pow2, /*dim=*/1, &wx, &wx);
  } else {
    size_t gx = k * wx;
    cl_mem d_partial = clw.dev_malloc(sizeof(int)*k);
    clw.kernel_arg(scan_subarrays,
      d_data, bufsize, d_partial, n);
    k1 += clw.run_kernel_with_timing(scan_subarrays, /*dim=*/1, &gx, &wx);
    recursive_scan(d_partial, k);
    clw.kernel_arg(scan_inc_subarrays,
      d_data, bufsize, d_partial, n);
    k2 += clw.run_kernel_with_timing(scan_inc_subarrays, /*dim=*/1, &gx, &wx);

    clw.dev_free(d_partial);
  }
}
Exemplo n.º 4
0
void file_finder::recursive_scan(file_filter::filter_result result, file_filter::filter_argument args, file_filter::filter_engine engine, boost::filesystem::path dir, bool recursive, int current_level) {
    if (!args->is_valid_level(current_level)) {
        if (args->debug) args->error->report_debug("Level deapth exausted: " + strEx::s::xtos(current_level));
        return;
    }
    WIN32_FIND_DATA wfd;

    DWORD fileAttr = GetFileAttributes(dir.wstring().c_str());
    if ((fileAttr == INVALID_FILE_ATTRIBUTES)&&(!recursive)) {
        args->error->report_error("Invalid file specified: " + dir.string());
    } else if (fileAttr == INVALID_FILE_ATTRIBUTES) {
        args->error->report_warning("Invalid file specified: " + dir.string());
    }
    if (args->debug) args->error->report_debug("Input is: " + dir.string() + " / " + strEx::s::xtos(fileAttr));

    if (!file_helpers::checks::is_directory(fileAttr)) {
        if (args->debug) args->error->report_debug("Found a file won't do recursive scan: " + dir.string());
        // It is a file check it an return (don't check recursively)
        file_helpers::patterns::pattern_type single_path = file_helpers::patterns::split_path_ex(dir.string());
        if (args->debug) args->error->report_debug("Path is: " + single_path.first.string());
        HANDLE hFind = FindFirstFile(dir.wstring().c_str(), &wfd);
        if (hFind != INVALID_HANDLE_VALUE) {
            boost::shared_ptr<file_filter::filter_obj> info = file_filter::filter_obj::get(args->now, wfd, single_path.first);
            if (engine)
                result->process(info, engine->match(info));
            else
                result->process(info, true);
            FindClose(hFind);
        } else {
            args->error->report_error("File was NOT found!");
        }
        return;
    }
    std::string file_pattern = dir.string() + "\\" + args->pattern;
    if (args->debug) args->error->report_debug("File pattern: " + file_pattern);
    HANDLE hFind = FindFirstFile(utf8::cvt<std::wstring>(file_pattern).c_str(), &wfd);
    if (hFind != INVALID_HANDLE_VALUE) {
        do {
            if (
                file_helpers::checks::is_directory(wfd.dwFileAttributes)
                && ( wcscmp(wfd.cFileName, _T(".")) != 0 || wcscmp(wfd.cFileName, _T("..")) != 0)
            )
                continue;
            boost::shared_ptr<file_filter::filter_obj> info = file_filter::filter_obj::get(args->now, wfd, dir);
            if (engine)
                result->process(info, engine->match(info));
            else
                result->process(info, true);
        } while (FindNextFile(hFind, &wfd));
        FindClose(hFind);
    }
    std::string dir_pattern = dir.string() + "\\*.*";
    if (args->debug) args->error->report_debug("File pattern: " + dir_pattern);
    hFind = FindFirstFile(utf8::cvt<std::wstring>(dir_pattern).c_str(), &wfd);
    if (hFind != INVALID_HANDLE_VALUE) {
        do {
            if (file_helpers::checks::is_directory(wfd.dwFileAttributes)) {
                if ( (wcscmp(wfd.cFileName, _T(".")) != 0) && (wcscmp(wfd.cFileName, _T("..")) != 0) )
                    recursive_scan(result, args, engine, dir / wfd.cFileName, true, current_level+1);
            }
        } while (FindNextFile(hFind, &wfd));
        FindClose(hFind);
    }
}