/** * Distribute the tunecache from node 0 to all other nodes. */ static void broadcastTuneCache() { #ifdef MULTI_GPU std::stringstream serialized; size_t size; if (comm_rank() == 0) { serializeTuneCache(serialized); size = serialized.str().length(); } comm_broadcast(&size, sizeof(size_t)); if (size > 0) { if (comm_rank() == 0) { comm_broadcast(const_cast<char *>(serialized.str().c_str()), size); } else { char *serstr = new char[size+1]; comm_broadcast(serstr, size); serstr[size] ='\0'; // null-terminate serialized.str(serstr); deserializeTuneCache(serialized); delete[] serstr; } } #endif }
/* * Read tunecache from disk. */ void loadTuneCache(QudaVerbosity verbosity) { char *path; struct stat pstat; std::string cache_path, line, token; std::ifstream cache_file; std::stringstream ls; path = getenv("QUDA_RESOURCE_PATH"); if (!path) { warningQuda("Environment variable QUDA_RESOURCE_PATH is not set."); warningQuda("Caching of tuned parameters will be disabled."); return; } else if (stat(path, &pstat) || !S_ISDIR(pstat.st_mode)) { warningQuda("The path \"%s\" specified by QUDA_RESOURCE_PATH does not exist or is not a directory.", path); warningQuda("Caching of tuned parameters will be disabled."); return; } else { resource_path = path; } #ifdef MULTI_GPU if (comm_rank() == 0) { #endif cache_path = resource_path; cache_path += "/tunecache.tsv"; cache_file.open(cache_path.c_str()); if (cache_file) { if (!cache_file.good()) errorQuda("Bad format in %s", cache_path.c_str()); getline(cache_file, line); ls.str(line); ls >> token; if (token.compare("tunecache")) errorQuda("Bad format in %s", cache_path.c_str()); ls >> token; if (token.compare(quda_version)) errorQuda("Cache file %s does not match current QUDA version", cache_path.c_str()); ls >> token; if (token.compare(quda_hash)) warningQuda("Cache file %s does not match current QUDA build", cache_path.c_str()); if (!cache_file.good()) errorQuda("Bad format in %s", cache_path.c_str()); getline(cache_file, line); // eat the blank line if (!cache_file.good()) errorQuda("Bad format in %s", cache_path.c_str()); getline(cache_file, line); // eat the description line deserializeTuneCache(cache_file); cache_file.close(); initial_cache_size = tunecache.size(); if (verbosity >= QUDA_SUMMARIZE) { printfQuda("Loaded %d sets of cached parameters from %s\n", static_cast<int>(initial_cache_size), cache_path.c_str()); } } else {