*** empty log message ***

svn path=/trunk/boinc/; revision=5503
This commit is contained in:
David Anderson 2005-02-23 06:19:20 +00:00
parent 3665aaae5a
commit d309b4d3e7
13 changed files with 189 additions and 39 deletions

View File

@ -25206,3 +25206,13 @@ David 22 Feb 2005
forum_post.php
forum_reply.php
sample_index.php
David 22 Feb 2005
- core client: scheduling: cap project debt at 1 day
client/
cs_apps.C
http.C
scheduler_op.C
sched/
sched_send.C

View File

@ -44,6 +44,8 @@
using std::vector;
#define MAX_DEBT (86400)
// maximum project debt
// Quit running applications, quit benchmarks,
// write the client_state.xml file
@ -462,6 +464,9 @@ bool CLIENT_STATE::schedule_cpus(double now) {
if (p->non_cpu_intensive) continue;
if (p->next_runnable_result) {
p->debt -= min_debt;
if (p->debt > MAX_DEBT) {
p->debt = MAX_DEBT;
}
p->anticipated_debt = p->debt;
//msg_printf(p, MSG_INFO, "debt %f", p->debt);
p->next_runnable_result = NULL;

View File

@ -56,17 +56,24 @@ using std::istringstream;
using std::vector;
using std::getline;
// Breaks a HTTP url down into its server and file path components
// Breaks a HTTP URL down into its server, port and file components
// format of url:
// [http://]host.dom.dom[:port][/dir/file]
//
void parse_url(const char* url, char* host, int &port, char* file) {
char* p;
char buf[256];
// strip off http:// if present
//
if (strncmp(url, "http://", 7) == 0) {
safe_strcpy(buf, url+7);
} else {
safe_strcpy(buf, url);
}
// parse and strip off file part if present
//
p = strchr(buf, '/');
if (p) {
strcpy(file, p+1);
@ -74,13 +81,19 @@ void parse_url(const char* url, char* host, int &port, char* file) {
} else {
strcpy(file, "");
}
p=strchr(buf,':');
// parse and strip off port if present
//
p = strchr(buf,':');
if (p) {
port = atol(p+1);
*p = 0;
} else {
port=80;
}
// what remains is the host
//
strcpy(host, buf);
}

View File

@ -660,7 +660,10 @@ int SCHEDULER_REPLY::parse(FILE* in, PROJECT* project) {
&code_sign_key
);
if (retval) {
msg_printf(project, MSG_ERROR, "SCHEDULER_REPLY.parse(): xml parsing error\n");
msg_printf(project, MSG_ERROR,
"Can't parse code sign key in scheduler reply: %d",
retval
);
return ERR_XML_PARSE;
}
} else if (match_tag(buf, "<code_sign_key_signature>")) {
@ -674,7 +677,9 @@ int SCHEDULER_REPLY::parse(FILE* in, PROJECT* project) {
APP app;
retval = app.parse(mf);
if (retval) {
msg_printf(project, MSG_ERROR, "Can't parse app in scheduler reply");
msg_printf(project, MSG_ERROR,
"Can't parse app in scheduler reply: %d", retval
);
} else {
apps.push_back(app);
}
@ -682,7 +687,9 @@ int SCHEDULER_REPLY::parse(FILE* in, PROJECT* project) {
FILE_INFO file_info;
retval = file_info.parse(mf, true);
if (retval) {
msg_printf(project, MSG_ERROR, "Can't parse file info in scheduler reply");
msg_printf(project, MSG_ERROR,
"Can't parse file info in scheduler reply: %d", retval
);
} else {
file_infos.push_back(file_info);
}
@ -690,7 +697,9 @@ int SCHEDULER_REPLY::parse(FILE* in, PROJECT* project) {
APP_VERSION av;
retval = av.parse(mf);
if (retval) {
msg_printf(project, MSG_ERROR, "Can't parse app version in scheduler reply");
msg_printf(project, MSG_ERROR,
"Can't parse app version in scheduler reply: %d", retval
);
} else {
app_versions.push_back(av);
}
@ -698,7 +707,9 @@ int SCHEDULER_REPLY::parse(FILE* in, PROJECT* project) {
WORKUNIT wu;
retval = wu.parse(mf);
if (retval) {
msg_printf(project, MSG_ERROR, "Can't parse work unit in scheduler reply");
msg_printf(project, MSG_ERROR,
"Can't parse work unit in scheduler reply: %d", retval
);
} else {
workunits.push_back(wu);
}
@ -707,7 +718,9 @@ int SCHEDULER_REPLY::parse(FILE* in, PROJECT* project) {
// gets called each time
retval = result.parse_server(mf);
if (retval) {
msg_printf(project, MSG_ERROR, "Can't parse result in scheduler reply");
msg_printf(project, MSG_ERROR,
"Can't parse result in scheduler reply: %d", retval
);
} else {
results.push_back(result);
}
@ -715,7 +728,9 @@ int SCHEDULER_REPLY::parse(FILE* in, PROJECT* project) {
RESULT result;
retval = result.parse_ack(in);
if (retval) {
msg_printf(project, MSG_ERROR, "Can't parse result ack in scheduler reply");
msg_printf(project, MSG_ERROR,
"Can't parse result ack in scheduler reply: %d", retval
);
} else {
result_acks.push_back(result);
}
@ -739,7 +754,9 @@ int SCHEDULER_REPLY::parse(FILE* in, PROJECT* project) {
} else if (match_tag(buf, "<trickle_down>")) {
retval = gstate.handle_trickle_down(project, in);
if (retval) {
msg_printf(project, MSG_ERROR, "handle_trickle_down failed: %d\n", retval);
msg_printf(project, MSG_ERROR,
"handle_trickle_down failed: %d\n", retval
);
}
continue;
} else if (match_tag(buf, "<non_cpu_intensive/>")) {

View File

@ -59,6 +59,13 @@ echo "
<li> <a href=compile.php>Compile BOINC software</a>
</ul>
<h2>Translating</h2>
If you speak a non-English language, you can help by
<ul>
<li> <a href=language.php>translating the BOINC manager</a> or
<li> <a href=web_translation.php>translating the web site</a>.
</ul>
<h2>News feeds</h2>
<p>
RSS-based news feeds are available from BOINC

View File

@ -19,7 +19,7 @@ BOINC's abstractions of data and computation.
<li><a href=work.php>Workunits</a>
<li><a href=result.php>Results</a>
<li><a href=redundancy.php>Redundancy and errors</a>
<li><a href=homogeneous_redundancy.php>Homogeneous redundancy</a>
<li><a href=homogeneous_redundancy.php>Numerical discrepancies</a>
<li><a href=work_distribution.php>Work distribution</a>
<li><a href=sched_locality.php>Locality scheduling</a>
<li><a href=trickle.php>Trickle messages</a>
@ -129,6 +129,7 @@ Communicating with participants via the web
<ul>
<li> <a href=web.php>Managing the project web site</a>
<li> <a href=gui_urls.php>Add project-specific links to the client GUI</a>
<li> <a href=web_translation.php>Web site translation</a>
</ul>
<font size=+1><b>
Miscellaneous

76
doc/fortran_numerics.txt Normal file
View File

@ -0,0 +1,76 @@
[ Notes from Eric McIntosh at CERN on how to
eliminate numerical discrepancies between platforms. ]
First I found a problem with data input on Windows using
an "old" Compaq Visual Fortran compiler. Approximately
1000 out of 16 million magnet errors were one bit too big
on the Windows system. This problem is apparently fixed with
"more modern" compilers, and my colleague Flrent Denichin
from Lyon says we could also have specified a larger number of
decimal digits to avoid this........
However I found that the Lahey Fortran compilers
produce identical results on Linux and Windows.
The company claims it strives for this but does
not guarantee it. I use compatible releases
of their compiler e.g. 5.7 on Windows and 6.1 on Linux
but am now in production with 7.1.1 on Windows and 6.2 on Linux.
The data input problem was thus resolved.
It is very important to note that the compiler disables
extended precision on Intel boxes and has an option to
generate compatible code for any Pentium. Lahey do NOT use
extended 80-bit precision, SSE, or Multiply/ADD in one
instruction, with the appropriate compiler switch settings,
and I make a statically linked executable. I also compile at
the same optimisation level of course to avoid
differences due to different optimisation.
Given all this I was delighted, until I started finding
small numerical difference in a small percentage of runs.
This was relatively easy to spot, as even a difference of
1 in the least significant bit of the mantissa of an IEEE
floating-point number, will be magnified as the SixTrack
particles pass through ~10,000 computational steps of
each of up to one million turns.
To cut a long story short; I finally found that the culprits
were the exp and log functions. Certain parameters to these
functions produce a result which is 1 least significant bit different
between an IA-32 and an ATHLON AMD64. A WEB search uncovered the
crlibm, a library of Elementary functions developed at the
Ecole Normale Sperieur in Lyon (just a couple of hours
drive from Geneva!). I downloaded and tested this library,
and developed a Fortran interface and converted it for
Windows as well. (It had been developed using C on Linux.)
The library provides, sin, cos, sinh, cosh, tan, atan, log, log10 and
exp that I use. It offers rounding to nearest, or rounding up
or down. It is also optimised in the sense that it computes a
sufficient but minimum number of binary digits to produce
a correctly rounded result.
I also implemented some missing elementary functions in terms of
the others they provide; namely acos_rn, asin_rn, atan2_rn in
terms of atan_rn, where _rn implies round to nearest.
This library GUARANTEES to deliver the correctly rounded double
precision result on virtually any computer, and certainly on the
IEEE IA-32, AMD64 machines I am using. The results are also proven
theoretically to be correct. This is a tremendous piece of work and to
me represents an enormous step forward in the history of computing.
The greatest advance since the invention of IEEE arithmetic itself.
(I have not yet verified on the Intel IA-64 due to the pressure of
work, but I will do, as soon as possible, and Lyon have certainly
tested it.)
My colleague Florent de Dinechen of ENS Lyon, whom we invited to CERN
afterwards to lecture on floating-point arithmetic, points you to
http://lipforge.ens-lyon.fr/projects/crlibm/
where their work is described.
We shall make a joint presentation (I hope) at the
19th International Symposium on Distributed Computing
DISC 2005
Krakow, Poland, September 25-29, 2005.
and also at CHEP 06 in Mumbai.

View File

@ -1,18 +1,33 @@
<?php
require_once("docutil.php");
page_head("Homogeneous redundancy ");
page_head("Dealing with numerical discrepancies");
echo"
Most numerical applications produce different outcomes
for a given workunit depending on the machine
architecture, operating system, compiler, and compiler flags.
In such cases it may be difficult to distinguish
For some applications these discrepancies produce
only small differences in the final output,
and results can be validated using a 'fuzzy comparison' function
that allows for deviations of a few percent.
<p>
Other applications are 'divergent' in the sense that small
numerical differences lead to unpredictably large differences
in the final output.
For such applications it may be difficult to distinguish
between results that are correct but differ because
of numerical variation,
and results that are erroneous.
of numerical discrepancies, and results that are erroneous.
The 'fuzzy comparison' approach does not work for such applications.
<h2>Eliminating discrepancies</h2>
<p>
One approach is to eliminate numerical discrepancies.
Some notes on how to do this for Fortran programs
are <a href=fortran_numerics.txt>here</a>
<h2>Homogeneous redundancy</h2>
<p>
BOINC provides a feature called <b>homogeneous redundancy</b>
for such applications.
to handle divergent applications.
You can enable it for a project by including the line
<pre>
&lt;homogeneous_redundancy/&gt;

View File

@ -27,9 +27,8 @@ The BOINC's features fall into several areas:
Many different projects can use BOINC.
Projects are independent; each one operates its own servers and databases.
However, projects can share resources in the following sense:
Participants install a <b>core client</b> program
which in turn downloads and executes project-specific application programs.
Participants control which projects they participate in,
Participants can participate in multiple projects;
they control which projects they participate in,
and how their resources are divided among these projects.
When a project is down or has no work,
the resources of its participants are divided among
@ -72,16 +71,9 @@ This simplifies the task of diagnosing performance problems.
<li>
<b>Source code availability</b>
<br>
BOINC is distributed under a
<a href=license_1.0.txt>public license</a>
that allows it to be used freely for public or private distributed
computing projects,
with the restriction that it cannot be used as the basis for
commercial products.
BOINC applications need not be open source.
Each project must provide and maintain its own server systems;
these systems can be set up easily using
open-source components (MySQL, PHP, Apache).
BOINC is distributed under the
<a href=http://www.gnu.org/copyleft/lesser.html>Lesser GNU Public License</a>.
However, BOINC applications need not be open source.
<li>
<b>Support for large data</b>
<br>

View File

@ -15,15 +15,13 @@ you can help by making a translation for your non-English language.
Notes:
<ul>
<li>
You can use a tool called poEdit to modify the 'po' file.
It can be found here:<br>
<a href=http://sourceforge.net/projects/poedit/>http://sourceforge.net/projects/poedit/</a>
You can use a tool called <a href=http://www.poedit.org>poEdit</a>
to modify the 'po' file.
<li>
You might want to subscribe to the
<a href=http://ssl.berkeley.edu/mailman/listinfo/boinc_loc>boinc_loc@ssl.berkeley.edu</a>
email list, which is devoted to discussion of
BOINC-related translation.
<a href=http://ssl.berkeley.edu/mailman/listinfo/boinc_loc>boinc_loc at ssl.berkeley.edu</a>
email list, which is devoted to discussion of BOINC-related translation.
<li>
To submit a new language file,
please email it to Rom Walton (rwalton at ssl.berkeley.edu).

View File

@ -45,7 +45,7 @@ language("Danish", array(
site("http://www.setihome.dk", "www.setihome.dk")
));
language("Dutch", array(
site("http://www.seti.nl/content.php?c=boinc_berkeley_main",
site("http://www.seti.nl/content.php?c=boincmain",
"SETI@Netherlands"
)
));
@ -69,6 +69,7 @@ language("French", array(
site("http://boinc-quebec.org", "boinc-quebec.org")
));
language("German", array(
site("http://home.arcor.de/tim222/", "Team Science and Research Hessen"),
site("http://www.boinc.de/", "www.boinc.de"),
site( "http://www.boinc-lubeca.de/", "BOINC - LUBECA (Lübeck, Germany)"),
site( "http://www.boinc-forum.de/", "www.boinc-forum.de"),

View File

@ -12,7 +12,8 @@ A <b>validator</b> is a back-end program that does validation
and credit-granting.
You must supply a validator for each application in your project.
BOINC supplies a framework program <b>validator.C</b>.
This program must be linked with two application-specific functions:
To make a validator program, you must link validator.C
with two application-specific functions:
<pre>",
htmlspecialchars("
int check_set(vector<RESULT> results, DB_WORKUNIT& wu, int& canonicalid, double& credit, bool& retry);
@ -100,6 +101,18 @@ exceeds a given minimum.
A placeholder, validator_placeholder.C is also provided. You can replace
this file with your own code and 'make' will correctly build and link it.
<h3>Command-line arguments</h3>
A validator has the following command-line arguments:
";
list_start();
list_item("-app appname", "Name of the application");
list_item("[ -one_pass_N_WU N ]", "Validate at most N WUs, then exit");
list_item("[ -one_pass ]", "Make one pass through WU table, then exit");
list_item("[ -mod n i ]",
"Process only WUs with (id mod n) == i.
This option lets you run multiple instances of the validator
for increased performance."
);
list_end();
page_tail();
?>

View File

@ -534,10 +534,12 @@ bool SCHEDULER_REPLY::work_needed(bool locality_sched) {
}
if (wreq.nresults >= config.max_wus_to_send) return false;
if (config.daily_result_quota) {
// scale daily quota by #CPUs, up to a limit of 4
//
if (host.p_ncpus<4) {
wreq.daily_result_quota=host.p_ncpus*config.daily_result_quota;
wreq.daily_result_quota = host.p_ncpus*config.daily_result_quota;
} else {
wreq.daily_result_quota=4*config.daily_result_quota;
wreq.daily_result_quota = 4*config.daily_result_quota;
}
if (host.nresults_today >= wreq.daily_result_quota) {
wreq.daily_result_quota_exceeded = true;