diff --git a/db/Makefile.am b/db/Makefile.am
index 3548944461..479ba3732a 100644
--- a/db/Makefile.am
+++ b/db/Makefile.am
@@ -10,4 +10,6 @@ endif
## other stuff to go into the distribution
extradir = $(prefix)/share/boinc-server-maker/db
-dist_extra_DATA = constraints.sql schema.sql init_db
+dist_extra_DATA = constraints.sql schema.sql
+
+dist_extra_SCRIPTS = init_db
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 14ba2d1b9d..45c3279851 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -26,6 +26,7 @@ libfcgi_sources = \
md5_file.cpp \
miofile.cpp \
msg_log.cpp \
+ opencl_boinc.cpp \
parse.cpp \
shmem.cpp \
str_util.cpp \
@@ -53,6 +54,7 @@ generic_sources = \
msg_log.cpp \
network.cpp \
notice.cpp \
+ opencl_boinc.cpp \
parse.cpp \
prefs.cpp \
procinfo.cpp \
@@ -120,6 +122,7 @@ pkginclude_HEADERS = \
msg_log.h \
network.h \
notice.h \
+ opencl_boinc.h \
parse.h \
prefs.h \
procinfo.h \
diff --git a/lib/coproc.cpp b/lib/coproc.cpp
index 44f4b285bb..4301d10e9a 100644
--- a/lib/coproc.cpp
+++ b/lib/coproc.cpp
@@ -123,62 +123,6 @@ void COPROC::write_request(MIOFILE& f) {
);
}
-void OPENCL_DEVICE_PROP::write_xml(MIOFILE& f, const char* tag, bool temp_file) {
- f.printf(
- " <%s>\n"
- " %s\n"
- " %s\n"
- " %lu\n"
- " %d\n"
- " %llu\n"
- " %llu\n"
- " %llu\n"
- " %d\n"
- " %llu\n"
- " %s\n"
- " %llu\n"
- " %llu\n"
- " %lu\n"
- " %lu\n"
- " %s\n"
- " %s\n"
- " %s\n",
- tag,
- name,
- vendor,
- vendor_id,
- available ? 1 : 0,
- half_fp_config,
- single_fp_config,
- double_fp_config,
- endian_little ? 1 : 0,
- execution_capabilities,
- extensions,
- global_mem_size,
- local_mem_size,
- max_clock_frequency,
- max_compute_units,
- opencl_platform_version,
- opencl_device_version,
- opencl_driver_version
- );
- if (temp_file) {
- f.printf(
- " %d\n"
- " %d\n"
- " %f\n"
- " %f\n"
- " %d\n",
- is_used,
- device_num,
- peak_flops,
- opencl_available_ram,
- opencl_device_index
- );
- }
- f.printf(" %s>\n", tag);
-}
-
int COPROC::parse(XML_PARSER& xp) {
char buf[256];
strcpy(type, "");
@@ -210,179 +154,6 @@ int COPROC::parse(XML_PARSER& xp) {
#endif
-int OPENCL_DEVICE_PROP::parse(XML_PARSER& xp, const char* end_tag) {
- int n;
- unsigned long long ull;
-
- while (!xp.get_tag()) {
- if (xp.match_tag(end_tag)) {
- get_device_version_int();
- get_opencl_driver_revision();
- return 0;
- }
- if (xp.parse_str("name", name, sizeof(name))) continue;
- if (xp.parse_str("vendor", vendor, sizeof(vendor))) continue;
- if (xp.parse_ulonglong("vendor_id", ull)) {
- vendor_id = ull;
- continue;
- }
- if (xp.parse_int("available", n)) {
- available = n;
- continue;
- }
- if (xp.parse_ulonglong("half_fp_config", ull)) {
- half_fp_config = ull;
- continue;
- }
- if (xp.parse_ulonglong("single_fp_config", ull)) {
- single_fp_config = ull;
- continue;
- }
- if (xp.parse_ulonglong("double_fp_config", ull)) {
- double_fp_config = ull;
- continue;
- }
- if (xp.parse_int("endian_little", n)) {
- endian_little = n;
- continue;
- }
- if (xp.parse_ulonglong("execution_capabilities", ull)) {
- execution_capabilities = ull;
- continue;
- }
- if (xp.parse_str("extensions",
- extensions,
- sizeof(extensions)
- )) {
- continue;
- }
- if (xp.parse_ulonglong("global_mem_size", ull)) {
- global_mem_size = ull;
- continue;
- }
- if (xp.parse_ulonglong("local_mem_size", ull)) {
- local_mem_size = ull;
- continue;
- }
- if (xp.parse_int("max_clock_frequency", n)) {
- max_clock_frequency = n;
- continue;
- }
- if (xp.parse_int("max_compute_units", n)) {
- max_compute_units = n;
- continue;
- }
- if (xp.parse_str("opencl_platform_version",
- opencl_platform_version,
- sizeof(opencl_platform_version)
- )) {
- continue;
- }
- if (xp.parse_str("opencl_device_version",
- opencl_device_version,
- sizeof(opencl_device_version)
- )) {
- continue;
- }
- if (xp.parse_str("opencl_driver_version",
- opencl_driver_version,
- sizeof(opencl_driver_version)
- )) {
- continue;
- }
-
- // The following are used only in the
- // COPROC_INFO_FILENAME temporary file
- if (xp.parse_int("is_used", n)) {
- is_used = (COPROC_USAGE)n;
- continue;
- }
- if (xp.parse_int("device_num", n)) {
- device_num = n;
- continue;
- }
- if (xp.parse_double("peak_flops", peak_flops)) continue;
- if (xp.parse_double("opencl_available_ram", opencl_available_ram)) continue;
- if (xp.parse_int("opencl_device_index", n)) {
- opencl_device_index = n;
- continue;
- }
- }
- return ERR_XML_PARSE;
-}
-
-int OPENCL_DEVICE_PROP::get_device_version_int() {
- int maj, min;
- int n = sscanf(
- opencl_device_version, "OpenCL %d.%d", &maj, &min
- );
- if (n != 2) {
- return ERR_NOT_FOUND;
- }
- opencl_device_version_int = 100*maj + min;
- return 0;
-}
-
-int OPENCL_DEVICE_PROP::get_opencl_driver_revision() {
- // gets the OpenCL runtime revision
- // Thus far this is only necessary for ATI/AMD because there are bad
- // driver sets only distinguisable by the runtime library version.
- // Fortunately this info is in the opencl_device_version string.
- float rev=0;
- char *p=opencl_device_version+sizeof(opencl_device_version)-1;
- // find the last opening bracket
- while ((p > opencl_device_version) && (*p!='(')) p--;
- if (p!=opencl_device_version) {
- int n=sscanf(
- p, "(%f", &rev
- );
- // I don't care about errors because for non-ATI GPUs this should
- // be zero.
- if (n!=1) {
- rev=0;
- }
- }
- opencl_driver_revision=floor(rev*100+0.5);
- return 0;
-}
-
-void OPENCL_DEVICE_PROP::description(char* buf, int buflen, const char* type) {
- char s1[256], s2[256];
- int n;
- // openCL_device_version may have a trailing space
- strlcpy(s1, opencl_device_version, sizeof(s1));
- n = (int)strlen(s1) - 1;
- if ((n > 0) && (s1[n] == ' ')) s1[n] = '\0';
- snprintf(s2, sizeof(s2),
- "%s (driver version %s, device version %s, %.0fMB, %.0fMB available, %.0f GFLOPS peak)",
- name, opencl_driver_version,
- s1, global_mem_size/MEGA,
- opencl_available_ram/MEGA, peak_flops/1.e9
- );
-
- switch(is_used) {
- case COPROC_IGNORED:
- snprintf(buf, buflen,
- "OpenCL: %s %d (ignored by config): %s",
- type, device_num, s2
- );
- break;
- case COPROC_USED:
- snprintf(buf, buflen,
- "OpenCL: %s %d: %s",
- type, device_num, s2
- );
- break;
- case COPROC_UNUSED:
- default:
- snprintf(buf, buflen,
- "OpenCL: %s %d (not used): %s",
- type, device_num, s2
- );
- break;
- }
-}
-
void COPROCS::summary_string(char* buf, int len) {
char buf2[1024];
@@ -1104,46 +875,6 @@ void COPROC_INTEL::fake(double ram, double avail_ram, int n) {
opencl_prop.global_mem_size = (cl_ulong)ram;
}
-////////////////// OPENCL CPU STARTS HERE /////////////////
-
-
-// CPU OpenCL does not really describe a coprocessor but
-// this is here to take advantage of the other OpenCL code.
-void OPENCL_CPU_PROP::clear() {
- platform_vendor[0] = 0;
- memset(&opencl_prop, 0, sizeof(opencl_prop));
-}
-
-void OPENCL_CPU_PROP::write_xml(MIOFILE& f) {
- f.printf(
- "\n"
- " %s\n",
- platform_vendor
- );
- opencl_prop.write_xml(f, "opencl_cpu_info");
- f.printf("\n");
-}
-
-int OPENCL_CPU_PROP::parse(XML_PARSER& xp) {
- int retval;
-
- clear();
-
- while (!xp.get_tag()) {
- if (xp.match_tag("/opencl_cpu_prop")) {
- if (!strlen(platform_vendor)) return ERR_XML_PARSE;
- return 0;
- }
- if (xp.parse_str("platform_vendor", platform_vendor, sizeof(platform_vendor))) continue;
- if (xp.match_tag("opencl_cpu_info")) {
- retval = opencl_prop.parse(xp, "/opencl_cpu_info");
- if (retval) return retval;
- continue;
- }
- }
- return ERR_XML_PARSE;
-}
-
// used wherever a processor type is specified in XML, e.g.
//
// xxx
diff --git a/lib/coproc.h b/lib/coproc.h
index 7d05bfa5fd..92e670694d 100644
--- a/lib/coproc.h
+++ b/lib/coproc.h
@@ -78,6 +78,7 @@
#include "parse.h"
#include "cal_boinc.h"
#include "cl_boinc.h"
+#include "opencl_boinc.h"
#define DEFER_ON_GPU_AVAIL_RAM 0
@@ -85,9 +86,6 @@
#define MAX_RSC 8
// max # of processing resources types
-#define MAX_OPENCL_PLATFORMS 16
-#define MAX_OPENCL_CPU_PLATFORMS 4
-
// arguments to proc_type_name() and proc_type_name_xml().
//
#define PROC_TYPE_CPU 0
@@ -106,13 +104,6 @@ extern const char* proc_type_name_xml(int);
#define GPU_TYPE_ATI proc_type_name_xml(PROC_TYPE_AMD_GPU)
#define GPU_TYPE_INTEL proc_type_name_xml(PROC_TYPE_INTEL_GPU)
-enum COPROC_USAGE {
- COPROC_IGNORED,
- COPROC_UNUSED,
- COPROC_USED
-};
-
-
// represents a requirement for a coproc.
// This is a parsed version of the elements in an
// (used in client only)
@@ -133,45 +124,6 @@ struct PCI_INFO {
int parse(XML_PARSER&);
};
-// there's some duplication between the values in
-// the OPENCL_DEVICE_PROP struct and the NVIDIA/ATI structs
-//
-struct OPENCL_DEVICE_PROP {
- cl_device_id device_id;
- char name[256]; // Device name
- char vendor[256]; // Device vendor (NVIDIA, ATI, AMD, etc.)
- cl_uint vendor_id; // OpenCL ID of device vendor
- cl_bool available; // Is this device available?
- cl_device_fp_config half_fp_config; // Half precision capabilities
- cl_device_fp_config single_fp_config; // Single precision
- cl_device_fp_config double_fp_config; // Double precision
- cl_bool endian_little; // TRUE if little-endian
- cl_device_exec_capabilities execution_capabilities;
- char extensions[1024]; // List of device extensions
- cl_ulong global_mem_size; // in bytes (OpenCL can report 4GB Max)
- cl_ulong local_mem_size;
- cl_uint max_clock_frequency; // in MHz
- cl_uint max_compute_units;
- char opencl_platform_version[64]; // Version of OpenCL supported
- // the device's platform
- char opencl_device_version[64]; // OpenCL version supported by device;
- // example: "OpenCL 1.1 beta"
- int opencl_device_version_int; // same, encoded as e.g. 101
- int get_device_version_int(); // call this to encode
- int opencl_driver_revision; // OpenCL runtime revision is available
- int get_opencl_driver_revision(); // call this to encode
- char opencl_driver_version[32]; // For example: "CLH 1.0"
- int device_num; // temp used in scan process
- double peak_flops; // temp used in scan process
- COPROC_USAGE is_used; // temp used in scan process
- double opencl_available_ram; // temp used in scan process
- int opencl_device_index; // temp used in scan process
-
- void write_xml(MIOFILE&, const char* tag, bool temp_file=false);
- int parse(XML_PARSER&, const char* end_tag);
- void description(char* buf, int buflen, const char* type);
-};
-
// represents a set of identical coprocessors on a particular computer.
// Abstract class;
@@ -527,20 +479,4 @@ struct COPROCS {
}
};
-// NOTE: OpenCL has only 64 bits for global_mem_size, so
-// it can report a max of only 4GB.
-// Get the CPU RAM size from gstate.hostinfo.m_nbytes.
-struct OPENCL_CPU_PROP {
- char platform_vendor[256];
- OPENCL_DEVICE_PROP opencl_prop;
-
- OPENCL_CPU_PROP() {
- clear();
- }
- void clear();
- void write_xml(MIOFILE&);
- int parse(XML_PARSER&);
-
-};
-
#endif
diff --git a/lib/opencl_boinc.cpp b/lib/opencl_boinc.cpp
new file mode 100644
index 0000000000..d0c1134835
--- /dev/null
+++ b/lib/opencl_boinc.cpp
@@ -0,0 +1,314 @@
+// This file is part of BOINC.
+// http://boinc.berkeley.edu
+// Copyright (C) 2013 University of California
+//
+// BOINC is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License
+// as published by the Free Software Foundation,
+// either version 3 of the License, or (at your option) any later version.
+//
+// BOINC is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+// See the GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with BOINC. If not, see .
+
+#if defined(_WIN32) && !defined(__STDWX_H__)
+#include "boinc_win.h"
+#elif defined(_WIN32) && defined(__STDWX_H__)
+#include "stdwx.h"
+#else
+#ifdef _USING_FCGI_
+#include "boinc_fcgi.h"
+#else
+#include
+#endif
+#include
+#include
+#include
+#endif
+
+#ifdef _WIN32
+#include "win_util.h"
+#ifdef _MSC_VER
+#define snprintf _snprintf
+#endif
+#endif
+#include "miofile.h"
+#include "parse.h"
+#include "str_replace.h"
+#include "util.h"
+
+#include "opencl_boinc.h"
+
+void OPENCL_DEVICE_PROP::write_xml(MIOFILE& f, const char* tag, bool temp_file) {
+ f.printf(
+ " <%s>\n"
+ " %s\n"
+ " %s\n"
+ " %lu\n"
+ " %d\n"
+ " %llu\n"
+ " %llu\n"
+ " %llu\n"
+ " %d\n"
+ " %llu\n"
+ " %s\n"
+ " %llu\n"
+ " %llu\n"
+ " %lu\n"
+ " %lu\n"
+ " %s\n"
+ " %s\n"
+ " %s\n",
+ tag,
+ name,
+ vendor,
+ vendor_id,
+ available ? 1 : 0,
+ half_fp_config,
+ single_fp_config,
+ double_fp_config,
+ endian_little ? 1 : 0,
+ execution_capabilities,
+ extensions,
+ global_mem_size,
+ local_mem_size,
+ max_clock_frequency,
+ max_compute_units,
+ opencl_platform_version,
+ opencl_device_version,
+ opencl_driver_version
+ );
+ if (temp_file) {
+ f.printf(
+ " %d\n"
+ " %d\n"
+ " %f\n"
+ " %f\n"
+ " %d\n",
+ is_used,
+ device_num,
+ peak_flops,
+ opencl_available_ram,
+ opencl_device_index
+ );
+ }
+ f.printf(" %s>\n", tag);
+}
+
+int OPENCL_DEVICE_PROP::parse(XML_PARSER& xp, const char* end_tag) {
+ int n;
+ unsigned long long ull;
+
+ while (!xp.get_tag()) {
+ if (xp.match_tag(end_tag)) {
+ get_device_version_int();
+ get_opencl_driver_revision();
+ return 0;
+ }
+ if (xp.parse_str("name", name, sizeof(name))) continue;
+ if (xp.parse_str("vendor", vendor, sizeof(vendor))) continue;
+ if (xp.parse_ulonglong("vendor_id", ull)) {
+ vendor_id = ull;
+ continue;
+ }
+ if (xp.parse_int("available", n)) {
+ available = n;
+ continue;
+ }
+ if (xp.parse_ulonglong("half_fp_config", ull)) {
+ half_fp_config = ull;
+ continue;
+ }
+ if (xp.parse_ulonglong("single_fp_config", ull)) {
+ single_fp_config = ull;
+ continue;
+ }
+ if (xp.parse_ulonglong("double_fp_config", ull)) {
+ double_fp_config = ull;
+ continue;
+ }
+ if (xp.parse_int("endian_little", n)) {
+ endian_little = n;
+ continue;
+ }
+ if (xp.parse_ulonglong("execution_capabilities", ull)) {
+ execution_capabilities = ull;
+ continue;
+ }
+ if (xp.parse_str("extensions",
+ extensions,
+ sizeof(extensions)
+ )) {
+ continue;
+ }
+ if (xp.parse_ulonglong("global_mem_size", ull)) {
+ global_mem_size = ull;
+ continue;
+ }
+ if (xp.parse_ulonglong("local_mem_size", ull)) {
+ local_mem_size = ull;
+ continue;
+ }
+ if (xp.parse_int("max_clock_frequency", n)) {
+ max_clock_frequency = n;
+ continue;
+ }
+ if (xp.parse_int("max_compute_units", n)) {
+ max_compute_units = n;
+ continue;
+ }
+ if (xp.parse_str("opencl_platform_version",
+ opencl_platform_version,
+ sizeof(opencl_platform_version)
+ )) {
+ continue;
+ }
+ if (xp.parse_str("opencl_device_version",
+ opencl_device_version,
+ sizeof(opencl_device_version)
+ )) {
+ continue;
+ }
+ if (xp.parse_str("opencl_driver_version",
+ opencl_driver_version,
+ sizeof(opencl_driver_version)
+ )) {
+ continue;
+ }
+
+ // The following are used only in the
+ // COPROC_INFO_FILENAME temporary file
+ if (xp.parse_int("is_used", n)) {
+ is_used = (COPROC_USAGE)n;
+ continue;
+ }
+ if (xp.parse_int("device_num", n)) {
+ device_num = n;
+ continue;
+ }
+ if (xp.parse_double("peak_flops", peak_flops)) continue;
+ if (xp.parse_double("opencl_available_ram", opencl_available_ram)) continue;
+ if (xp.parse_int("opencl_device_index", n)) {
+ opencl_device_index = n;
+ continue;
+ }
+ }
+ return ERR_XML_PARSE;
+}
+
+int OPENCL_DEVICE_PROP::get_device_version_int() {
+ int maj, min;
+ int n = sscanf(
+ opencl_device_version, "OpenCL %d.%d", &maj, &min
+ );
+ if (n != 2) {
+ return ERR_NOT_FOUND;
+ }
+ opencl_device_version_int = 100*maj + min;
+ return 0;
+}
+
+int OPENCL_DEVICE_PROP::get_opencl_driver_revision() {
+ // gets the OpenCL runtime revision
+ // Thus far this is only necessary for ATI/AMD because there are bad
+ // driver sets only distinguisable by the runtime library version.
+ // Fortunately this info is in the opencl_device_version string.
+ float rev=0;
+ char *p=opencl_device_version+sizeof(opencl_device_version)-1;
+ // find the last opening bracket
+ while ((p > opencl_device_version) && (*p!='(')) p--;
+ if (p!=opencl_device_version) {
+ int n=sscanf(
+ p, "(%f", &rev
+ );
+ // I don't care about errors because for non-ATI GPUs this should
+ // be zero.
+ if (n!=1) {
+ rev=0;
+ }
+ }
+ opencl_driver_revision=floor(rev*100+0.5);
+ return 0;
+}
+
+void OPENCL_DEVICE_PROP::description(char* buf, int buflen, const char* type) {
+ char s1[256], s2[256];
+ int n;
+ // openCL_device_version may have a trailing space
+ strlcpy(s1, opencl_device_version, sizeof(s1));
+ n = (int)strlen(s1) - 1;
+ if ((n > 0) && (s1[n] == ' ')) s1[n] = '\0';
+ snprintf(s2, sizeof(s2),
+ "%s (driver version %s, device version %s, %.0fMB, %.0fMB available, %.0f GFLOPS peak)",
+ name, opencl_driver_version,
+ s1, global_mem_size/MEGA,
+ opencl_available_ram/MEGA, peak_flops/1.e9
+ );
+
+ switch(is_used) {
+ case COPROC_IGNORED:
+ snprintf(buf, buflen,
+ "OpenCL: %s %d (ignored by config): %s",
+ type, device_num, s2
+ );
+ break;
+ case COPROC_USED:
+ snprintf(buf, buflen,
+ "OpenCL: %s %d: %s",
+ type, device_num, s2
+ );
+ break;
+ case COPROC_UNUSED:
+ default:
+ snprintf(buf, buflen,
+ "OpenCL: %s %d (not used): %s",
+ type, device_num, s2
+ );
+ break;
+ }
+}
+
+////////////////// OPENCL CPU STARTS HERE /////////////////
+
+
+// CPU OpenCL does not really describe a coprocessor but
+// this is here to take advantage of the other OpenCL code.
+void OPENCL_CPU_PROP::clear() {
+ platform_vendor[0] = 0;
+ memset(&opencl_prop, 0, sizeof(opencl_prop));
+}
+
+void OPENCL_CPU_PROP::write_xml(MIOFILE& f) {
+ f.printf(
+ "\n"
+ " %s\n",
+ platform_vendor
+ );
+ opencl_prop.write_xml(f, "opencl_cpu_info");
+ f.printf("\n");
+}
+
+int OPENCL_CPU_PROP::parse(XML_PARSER& xp) {
+ int retval;
+
+ clear();
+
+ while (!xp.get_tag()) {
+ if (xp.match_tag("/opencl_cpu_prop")) {
+ if (!strlen(platform_vendor)) return ERR_XML_PARSE;
+ return 0;
+ }
+ if (xp.parse_str("platform_vendor", platform_vendor, sizeof(platform_vendor))) continue;
+ if (xp.match_tag("opencl_cpu_info")) {
+ retval = opencl_prop.parse(xp, "/opencl_cpu_info");
+ if (retval) return retval;
+ continue;
+ }
+ }
+ return ERR_XML_PARSE;
+}
+
diff --git a/lib/opencl_boinc.h b/lib/opencl_boinc.h
new file mode 100644
index 0000000000..9cc0c3fd8c
--- /dev/null
+++ b/lib/opencl_boinc.h
@@ -0,0 +1,84 @@
+// This file is part of BOINC.
+// http://boinc.berkeley.edu
+// Copyright (C) 2013 University of California
+//
+// BOINC is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License
+// as published by the Free Software Foundation,
+// either version 3 of the License, or (at your option) any later version.
+//
+// BOINC is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+// See the GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with BOINC. If not, see .
+
+
+#include "cl_boinc.h"
+
+#define MAX_OPENCL_PLATFORMS 16
+#define MAX_OPENCL_CPU_PLATFORMS 4
+
+enum COPROC_USAGE {
+ COPROC_IGNORED,
+ COPROC_UNUSED,
+ COPROC_USED
+};
+
+// there's some duplication between the values in
+// the OPENCL_DEVICE_PROP struct and the NVIDIA/ATI structs
+//
+struct OPENCL_DEVICE_PROP {
+ cl_device_id device_id;
+ char name[256]; // Device name
+ char vendor[256]; // Device vendor (NVIDIA, ATI, AMD, etc.)
+ cl_uint vendor_id; // OpenCL ID of device vendor
+ cl_bool available; // Is this device available?
+ cl_device_fp_config half_fp_config; // Half precision capabilities
+ cl_device_fp_config single_fp_config; // Single precision
+ cl_device_fp_config double_fp_config; // Double precision
+ cl_bool endian_little; // TRUE if little-endian
+ cl_device_exec_capabilities execution_capabilities;
+ char extensions[1024]; // List of device extensions
+ cl_ulong global_mem_size; // in bytes (OpenCL can report 4GB Max)
+ cl_ulong local_mem_size;
+ cl_uint max_clock_frequency; // in MHz
+ cl_uint max_compute_units;
+ char opencl_platform_version[64]; // Version of OpenCL supported
+ // the device's platform
+ char opencl_device_version[64]; // OpenCL version supported by device;
+ // example: "OpenCL 1.1 beta"
+ int opencl_device_version_int; // same, encoded as e.g. 101
+ int get_device_version_int(); // call this to encode
+ int opencl_driver_revision; // OpenCL runtime revision is available
+ int get_opencl_driver_revision(); // call this to encode
+ char opencl_driver_version[32]; // For example: "CLH 1.0"
+ int device_num; // temp used in scan process
+ double peak_flops; // temp used in scan process
+ COPROC_USAGE is_used; // temp used in scan process
+ double opencl_available_ram; // temp used in scan process
+ int opencl_device_index; // temp used in scan process
+
+ void write_xml(MIOFILE&, const char* tag, bool temp_file=false);
+ int parse(XML_PARSER&, const char* end_tag);
+ void description(char* buf, int buflen, const char* type);
+};
+
+// NOTE: OpenCL has only 32 bits for global_mem_size, so
+// it can report a max of only 4GB.
+// Get the CPU RAM size from gstate.hostinfo.m_nbytes.
+//
+struct OPENCL_CPU_PROP {
+ char platform_vendor[256];
+ OPENCL_DEVICE_PROP opencl_prop;
+
+ OPENCL_CPU_PROP() {
+ clear();
+ }
+ void clear();
+ void write_xml(MIOFILE&);
+ int parse(XML_PARSER&);
+
+};
diff --git a/locale/Makefile.am b/locale/Makefile.am
index a8850cf204..0affdb2f3c 100644
--- a/locale/Makefile.am
+++ b/locale/Makefile.am
@@ -21,7 +21,7 @@ locale_dirs = \
gl \
hr \
hu \
- it \
+ it_IT \
ja \
ko \
lt \
diff --git a/sched/Makefile.am b/sched/Makefile.am
index 1928d448d4..5544f4eb94 100644
--- a/sched/Makefile.am
+++ b/sched/Makefile.am
@@ -116,7 +116,7 @@ schedshare_PROGRAMS = \
sample_trivial_validator \
sample_work_generator \
single_job_assimilator \
- size_regulator \
+ size_regulator \
transitioner \
trickle_credit \
trickle_deadline \
@@ -130,11 +130,10 @@ schedcgi_PROGRAMS= \
schedshare_DATA = \
db_dump_spec.xml \
assimilator.py \
- pymw_assimilator.py \
- transitioner_catchup.php
+ pymw_assimilator.py
# scripts that 'make install' should put in bindir
-schedshare_SCRIPTS = start stop status
+schedshare_SCRIPTS = start stop status transitioner_catchup.php
noinst_HEADERS = \
assimilate_handler.h \
diff --git a/sched/trickle_handler.cpp b/sched/trickle_handler.cpp
index c365e483ef..95df9d9fe2 100644
--- a/sched/trickle_handler.cpp
+++ b/sched/trickle_handler.cpp
@@ -168,7 +168,7 @@ int main(int argc, char** argv) {
}
argv[j] = 0;
- retval = handle_trickle_init(argc, argv);
+ retval = handle_trickle_init(j, argv);
if (retval) exit(1);
log_messages.printf(MSG_NORMAL, "Starting trickle handler\n");
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 47bf81d476..889d2d6fb2 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -31,7 +31,9 @@ dist_tools_SCRIPTS = \
manage_privileges \
run_in_ops \
stage_file \
- watch_tcp \
+ watch_tcp
+
+dist_tools_DATA = \
project.xml
AM_CXXFLAGS += $(MYSQL_CFLAGS)
diff --git a/win_build/boinc_os_ss.vcproj b/win_build/boinc_os_ss.vcproj
index 085c467c31..7bb848b8e0 100644
--- a/win_build/boinc_os_ss.vcproj
+++ b/win_build/boinc_os_ss.vcproj
@@ -622,6 +622,10 @@
RelativePath="..\lib\notice.cpp"
>
+
+
@@ -683,6 +687,10 @@
RelativePath="..\lib\cc_config.h"
>
+
+
@@ -723,6 +731,10 @@
RelativePath="..\lib\notice.h"
>
+
+
diff --git a/win_build/boincmgr.vcproj b/win_build/boincmgr.vcproj
index 6bb4e14580..7e6c7eacd9 100644
--- a/win_build/boincmgr.vcproj
+++ b/win_build/boincmgr.vcproj
@@ -973,6 +973,10 @@
RelativePath="..\lib\notice.h"
>
+
+
diff --git a/win_build/libboinc.vcproj b/win_build/libboinc.vcproj
index 3e683974a3..2ffc6baca7 100644
--- a/win_build/libboinc.vcproj
+++ b/win_build/libboinc.vcproj
@@ -416,6 +416,10 @@
RelativePath="..\lib\notice.h"
>
+
+
@@ -904,6 +908,10 @@
RelativePath="..\lib\notice.cpp"
>
+
+
diff --git a/win_build/libboinc_staticcrt.vcproj b/win_build/libboinc_staticcrt.vcproj
index d25cbead9f..2f68f06b8d 100644
--- a/win_build/libboinc_staticcrt.vcproj
+++ b/win_build/libboinc_staticcrt.vcproj
@@ -720,6 +720,10 @@
RelativePath="..\lib\notice.cpp"
>
+
+
@@ -1078,6 +1082,10 @@
RelativePath="..\lib\notice.h"
>
+
+