This file is indexed.

/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>