nanojpeg: load existing results before starting campaign

git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1823 8c4709b5-6ec9-48aa-a5cd-a96041d1645a
This commit is contained in:
hsc
2012-10-24 22:35:46 +00:00
parent 4fb768972b
commit bd3bef1f72
2 changed files with 44 additions and 22 deletions

View File

@ -69,13 +69,6 @@ bool NanoJPEGCampaign::run()
}
ProtoIStream ps(&tracef);
// experiment count
int count_exp = 0;
int count_exp_jobs = 0;
// known output count
int count_known = 0;
int count_known_jobs = 0;
// instruction counter within trace
unsigned instr = 0;
@ -151,7 +144,6 @@ bool NanoJPEGCampaign::run()
// new EC with experiments: acc->first -- instr, common_mask
// if (reg != RID_EBP && reg != RID_ESI && reg != RID_EDI) {
count_exp += add_experiment_ec(acc->first, instr, ev.ip(), reg, common_mask);
count_exp_jobs++;
// }
// new memory access EC in access cascade
@ -196,7 +188,6 @@ bool NanoJPEGCampaign::run()
// new EC with known result: acc->first -- instr, common_mask
// if (reg != RID_EBP && reg != RID_ESI && reg != RID_EDI) {
count_known += add_known_ec(acc->first, instr, ev.ip(), reg, common_mask);
count_known_jobs++;
// }
}
@ -216,6 +207,7 @@ bool NanoJPEGCampaign::run()
}
}
campaignmanager.noMoreParameters();
available_results.clear();
cout << "experiments planned: " << dec << count_exp
<< " (" << count_exp_jobs << " jobs)" << endl;
cout << "known outcome ECs: " << dec << count_known
@ -278,7 +270,12 @@ int NanoJPEGCampaign::add_experiment_ec(unsigned instr_ecstart, unsigned instr_o
c += v & 1;
}
// TODO check result CSV if we already know the answer
bitmask = check_available(instr_offset, register_id, bitmask);
if (!bitmask) {
return 0;
}
count_exp_jobs++;
// enqueue job
NanoJPEGExperimentData *d = new NanoJPEGExperimentData;
@ -303,7 +300,12 @@ int NanoJPEGCampaign::add_known_ec(unsigned instr_ecstart, unsigned instr_offset
c += v & 1;
}
// TODO check result CSV if we already stored the answer
bitmask = check_available(instr_offset, register_id, bitmask);
if (!bitmask) {
return 0;
}
count_known_jobs++;
add_result(instr_ecstart, instr_offset, instr_address, register_id, 0, 0,
bitmask, NanoJPEGProtoMsg_Result::FINISHED, 0, INFINITY, "");
@ -314,31 +316,32 @@ bool NanoJPEGCampaign::init_results()
{
// read already existing results
bool file_exists = false;
/*
set<uint64_t> existing_results;
ifstream oldresults(results_filename, ios::in);
ifstream oldresults(NANOJPEG_RESULTS, ios::in);
if (oldresults.is_open()) {
char buf[16*1024];
uint64_t addr;
unsigned ignore;
unsigned instr_offset;
int register_id;
uint64_t bitmask;
int count = 0;
m_log << "scanning existing results ..." << endl;
file_exists = true;
while (oldresults.getline(buf, sizeof(buf)).good()) {
stringstream ss;
ss << buf;
ss >> addr;
ss >> hex >> ignore >> instr_offset >> ignore >> register_id >> ignore
>> ignore >> bitmask;
if (ss.fail()) {
continue;
}
++count;
if (!existing_results.insert(addr).second) {
m_log << "duplicate: " << addr << endl;
}
available_results
[std::pair<unsigned, int>(instr_offset, register_id)]
|= bitmask;
}
m_log << "found " << dec << count << " existing results" << endl;
m_log << "found " << dec << count << " existing result rows" << endl;
oldresults.close();
}
*/
// non-destructive: due to the CSV header we can always manually recover
// from an accident (append mode)
@ -354,6 +357,17 @@ bool NanoJPEGCampaign::init_results()
return true;
}
uint64_t NanoJPEGCampaign::check_available(unsigned instr_offset,
fail::GPRegisterId register_id, uint64_t bitmask)
{
std::map<std::pair<unsigned, int>, uint64_t>::iterator it;
it = available_results.find(std::pair<unsigned, int>(instr_offset, (int)register_id));
if (it == available_results.end()) {
return bitmask;
}
return bitmask & ~it->second;
}
void NanoJPEGCampaign::add_result(unsigned instr_ecstart,
unsigned instr_offset, uint32_t instr_address, fail::GPRegisterId register_id,
unsigned timeout, uint32_t injection_ip, uint64_t bitmask, int resulttype,

View File

@ -2,6 +2,8 @@
#define __NANOJPEG_CAMPAIGN_HPP__
#include <fstream>
#include <map>
#include <utility>
#include "cpn/Campaign.hpp"
#include "comm/ExperimentData.hpp"
@ -17,6 +19,8 @@ public:
class NanoJPEGCampaign : public fail::Campaign {
fail::Logger m_log;
int count_exp, count_exp_jobs;
int count_known, count_known_jobs;
int add_experiment_ec(unsigned instr_ecstart, unsigned instr_offset,
unsigned instr_address, fail::GPRegisterId register_id, uint64_t bitmask);
int add_known_ec(unsigned instr_ecstart, unsigned instr_offset,
@ -27,9 +31,13 @@ class NanoJPEGCampaign : public fail::Campaign {
unsigned timeout, uint32_t injection_ip, uint64_t bitmask,
int resulttype, uint32_t latest_ip, float psnr, char const *details);
void finalize_results();
uint64_t check_available(unsigned instr_offset,
fail::GPRegisterId register_id, uint64_t bitmask);
std::ofstream resultstream;
std::map<std::pair<unsigned, int>, uint64_t> available_results;
public:
NanoJPEGCampaign() : m_log("nJPEG Campaign") {}
NanoJPEGCampaign() : m_log("nJPEG Campaign"),
count_exp(0), count_exp_jobs(0), count_known(0), count_known_jobs(0) {}
virtual bool run();
};