/usr/share/doc/swi-prolog-doc/Manual/64bits.html is in swi-prolog-doc 5.6.59-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
<TITLE>SWI-Prolog 5.6.59 Reference Manual: Section 2.19</TITLE><LINK REL=home HREF="index.html">
<LINK REL=contents HREF="Contents.html">
<LINK REL=index HREF="DocIndex.html">
<LINK REL=previous HREF="limits.html">
<LINK REL=next HREF="IDE.html">
<STYLE type="text/css">
/* Style sheet for SWI-Prolog latex2html
*/
dd.defbody
{ margin-bottom: 1em;
}
dt.pubdef
{ background-color: #c5e1ff;
}
pre.code
{ margin-left: 1.5em;
margin-right: 1.5em;
border: 1px dotted;
padding-top: 5px;
padding-left: 5px;
padding-bottom: 5px;
background-color: #f8f8f8;
}
div.navigate
{ text-align: center;
background-color: #f0f0f0;
border: 1px dotted;
padding: 5px;
}
div.title
{ text-align: center;
padding-bottom: 1em;
font-size: 200%;
font-weight: bold;
}
div.author
{ text-align: center;
font-style: italic;
}
div.abstract
{ margin-top: 2em;
background-color: #f0f0f0;
border: 1px dotted;
padding: 5px;
margin-left: 10%; margin-right:10%;
}
div.abstract-title
{ text-align: center;
padding: 5px;
font-size: 120%;
font-weight: bold;
}
div.toc-h1
{ font-size: 200%;
font-weight: bold;
}
div.toc-h2
{ font-size: 120%;
font-weight: bold;
margin-left: 2em;
}
div.toc-h3
{ font-size: 100%;
font-weight: bold;
margin-left: 4em;
}
div.toc-h4
{ font-size: 100%;
margin-left: 6em;
}
span.sec-nr
{
}
span.sec-title
{
}
span.pred-ext
{ font-weight: bold;
}
span.pred-tag
{ float: right;
font-size: 80%;
font-style: italic;
color: #202020;
}
/* Footnotes */
sup.fn { color: blue; text-decoration: underline; }
span.fn-text { display: none; }
sup.fn span {display: none;}
sup:hover span
{ display: block !important;
position: absolute; top: auto; left: auto; width: 80%;
color: #000; background: white;
border: 2px solid;
padding: 5px; margin: 10px; z-index: 100;
font-size: smaller;
}
</STYLE>
</HEAD>
<BODY BGCOLOR="white">
<DIV class="navigate"><A class="nav" href="index.html"><IMG SRC="home.gif" BORDER=0 ALT="Home"></A>
<A class="nav" href="Contents.html"><IMG SRC="index.gif" BORDER=0 ALT="Contents"></A>
<A class="nav" href="DocIndex.html"><IMG SRC="yellow_pages.gif" BORDER=0 ALT="Index"></A>
<A class="nav" href="limits.html"><IMG SRC="prev.gif" BORDER=0 ALT="Previous"></A>
<A class="nav" href="IDE.html"><IMG SRC="next.gif" BORDER=0 ALT="Next"></A>
</DIV>
<H2><A NAME="sec:2.19"><SPAN class="sec-nr">2.19</SPAN> <SPAN class="sec-title">SWI-Prolog
and 64-bit machines</SPAN></A></H2>
<A NAME="sec:64bits"></A>
<P><A NAME="idx:bits64:262"></A>SWI-Prolog support for 64-bit<SUP class="fn">12<SPAN class="fn-text">With
64-bit machines we refer to CPUs where memory-addresses (pointers) are
64-bits wide.</SPAN></SUP> machines started with version 2.8 on DEC
Alpha CPUs running Linux. Initially 64-bit hardware was developed to
deal with the addressing demands of large databases, running primarily
on expensive server hardware. Recently (2007) we see CPUs that support
64-bit addressing become commonplace, even in low-budget desktop
hardware. Most todays 64-bit platforms are capable of running both
32-bit and 64-bit applications. This asks for some clarifications on the
advantages and drawbacks of 64-bit addressing for (SWI-)Prolog.
<H3><A NAME="sec:2.19.1"><SPAN class="sec-nr">2.19.1</SPAN> <SPAN class="sec-title">Supported
platforms</SPAN></A></H3>
<A NAME="sec:64bitsplatforms"></A>
<P><A NAME="idx:64bitsplatforms:263"></A>On Unix systems, 64-bit
addressing is configured using
<B>configure</B>. Traditionally, both <CODE>long</CODE> and <CODE>void*</CODE>
are 64-bits on these machines. Version 5.6.26 introduces support for
64-bit MS-Windows (Windows XP and Vista 64-bit editions) on amd64 (x64)
hardware. Win64 uses <CODE>long</CODE> integers of only 32-bits. Version
5.6.26 introduces support for such platforms.
<H3><A NAME="sec:2.19.2"><SPAN class="sec-nr">2.19.2</SPAN> <SPAN class="sec-title">Comparing
32- and 64-bits Prolog</SPAN></A></H3>
<A NAME="sec:32vs64bits"></A>
<P>Most of Prolog's memory-usage consists of pointers. This indicates
the primary drawback: Prolog memory usage almost doubles when using the
64 bit addressing model. Using more memory means copying more data
between CPU and main memory, slowing down the system.
<P>What than are the advantages? First of all, SWI-Prolog's addressing
of the Prolog stacks does not cover the whole address space due to the
use of <EM>type tag bits</EM> and <EM>garbage collection flags</EM>. On
32-bit hardware the stacks are limited to 128MB each. This tends to be
too low for demanding applications on modern hardware. On 64-bit
hardware the limit is <VAR>2^32</VAR> times higher, exceeding the
addressing capabilities of todays CPUs and operating systems. This
implies Prolog can be started with stacks sizes that use the full
capabilities of your hardware.
<P>Multi-threaded applications profit much more. SWI-Prolog threads
claim the full stacksize limit in <EM>virtual address space</EM> and
each thread comes with its own set of stacks. This approach quickly
exhaust virtual memory on 32-bit systems but poses no problems when
using 64-bit addresses.
<P><A NAME="idx:IA32:264"></A><A NAME="idx:AMD64:265"></A>The
implications theoretical performance loss due to increased memory
bandwidth implied by exchanging wider pointers depend on the design of
the hardware. We only have data for the popular IA32 vs. AMD64
architectures. Here is appears that the loss is compensated for by a an
instruction set that has been optimized for modern programming. In
particular, the AMD64 has more registers and the relative addressing
capabilities have been improved. Where we see a 10% performance
degradation when placing the SWI-Prolog kernel in a Unix shared object,
we cannot find a measurable difference on AMD64. Current SWI-Prolog
(5.6.26) runs at practically the same speed on IA32 and AMD64.
<H3><A NAME="sec:2.19.3"><SPAN class="sec-nr">2.19.3</SPAN> <SPAN class="sec-title">Choosing
between 32- and 64-bits Prolog</SPAN></A></H3>
<A NAME="sec:32vs64bitschoice"></A>
<P>For those cases where we can choose between 32- and 64-bits, either
because the hardware and OS support both or because we can still choose
the hardware and OS, we give guidelines for this decision.
<P>First of all, if SWI-Prolog needs to be linked against 32- or 64-bit
native libraries, there is no choice as it is not possible to link 32-
and 64-bit code into a single executable. Only if all required libraries
are available in both sizes and there is no clear reason to use either
the different characteristics of Prolog become important.
<P>Prolog applications that require more than the 128MB stack limit
provided in 32-bit addressing mode must use the 64-bit edition. Note
however that the limits must be doubled to accommodate the same Prolog
application.
<P>If the system is tight on physical memory, 32-bit Prolog has the
clear advantage to use only slightly more than half of the memory of
64-bit Prolog. This argument applies as long as the application fits in
the
<EM>virtual address space</EM> of the machine. The virtual address space
of 32-bit hardware is 4GB, but in many cases the operating system
provides less to user applications. Virtual memory usage of SWI-Prolog
is roughly the program size (<EM>heap</EM>) plus the sum of the
stack-limits. If there are multiple threads, each thread has its own
stacks and the stack-limits must be summed over the running threads.
<P><A NAME="idx:RDFmemoryusage:266"></A>The only standard SWI-Prolog
library adding significantly to this calculation is the RDF database
provided by the <EM>semweb</EM> package. It uses approximately 80 bytes
per triple on 32-bit hardware and 150 bytes on 64-bit hardware. Details
depend on how many different resources and literals appear in the
dataset as well as desired additional literal indexes.
<P>Summarizing, if applications are small enough to fit comfortably in
virtual and physical memory simply take the model used by most of the
applications on the OS. If applications require more than 128MB per
stack, use the 64-bit edition. If applications approach the size of
physical memory, fit in the 128MB stack limit and fit in virtual memory,
the 32-bit version has clear advantages. For demanding applications on
64-bit hardware with more than about 6GB physical memory the 64-bit
model is the model of choice.
</BODY></HTML>
|