100% found this document useful (6 votes)
22 views

Immediate download Using OpenCL Programming Massively Parallel Computers J. Kowalik ebooks 2024

Kowalik

Uploaded by

adamougauge
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (6 votes)
22 views

Immediate download Using OpenCL Programming Massively Parallel Computers J. Kowalik ebooks 2024

Kowalik

Uploaded by

adamougauge
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 40

Download the full version of the ebook at ebookname.

com

Using OpenCL Programming Massively Parallel


Computers J. Kowalik

https://ebookname.com/product/using-opencl-programming-
massively-parallel-computers-j-kowalik/

OR CLICK BUTTON

DOWNLOAD EBOOK

Download more ebook instantly today at https://ebookname.com


Instant digital products (PDF, ePub, MOBI) available
Download now and explore formats that suit you...

Computers and Programming 1st Edition Lisa Mccoy

https://ebookname.com/product/computers-and-programming-1st-edition-
lisa-mccoy/

ebookname.com

Hidden Structure Music Analysis Using Computers David Cope

https://ebookname.com/product/hidden-structure-music-analysis-using-
computers-david-cope/

ebookname.com

Using Computers in Linguistics A Practical Guide 1st


Edition John M. Lawler

https://ebookname.com/product/using-computers-in-linguistics-a-
practical-guide-1st-edition-john-m-lawler/

ebookname.com

The Dragon and the Eagle The Rise and Fall of the Chinese
and Roman Empires 1st edition (April 4, 2014) Edition
Sunny Y. Auyang
https://ebookname.com/product/the-dragon-and-the-eagle-the-rise-and-
fall-of-the-chinese-and-roman-empires-1st-edition-
april-4-2014-edition-sunny-y-auyang/
ebookname.com
Family Therapy Techniques Integrating and Tailoring
Treatment 1st Edition Jon Carlson

https://ebookname.com/product/family-therapy-techniques-integrating-
and-tailoring-treatment-1st-edition-jon-carlson/

ebookname.com

Docker for Rails Developers Build Ship and Run Your


Applications Everywhere 1 edition (February 24, 2019)
Edition Rob Isenberg
https://ebookname.com/product/docker-for-rails-developers-build-ship-
and-run-your-applications-everywhere-1-edition-
february-24-2019-edition-rob-isenberg/
ebookname.com

The Physics and Technology of Ion Sources 2ed Edition


Brown I.G. (Ed.)

https://ebookname.com/product/the-physics-and-technology-of-ion-
sources-2ed-edition-brown-i-g-ed/

ebookname.com

Attosecond and XUV Spectroscopy Ultrafast Dynamics and


Spectroscopy 1st Edition Thomas Schultz

https://ebookname.com/product/attosecond-and-xuv-spectroscopy-
ultrafast-dynamics-and-spectroscopy-1st-edition-thomas-schultz/

ebookname.com

Topsy and Tim Go to the Zoo Jean Adamson

https://ebookname.com/product/topsy-and-tim-go-to-the-zoo-jean-
adamson/

ebookname.com
Elephant Sense and Sensibility 1st Edition Michael
Garstang

https://ebookname.com/product/elephant-sense-and-sensibility-1st-
edition-michael-garstang/

ebookname.com
USING OPENCL
Advances in Parallel Computing
This book series publishes research and development results on all aspects of parallel
computing. Topics may include one or more of the following: high-speed computing
architectures (Grids, clusters, Service Oriented Architectures, etc.), network technology,
performance measurement, system software, middleware, algorithm design,
development tools, software engineering, services and applications.

Series Editor:
Professor Dr. Gerhard R. Joubert

Volume 21
Recently published in this series
Vol. 20. I. Foster, W. Gentzsch, L. Grandinetti and G.R. Joubert (Eds.), High
Performance Computing: From Grids and Clouds to Exascale
Vol. 19. B. Chapman, F. Desprez, G.R. Joubert, A. Lichnewsky, F. Peters and T. Priol
(Eds.), Parallel Computing: From Multicores and GPU’s to Petascale
Vol. 18. W. Gentzsch, L. Grandinetti and G. Joubert (Eds.), High Speed and Large Scale
Scientific Computing
Vol. 17. F. Xhafa (Ed.), Parallel Programming, Models and Applications in Grid and
P2P Systems
Vol. 16. L. Grandinetti (Ed.), High Performance Computing and Grids in Action
Vol. 15. C. Bischof, M. Bücker, P. Gibbon, G.R. Joubert, T. Lippert, B. Mohr and F.
Peters (Eds.), Parallel Computing: Architectures, Algorithms and Applications

Volumes 1–14 published by Elsevier Science.

ISSN 0927-5452 (print)


ISSN 1879-808X (online)
Usin
ng OpeenCL
Program
mming Ma
assively Pa
arallel Com
mputers

Janu
usz Kow
walik
1647
77-107th PL NE, Bothell,, WA 98011
1, USA
and
Tadeusz PuĨnia
akowski
UG, MFI, Wit
W Stwosz Street
S 57, 80-952
8 GdaĔĔsk, Poland

Amstterdam x Berrlin x Tokyo x Washington, DC


© 2012 The authors and IOS Press.

All rights reserved. No part of this book may be reproduced, stored in a retrieval system, or
transmitted, in any form or by any means, without prior written permission from the publisher.

ISBN 978-1-61499-029-1 (print)


ISBN 978-1-61499-030-7 (online)
Library of Congress Control Number: 2012932792
doi:10.3233/978-1-61499-030-7-i

Publisher
IOS Press BV
Nieuwe Hemweg 6B
1013 BG Amsterdam
Netherlands
fax: +31 20 687 0019
e-mail: order@iospress.nl

Distributor in the USA and Canada


IOS Press, Inc.
4502 Rachael Manor Drive
Fairfax, VA 22032
USA
fax: +1 703 323 3668
e-mail: iosbooks@iospress.com

LEGAL NOTICE
The publisher is not responsible for the use which might be made of the following information.

PRINTED IN THE NETHERLANDS


This book is dedicated to Alex, Bogdan and Gabriela
with love and consideration.

v
vi
Preface
This book contains the most important and essential information required for de-
signing correct and efficient OpenCL programs. Some details have been omitted but
can be found in the provided references. The authors assume that readers are famil-
iar with basic concepts of parallel computation, have some programming experience
with C or C++ and have a fundamental understanding of computer architecture.
In the book, all terms, definitions and function signatures have been copied from
official API documents available on the page of the OpenCL standards creators.
The book was written in 2011, when OpenCL was in transition from its infancy
to maturity as a practical programming tool for solving real-life problems in science
and engineering. Earlier, the Khronos Group successfully defined OpenCL specifica-
tions, and several companies developed stable OpenCL implementations ready for
learning and testing. A significant contribution to programming heterogeneous com-
puters was made by NVIDIA which created one of the first working systems for pro-
gramming massively parallel computers – CUDA. OpenCL has borrowed from CUDA
several key concepts. At this time (fall 2011), one can install OpenCL on a hetero-
geneous computer and perform meaningful computing experiments. Since OpenCL
is relatively new, there are not many experienced users or sources of practical infor-
mation. One can find on the Web some helpful publications about OpenCL, but there
is still a shortage of complete descriptions of the system suitable for students and
potential users from the scientific and engineering application communities.
Chapter 1 provides short but realistic examples of codes using MPI and OpenMP
in order for readers to compare these two mature and very successful systems with
the fledgling OpenCL. MPI used for programming clusters and OpenMP for shared
memory computers, have achieved remarkable worldwide success for several rea-
sons. Both have been designed by groups of parallel computing specialists that per-
fectly understood scientific and engineering applications and software development
tools. Both MPI and OpenMP are very compact and easy to learn. Our experience
indicates that it is possible to teach scientists or students whose disciplines are other
than computer science how to use MPI and OpenMP in a several hours time. We
hope that OpenCL will benefit from this experience and achieve, in the near future,
a similar success.
Paraphrasing the wisdom of Albert Einstein, we need to simplify OpenCL as
much as possible but not more. The reader should keep in mind that OpenCL will
be evolving and that pioneer users always have to pay an additional price in terms
of initially longer program development time and suboptimal performance before
they gain experience. The goal of achieving simplicity for OpenCL programming re-
quires an additional comment. OpenCL supporting heterogeneous computing offers
us opportunities to select diverse parallel processing devices manufactured by differ-
ent vendors in order to achieve near-optimal or optimal performance. We can select
multi-core CPUs, GPUs, FPGAs and other parallel processing devices to fit the prob-
lem we want to solve. This flexibility is welcomed by many users of HPC technology,
but it has a price.
Programming heterogeneous computers is somewhat more complicated than
writing programs in conventional MPI and OpenMP. We hope this gap will disappear
as OpenCL matures and is universally used for solving large scientific and engineer-
ing problems.

vii
Acknowledgements
It is our pleasure to acknowledge assistance and contributions made by several per-
sons who helped us in writing and publishing the book.
First of all, we express our deep gratitude to Prof. Gerhard Joubert who has
accepted the book as a volume in the book series he is editing, Advances in Parallel
Computing. We are proud to have our book in his very prestigious book series.
Two members of the Khronos organization, Elizabeth Riegel and Neil Trevett,
helped us with evaluating the initial draft of Chapter 2 Fundamentals and provided
valuable feedback. We thank them for the feedback and for their offer of promoting
the book among the Khronos Group member companies.
Our thanks are due to NVIDIA for two hardware grants that enabled our com-
puting work related to the book.
Our thanks are due to Piotr Arłukowicz, who contributed two sections to the
book and helped us with editorial issues related to using LATEX and the Blender3D
modeling open-source program.
We thank two persons who helped us improve the book structure and the lan-
guage. They are Dominic Eschweiler from FIAS, Germany and Roberta Scholz from
Redmond, USA.
We also thank several friends and family members who helped us indirectly by
supporting in various ways our book writing effort.
Janusz Kowalik
Tadeusz Puźniakowski

How to read this book


The text and the source code presented in this book are written using different text
fonts. Here are some examples of diffrent typography styles collected.
variable – for example:
. . . the variable platform represents an object of class . . .
type or class name – for example:
. . . the value is always of type cl_ulong. . .
. . . is an object of class cl::Platform. . .
constant or macro – for example:
. . . the value CL_PLATFORM_EXTENSIONS means that. . .
function, method or constructor – for example:
. . . the host program has to execute clGetPlatformIDs. . .
. . . can be retrieved using cl::Platform::getInfo method. . .
. . . the context is created by cl::Context construcor. . .
file name – for example:
. . . the cl.h header file contains. . .
keyword – for example:
. . . identified by the __kernel qualifier. . .

viii
Contents

1 Introduction 1
1.1 Existing Standard Parallel Programming Systems . . . . . . . . . . . . . . 1
1.1.1 MPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.2 OpenMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Two Parallelization Strategies: Data Parallelism and Task Parallelism . 9
1.2.1 Data Parallelism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2.2 Task Parallelism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2.3 Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3 History and Goals of OpenCL . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.3.1 Origins of Using GPU in General Purpose Computing . . . . . . 12
1.3.2 Short History of OpenCL . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4 Heterogeneous Computer Memories and Data Transfer . . . . . . . . . . 14
1.4.1 Heterogeneous Computer Memories . . . . . . . . . . . . . . . . . 14
1.4.2 Data Transfer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.4.3 The Fourth Generation CUDA . . . . . . . . . . . . . . . . . . . . . 15
1.5 Host Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.5.1 Phase a. Initialization and Creating Context . . . . . . . . . . . . 17
1.5.2 Phase b. Kernel Creation, Compilation and Preparations . . . . . 17
1.5.3 Phase c. Creating Command Queues and Kernel Execution . . . 17
1.5.4 Finalization and Releasing Resource . . . . . . . . . . . . . . . . . 18
1.6 Applications of Heterogeneous Computing . . . . . . . . . . . . . . . . . . 18
1.6.1 Accelerating Scientific/Engineering Applications . . . . . . . . . 19
1.6.2 Conjugate Gradient Method . . . . . . . . . . . . . . . . . . . . . . 19
1.6.3 Jacobi Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.6.4 Power Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.6.5 Monte Carlo Methods . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.6.6 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.7 Benchmarking CGM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.7.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.7.2 Additional CGM Description . . . . . . . . . . . . . . . . . . . . . . 24
1.7.3 Heterogeneous Machine . . . . . . . . . . . . . . . . . . . . . . . . 24
1.7.4 Algorithm Implementation and Timing Results . . . . . . . . . . 24
1.7.5 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

ix
2 OpenCL Fundamentals 27
2.1 OpenCL Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.1.1 What is OpenCL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.1.2 CPU + Accelerators . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.1.3 Massive Parallelism Idea . . . . . . . . . . . . . . . . . . . . . . . . 27
2.1.4 Work Items and Workgroups . . . . . . . . . . . . . . . . . . . . . . 29
2.1.5 OpenCL Execution Model . . . . . . . . . . . . . . . . . . . . . . . . 29
2.1.6 OpenCL Memory Structure . . . . . . . . . . . . . . . . . . . . . . . 30
2.1.7 OpenCL C Language for Programming Kernels . . . . . . . . . . . 30
2.1.8 Queues, Events and Context . . . . . . . . . . . . . . . . . . . . . . 30
2.1.9 Host Program and Kernel . . . . . . . . . . . . . . . . . . . . . . . . 31
2.1.10 Data Parallelism in OpenCL . . . . . . . . . . . . . . . . . . . . . . 31
2.1.11 Task Parallelism in OpenCL . . . . . . . . . . . . . . . . . . . . . . 32
2.2 How to Start Using OpenCL . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.2.1 Header Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.2.2 Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.2.3 Compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.3 Platforms and Devices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.3.1 OpenCL Platform Properties . . . . . . . . . . . . . . . . . . . . . . 36
2.3.2 Devices Provided by Platform . . . . . . . . . . . . . . . . . . . . . 37
2.4 OpenCL Platforms – C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.5 OpenCL Context to Manage Devices . . . . . . . . . . . . . . . . . . . . . . 41
2.5.1 Different Types of Devices . . . . . . . . . . . . . . . . . . . . . . . 43
2.5.2 CPU Device Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.5.3 GPU Device Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.5.4 Accelerator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.5.5 Different Device Types – Summary . . . . . . . . . . . . . . . . . . 44
2.5.6 Context Initialization – by Device Type . . . . . . . . . . . . . . . 45
2.5.7 Context Initialization – Selecting Particular Device . . . . . . . . 46
2.5.8 Getting Information about Context . . . . . . . . . . . . . . . . . . 47
2.6 OpenCL Context to Manage Devices – C++ . . . . . . . . . . . . . . . . . 48
2.7 Error Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.7.1 Checking Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.7.2 Using Exceptions – Available in C++ . . . . . . . . . . . . . . . . 53
2.7.3 Using Custom Error Messages . . . . . . . . . . . . . . . . . . . . . 54
2.8 Command Queues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
2.8.1 In-order Command Queue . . . . . . . . . . . . . . . . . . . . . . . 55
2.8.2 Out-of-order Command Queue . . . . . . . . . . . . . . . . . . . . 57
2.8.3 Command Queue Control . . . . . . . . . . . . . . . . . . . . . . . 60
2.8.4 Profiling Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
2.8.5 Profiling Using Events – C example . . . . . . . . . . . . . . . . . . 61
2.8.6 Profiling Using Events – C++ example . . . . . . . . . . . . . . . 63
2.9 Work-Items and Work-Groups . . . . . . . . . . . . . . . . . . . . . . . . . 65
2.9.1 Information About Index Space from a Kernel . . . . . . . . . . 66
2.9.2 NDRange Kernel Execution . . . . . . . . . . . . . . . . . . . . . . 67
2.9.3 Task Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
2.9.4 Using Work Offset . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

x
2.10 OpenCL Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
2.10.1 Different Memory Regions – the Kernel Perspective . . . . . . . . 71
2.10.2 Relaxed Memory Consistency . . . . . . . . . . . . . . . . . . . . . 73
2.10.3 Global and Constant Memory Allocation – Host Code . . . . . . 75
2.10.4 Memory Transfers – the Host Code . . . . . . . . . . . . . . . . . . 78
2.11 Programming and Calling Kernel . . . . . . . . . . . . . . . . . . . . . . . . 79
2.11.1 Loading and Compilation of an OpenCL Program . . . . . . . . . 81
2.11.2 Kernel Invocation and Arguments . . . . . . . . . . . . . . . . . . 88
2.11.3 Kernel Declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
2.11.4 Supported Scalar Data Types . . . . . . . . . . . . . . . . . . . . . 90
2.11.5 Vector Data Types and Common Functions . . . . . . . . . . . . . 92
2.11.6 Synchronization Functions . . . . . . . . . . . . . . . . . . . . . . . 94
2.11.7 Counting Parallel Sum . . . . . . . . . . . . . . . . . . . . . . . . . 96
2.11.8 Parallel Sum – Kernel . . . . . . . . . . . . . . . . . . . . . . . . . . 97
2.11.9 Parallel Sum – Host Program . . . . . . . . . . . . . . . . . . . . . 100
2.12 Structure of the OpenCL Host Program . . . . . . . . . . . . . . . . . . . . 103
2.12.1 Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
2.12.2 Preparation of OpenCL Programs . . . . . . . . . . . . . . . . . . . 106
2.12.3 Using Binary OpenCL Programs . . . . . . . . . . . . . . . . . . . . 107
2.12.4 Computation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
2.12.5 Release of Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
2.13 Structure of OpenCL host Programs in C++ . . . . . . . . . . . . . . . . . 114
2.13.1 Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
2.13.2 Preparation of OpenCL Programs . . . . . . . . . . . . . . . . . . . 115
2.13.3 Using Binary OpenCL Programs . . . . . . . . . . . . . . . . . . . . 116
2.13.4 Computation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
2.13.5 Release of Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
2.14 The SAXPY Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
2.14.1 Kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
2.14.2 The Example SAXPY Application – C Language . . . . . . . . . . 123
2.14.3 The example SAXPY application – C++ language . . . . . . . . 128
2.15 Step by Step Conversion of an Ordinary C Program to OpenCL . . . . . 131
2.15.1 Sequential Version . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
2.15.2 OpenCL Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . 132
2.15.3 Data Allocation on the Device . . . . . . . . . . . . . . . . . . . . . 134
2.15.4 Sequential Function to OpenCL Kernel . . . . . . . . . . . . . . . 135
2.15.5 Loading and Executing a Kernel . . . . . . . . . . . . . . . . . . . . 136
2.15.6 Gathering Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
2.16 Matrix by Vector Multiplication Example . . . . . . . . . . . . . . . . . . . 139
2.16.1 The Program Calculating mat r i x × vec t or . . . . . . . . . . . . 140
2.16.2 Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
2.16.3 Experiment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
2.16.4 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

3 Advanced OpenCL 147


3.1 OpenCL Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
3.1.1 Different Classes of Extensions . . . . . . . . . . . . . . . . . . . . 147

xi
3.1.2 Detecting Available Extensions from API . . . . . . . . . . . . . . 148
3.1.3 Using Runtime Extension Functions . . . . . . . . . . . . . . . . . 149
3.1.4 Using Extensions from OpenCL Program . . . . . . . . . . . . . . 153
3.2 Debugging OpenCL codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
3.2.1 Printf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
3.2.2 Using GDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
3.3 Performance and Double Precision . . . . . . . . . . . . . . . . . . . . . . 162
3.3.1 Floating Point Arithmetics . . . . . . . . . . . . . . . . . . . . . . . 162
3.3.2 Arithmetics Precision – Practical Approach . . . . . . . . . . . . . 165
3.3.3 Profiling OpenCL Application . . . . . . . . . . . . . . . . . . . . . 172
3.3.4 Using the Internal Profiler . . . . . . . . . . . . . . . . . . . . . . . 173
3.3.5 Using External Profiler . . . . . . . . . . . . . . . . . . . . . . . . . 180
3.3.6 Effective Use of Memories – Memory Access Patterns . . . . . . . 183
3.3.7 Matrix Multiplication – Optimization Issues . . . . . . . . . . . . 189
3.4 OpenCL and OpenGL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
3.4.1 Extensions Used . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
3.4.2 Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
3.4.3 Header Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
3.4.4 Common Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
3.4.5 OpenGL Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . 198
3.4.6 OpenCL Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . 201
3.4.7 Creating Buffer for OpenGL and OpenCL . . . . . . . . . . . . . . 203
3.4.8 Kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
3.4.9 Generating Effect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
3.4.10 Running Kernel that Operates on Shared Buffer . . . . . . . . . . 215
3.4.11 Results Display . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
3.4.12 Message Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
3.4.13 Cleanup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
3.4.14 Notes and Further Reading . . . . . . . . . . . . . . . . . . . . . . . 221
3.5 Case Study – Genetic Algorithm . . . . . . . . . . . . . . . . . . . . . . . . 221
3.5.1 Historical Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
3.5.2 Terminology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
3.5.3 Genetic Algorithm . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
3.5.4 Example Problem Definition . . . . . . . . . . . . . . . . . . . . . . 225
3.5.5 Genetic Algorithm Implementation Overview . . . . . . . . . . . 225
3.5.6 OpenCL Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
3.5.7 Most Important Elements of Host Code . . . . . . . . . . . . . . . 234
3.5.8 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
3.5.9 Experiment Results . . . . . . . . . . . . . . . . . . . . . . . . . . . 241

A Comparing CUDA with OpenCL 245


A.1 Introduction to CUDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
A.1.1 Short CUDA Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 245
A.1.2 CUDA 4.0 Release and Compatibility . . . . . . . . . . . . . . . . . 245
A.1.3 CUDA Versions and Device Capability . . . . . . . . . . . . . . . . 247
A.2 CUDA Runtime API Example . . . . . . . . . . . . . . . . . . . . . . . . . . 249
A.2.1 CUDA Program Explained . . . . . . . . . . . . . . . . . . . . . . . 251

xii
A.2.2 Blocks and Threads Indexing Formulas . . . . . . . . . . . . . . . 257
A.2.3 Runtime Error Handling . . . . . . . . . . . . . . . . . . . . . . . . 260
A.2.4 CUDA Driver API Example . . . . . . . . . . . . . . . . . . . . . . . 262

B Theoretical Foundations of Heterogeneous Computing 269


B.1 Parallel Computer Architectures . . . . . . . . . . . . . . . . . . . . . . . . 269
B.1.1 Clusters and SMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
B.1.2 DSM and ccNUMA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
B.1.3 Parallel Chip Computer . . . . . . . . . . . . . . . . . . . . . . . . . 270
B.1.4 Performance of OpenCL Programs . . . . . . . . . . . . . . . . . . 270
B.2 Combining MPI with OpenCL . . . . . . . . . . . . . . . . . . . . . . . . . . 277

C Matrix Multiplication – Algorithm and Implementation 279


C.1 Matrix Multiplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
C.2 Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
C.2.1 OpenCL Kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
C.2.2 Initialization and Setup . . . . . . . . . . . . . . . . . . . . . . . . . 280
C.2.3 Kernel Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
C.2.4 Executing Kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282

D Using Examples Attached to the Book 285


D.1 Compilation and Setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
D.1.1 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
D.1.2 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286

Bibliography and References 289

xiii
xiv
Chapter 1

Introduction

1.1. Existing Standard Parallel Programming Systems


The last decade of the 20th century and the first decade of the 21st century can be
called the Era of Parallel Computing. In this period of time, not only were extremely
powerful supercomputers designed and built, but two de facto standard parallel pro-
gramming systems for scientific and engineering applications were successfully intro-
duced worldwide. They are MPI (Message Passing Interface) for clusters of comput-
ers and OpenMP for shared memory multi-processors. Both systems are predecessors
of the subject of this book on OpenCL. They deserve short technical description and
discussion. This will help to see differences between the older MPI/OpenMP and the
newest OpenCL parallel programming systems.

1.1.1. MPI
MPI is a programming system but not a programming language. It is a library of func-
tions for C and subroutines for FORTRAN that are used for message communication
between parallel processes created by MPI. The message-passing computing model
(Fig. 1.1) is a collection of interconnected processes that use their local memories
exclusively. Each process has an individual address identification number called the
rank. Ranks are used for sending and receiving messages and for workload distribu-
tion. There are two kinds of messages: point-to-point messages and collective mes-
sages. Point-to-point message C functions contain several parameters: the address of
the sender, the address of the receiver, the message size and type and some additional
information. In general, message parameters describe the nature of the transmitted
data and the delivery envelope description.
The collection of processes that can exchange messages is called the communica-
tor. In the simplest case there is only one communicator and each process is assigned
to one processor. In more general settings, there are several communicators and sin-
gle processors serve several processes. A processor rank is usually an integer number
running from 0 to p-1 where p is the total number of processes. It is also possible to
number processes in a more general way than by consecutive integer numbers. For
example, their address ID can be a double number such as a point (x, y) in Carte-

1
Exploring the Variety of Random
Documents with Different Content
kohtuutta lappalaisiin nähden, pysymällä oikeudessa. Kuuluisa
Lundin yliopiston professori J. W. Zetterstedt ei anna heistä
parempaa todistusta, kuin että he ovat tuskin sieluttomia
luontokappaleita paremmat. Englantilainen kapteeni Coppet Brooke
mainitsee, että lappalaisten porot juoksevat 30 penikulmaa
vuorokaudessa ja että porojen täytyy ainakin kerta vuodessa
maistaa merivettä, muutoin ne menehtyvät. Parhaat ja reippaimmat
porot tavataan kuitenkin Inarissa ja Sompiossa, mutta merta ne eivät
ole koskaan nähneet, vielä vähemmin maistaneet sen vettä. Antti
Juhana Sjögren mainitsee, että Lapissa tavataan tulenkarvaisia
kettuja. Jos luettelisi kaikki ne kummallisuudet, joita jotkut
matkustajat, hätimmiten kuljettuansa maassa, kertovat
huomanneensa Lapissa ja lappalaisissa, saisi kokoon aimo kirjan
hullutuksia ja valheita. He eivät kuitenkaan ole tätä tehneet
ilkeämielisyydestä tätä turvatonta kansaa vastaan; mutta he ovat
arvostelematta käyttäneet niitä kertomuksia, jotka naapureissa,
usein ammoisilta ajoilta, ovat lappalaisista käymässä, eikä yksikään
heistä ole ottanut vaivakseen perinpohjin tutustua lappalaisten
luonteeseen, tositapoihin ja elämänmuotoihin. Semmoisissa
tapauksissa tulokset ovat yhtä todenperäisiä kuin jos tahdottaisiin
arvostella Tukholmaa niiden kertomusten perustuksella, joita
Bellman antaa muutamista kapakoista ja niiden irstaista roikaleista.
Tosin on lappalainen viinaan menevä, ja kun hänet tapaa
norjalaisissa markkinapaikoissa, joissa kauppiaalla muun kauppansa
ohessa myös on kapakkaliike, hän tosin sattuu olemaan juovuksissa,
joka kyllä tapahtuu kirkkomatkoillakin, jos niissä ilmaantuu
kapakoitsija tahi kemuja vietetään. Mutta valitettavasti on
semmoisissa tilaisuuksissa viina kaikkien pohjoisten kansojen,
vanhojen ja nuorten, maitona ja ilojuomana. [Paitsi
Laestadiusveljesten teoksissa en ole, aina Högströmin jälkeisiltä
ajoilta saakka, lukenut lappalaisista mitään, joka perustuu todelliseen
asiantuntemiseen.] Mutta on monta lappalaista Lapin sisämaassa,
jotka niissäkin tilaisuuksissa esiintyvät yhtä siivosti ja raittiina, kuin
moni muu rahvas; niinpä esim. Inarin ja Karasjoen lappalainen, jota
raittiuteen nähden saattaa verrata mihin pohjoiseen kansaan
tahansa. Mutta se joka käy lappalaisten luona heidän kodeissaan, ja
tahtoo tutustua heidän kotoiseen elämäänsä, luonteeseensa ja
tapoihinsa, ei epäilekään antaessaan heistä edullisemman
arvostelun. Hän huomaa silloin, että he ovat hyviä, rauhaisia,
Jumalata pelkääviä, siveellisiä, tyytyväisiä, ja heidän hyvät
ominaisuutensa täytyy hänen piankin tunnustaa voittavan ne
heikkoudet, joita heissä ei käy kieltäminen. Ihmetellen, liikutettuna ja
kunnioittaen huomaa hän heidän elävän tyytyväisinä semmoisissa
oloissa, jotka kauhistuttavat sivistynyttä ihmistä. Ne voittavat
rannikon itäiset ja läntiset naapurinsa rehellisyydessä ja
uskollisuudessa, niillä on luonnostaan hyvä ymmärrys ja oppimiseen
he ovat halukkaat, mutta verrattuina suomalaisiin ei heillä ole samaa
työkykyä siinä, missä tarmoa, kestävyyttä ja kärsivällisyyttä
vaaditaan. Lukemista he harrastavat, ja harrastaisivat enemmänkin,
jollei heitä opetettaisi vieraalla kielellä, vaan saisivat omankielisiä
oppikirjoja, niistä ammentaakseen uskonnon totuuksia. Moni
harhaluulo on lappalaisiin vielä juurtunut, mutta he luottavat
vähemmän noituuteen ja loitsuihin kuin Lapin suomalaiset ja
venäläiset. Muuten harjotetaan enemmän loitsuja venäläisessä kuin
muussa Lapissa. Venäjän Lapissa on lappalaisia aina kohdeltu
säälivämmin kuin Suomen ja Norjan Lapissa. Niille on aina
myönnetty sama oikeus maahan ja veteen kuin venäläisille, eikä
heitä rangaista kuolemalla tai maanpaolla heidän taikauskonsa ja
noituutensa tähden. Mutta niiden opetuksesta pidetään vähemmän
huolta.
Saavuin kerran Martti Pietarinpoika Paadarin mökkiin. Sinne
kokoontui suuri matkustajajoukko. Ei mahtunut kymmeneskään osa
pirttiin. Nuotioita viritettiin mäelle. Nämä tulet, sadottain poroja ja
lappalaiset pyhäpuvuissaan, täyttivät koko kummun ja näyttämö oli
komein mitä Lapin erämaassa olen nähnyt. Paadar polveutui
vanhasta lappalaissuvusta ja oli hurskas ukko. Hän pyysi minua
luettamaan omia lapsiansa ja toistenkin, jotka olivat tänne tulleet
pappia näkemään ja lukemaan hänen edessään. Kuulustelu ja se
hartaus, jolla sitä seurattiin, teki olon tässä matalassa majassa
mieluisaksi. Kovin hauskaa oli mielestäni nähdä vanhan Paadarin
sydämellistä iloa, kun lapset vastasivat selvästi ja täsmälleen
helppoihin uskonnonkysymyksiin, lukivat ja tavasivat pieniä lehtisiä,
joilla heitä palkitsin. Kuinka onnellinen onkaan ihminen, ajattelin, kun
hänellä ei ole tarpeita, ja kuinka onneton hän onkaan, kun hän
onnea kaukaa etsii ja luo itselleen väärän ja katoavan ilon. Tällä
perheellä ei ollut juuri mitään, mutta siltä ei puuttunutkaan mitään.
Mäntymetsä oli likellä ja siellä runsaasti pettua. Suot olivat muuramia
ja joenrannat kenkäheinää täynnä.

Mutta paljon on lappalaisessa taikauskoakin. Niinpä uskottiin ja


kerrottiin erityisenä sankaruutena, että palvelijani, kun pappi, johon
eivät mitkään aaveet ja salaiset voimat pysty, oli matkoilla, rohkeni
asua niin likellä kirkkoa, kuin Utsjoen pappilassa. Ei yksikään
lappalainen Utsjoella ole, papin poissaollessa, yöpynyt kirkon lähellä,
vaan rientää ohitse ainakin puolen penikulman päähän. Jopa kirjaan
pystyväisimmätkin ja arvokkaimmat lappalaiset, kuten he itse ovat
minulle kertoneet, mieluummin yöpyvät synkässä metsässä, kuin
yksin markkinakojuissa kirkon luona. Kun pappi on paikalla uskotaan
aaveiden pysyvän hiljaa ja levossa. Niin kuitenkaan ei ollut laita
erään välipapin aikana, sillä lappalaiset luulivat hänen pelänneen
aaveita, jonka vuoksi aaveetkaan eivät hänestä välittäneet.
*****

Lappalaisten sovinnollisuus on ehkä seurauksena heidän


hitaudestaan ja kylmäverisyydestään. Tosin he, vaikka varsin
harvoin, puolihumalassa joutuvat riitaan ja sanakahakkaan, jopa on
nähty korvapuustejakin annettavan, mutta harvoin, ainakaan ei heti,
samalla tavalla vastataan, joskus monen minuutin kuluttua. Joskus
kuluu koko neljännestuntikin valmistukseen. Tavallisesti taotaan
nyrkkiä jotakin puuta vastaan uhkauksia ladellen, ennenkuin
rohjetaan lyödä toista poskelle. Sillä välin voi koko isku unhottua ja
riitaveljelle annetaan anteeksi, tai syytetään häntä papin edessä.
Joskus käytetäänkin sentähden sunnuntai-illat semmoisten pienten
loukkausten sovittamiseen. Niinpä tuotiin eteeni kaksi serkkua, joita
jo kirkonisäntä ja lukkari olivat turhaan varottaneet. Nuo olivat
leppymättömimmät lappalaiset, mitä tapasin. En ollut vielä silloin
kieleen hyvin perehtynyt, enkä ollut viiteen viikkoon kuullut lappia
puhuttavan, jonka tähden asia käsiteltiin tulkin avulla. Toinen oli
sanonut tahtovansa tapella, johon toinen oli vastannut: "papin luona
en rohkene, mutta menkäämme muualle." He menivätkin ulos ja
luulin heidän sopineen. Tuskin olivat he kuitenkaan päässeet 10
sylen päähän, kun toinen, muistuttaen lupausta, vaati taisteluun. "En
rohkene vielä täälläkään", vastasi toinen, "pappi on huomannut
pahat aikeemme." Vasta virstan päässä olivat he pysähtyneet ja
piesseet toisiansa veriin ja sinelmiin asti. Siinä tilassa he eivät
uskaltaneet jäädä kirkolle, vaan lähtivät samassa veneessä kotiin.
Seuraavassa kokouksessa saivat he kumpikin hyvin ansaittuja
moitteita, pyysivät anteeksi ja saivatkin, ehdolla ettei heidän kesken
enään koskaan syntyisi vihaa ja toraa. Ei ole senjälkeen heistä
kuulunut muuta kuin hyvää. Nämä olivat kalastajia.
Vieläkin rauhallisemmat, jopa kylmäkiskoisemmat ovat inarilaiset.
Kun kuulevat saarnattavan siitä, kuinka huonosti ihminen korvaa
Jumalan hyvyyden ja Kristuksen ansion, saattavat he kyllä itkeä
omaa kurjuuttaan, mutta ani harvoin olen nähnyt heidän itkevän
vanhempiensa tai lastensa haudalla; päinvastoin iloitsevat siitä, että
he ovat kuolleet rauhassa, päässeet siunattuun maahan ja nyt
saaneet vaihtaa maalliset huolet ijankaikkiseen kunniaan. Tämän
maailman ihmisille olisi ehkä, arvelevat he, hänestä voinut olla
maallista hyötyä, mutta kaiketi oli poislähtö hänelle hyödyllisempi
kuin nämät katoavat edut; muutoin ei Herra olisi häntä ottanut pois.
Hänhän ei tee mitään, joka ei olisi hyödyksemme, ja pitkäkö on
aikamme täällä.

Ei saata kylliksi ihmetellä, kun näkee miten vähään lappalainen


tyytyy, joutumatta epätoivoon tai valittamatta. Kerran matkallani
Inariin yövyin leski Anna Mikontyttären Aikion luona Vastusjavrella.
Hänen miehensä oli äsken kuollut. Pata oli jo ennen tultuani tulella,
mutta siinä ei ollut muuta kuin pettua, ja sillä oli ravittava 6 lasta koko
päivä. Kuitenkin oli hän hyvällä mielellä ja huoleton sanoessaan:
"minun täytyy huomenna seurata sinua kirkolle, jotta siunaisit
mieheni hautaan; kyytimiehesi lupasi minulle poron, jolla kuljen
seurassasi". "Eikö sinulla ole omia poroja?" kysyin. "Ei ole, ne
kuolivat kaikki viime syksynä, eikä niitä monta ollutkaan". "Onko
sinulla lampaita." "Viimeiset vei susi keväällä". Mitä enemmän tutkin,
sitä vähemmin talossa tapasin, niin että hänen koko omaisuutensa
supistui puoleen leiviskään lihaa ja muutamiin kuivattuihin kaloihin, ja
sittenkin hän lausui: "Kyllä Jumala ruokkii lapsensa; ei hän ole
antanut kenenkään omansa kuolla nälkään, ja niitä, jotka häneen
uskovat, hän ei hylkää." Tätä usein liiallista luottamusta
kaitselmuksen apuun ei ollut yksin hänessä, vaan sitä tavataan
useimmissa inarilaisissa. Heti tuon vaimon kirkolle tultua sukulaiset
ja ystävät saivat tiedon hänen kohtalostaan, ja he pitivät huolen
hänen talvisesta ravinnostaan ja olivat hänen apunaan
kalastuksessa suvella. Hänen sanansa kävivät toteen; Jumala ei
sallinut hänen ja hänen viattomain lastensa nääntyä kurjuuteen.
Seuraavana suvena hän löysi kolme ketunpesää ja ruokki yhdeksän
ketunpenikkaa, joista hän seuraavilla Inarin joulumarkkinoilla sai
suuremman tulon kuin moni työhön kykenevä, joka koko suven oli
kyntänyt Jäämeren aaltoja. Nykyään ovat kaikki lapset täyskasvuisia
ja voivat auttaa muita, joskaan ei tavaroilla, ne kun ovat
paikkakunnalla harvinaisia, niin ainakin työllä ja palveluksella; ja
paljonko tarvitsee toimeentuloonsa se, joka on tottunut olemaan
melkein kaiken puutteessa.

*****

Ei mikään, joka ei ole kerrassaan välttämätöntä, houkuttele


lappalaista. Mutta kun hätä pakottaa, ei häntä arveluta suurimmalla
uskaliaisuudella uhmata jokia ja koskia, kallioita ja karia, tahi kyntää
kehnolla veneellään Jäämeren aaltoja ja hyökylaineita. Vähillä
eväillä, jopa ilman niitä, hän syksyllä lähtee kaukaisiin
tunturiseutuihin metsäpeuroja pyytämään ja palaa vasta 5 — 6 viikon
perästä. Joka paikassa, missä hän on kaatanut peuran, hän
valmistaa säilytyspaikan, johon saalis pannaan, perittäväksi talvella
tahi hän upottaa lihat vuolaaseen virtaan, kiviä painona, ettei niitä vie
muassaan virta tai syö karhut ja ahmat. Sillä välin kotona oleva
vaimo lapsineen pitää jo kultaisena sorsien ja metsähanhien
sulkasadon aikaa, jolloin hän niitä saa käsin kiinni päivän ruuaksi.
Vaikka Inarin lappalainen on muita lappalaisia köyhempi, on hän
kuitenkin kansansa itsetietoisin. Hänen suuri etevyytensä
kristinuskossa, lukutaidossa, siveellisyydessä ja arvokkaassa
esiintymisessä tekee, ettei hän tervehtiessäänkään antaudu
kaikenlaisiin lörpötyksiin kuten usein muut lappalaiset. Tavalliset
sanansa ovat: "Kiitos Jumalan, että olet terve." "Onko maassa
rauha?" Sillä rauhalla hän ei tarkoita yksinomaan sodan sallimaa,
vaan myös susien tuhotöiden, tautien ja muitten onnettomuuksien
väliaikaa. Saatuansa kuulla, ettei esivalta eivätkä muut
kansalaisensa ole pahaa kärsineet, sanoo hän jäähyväiset.
Tervehdyksessäkin hän eroaa muista. Hän vain tarjoaa kätensä ja
sinuttelee jokaista. Useimmat muut, kuten Utsjoen ja Norjan
lappalaiset, suutelevat ensin kättänsä ennenkuin tarjoovat sitä
papille tahi muulle virkamiehelle, jota kunnioittavat. Muut, etenkin
sukulaiset, tervehtivät toisiansa siten, että he painavat poskensa
toisen poskeen. Venäjän ja muutamat Ruotsin lappalaiset, etenkin
ne, joiden kieli on Venäjän lapinkielen sukua, tervehtivät toisiansa
nenänpäitä yhdistämällä.

Kun on saavuttu kirkkojuhliin ruvetaan heti tervehtimisen jälkeen


puhdistamaan asuinhuonetta. Tietysti ensin luodaan lumi pois.
Toinen hakkaa halkoja, toinen vie porot laitumelle, jossa vanhemmat
käyvät irrallaan, mutta nuoremmat pannaan liekaan. Tämän tehtyä
kannetaan ruokavarat sisään. Illallisen jälkeen toimitetaan yhteinen
rukous.
V.

Porontaljojen näytteellepano.

Kalastus v. 1825 ei ollut tuottava Inarissa, mutta harvoin oli saatu


iloita semmoisesta siunauksesta mantereella kuin sinä vuonna. Kun
pitkänäperjantaina palasin kirkosta olivat tienvarret melkein koko
kirkon ja Inarin kirkonkylän tahi kirkkopirttien välillä, kummallakin
puolella porotaljojen peitossa. Laki, tahi ehkä oikeammin isiltä peritty
tapa, jota inarilaiset pitävät pyhänä, sallii niiden, jotka tuntureilla
tapaavat poroja peurojen joukossa, ampua porot, kuitenkin sillä
ehdolla, että talja tuodaan omistajalle ja vain liha joutuu ampujan
omaksi. Mutta kun ei tunneta kaikkia poromerkkejä, niin ovat ne
taljat, joissa on vieraan omistajan merkki korvassa, asetettavat
yleisesti nähtäviksi kirkkotien varrelle kolmena sunnuntaina, jolloin
jumalanpalvelusta pidetään. Jollei sillä ajalla omistajaa ilmaannu, on
taljakin ampujan oma, jos poro on ammuttu Inarin tunturiseudussa.
Merkittyjä poroja, jotka oleskelevat metsämailla, sitävastoin ei pidetä
kokonaan menetettyinä, vaikka kulkevatkin metsäpeurojen parissa,
sillä ne voivat vielä liittyä kesyjen laumaan, ja siten joutua takaisin
omistajalleen. Eikä siinä kyllin, ne voivat joskus vielä tuottaa
omistajalleen sen hyödynkin, että tuovat muassaan niitä
metsäpeuroja, jotka suvella liittyvät kesyihin poroihin. Semmoista
metsäpeuraa pidetään näet sen omana, joka heittää suopunkinsa
sen kaulaan, tahi sen kesyttää, tahi jonka laumassa se tavataan. Se
on tavallisesti sekä väkevämpi että kestävämpi ajoporona, mutta
myös vallattomampi, kiukkuisempi ja uppiniskaisempi kuin
syntymisestään kesyt porot. Väitetäänkin että Inarin porot ovat
voimakkaammat kuin muiden Lapin paikkakuntien, juuri sentähden,
että ne suvisin, etenkin kiiman aikana, oleskelevat peurojen parissa.
Jotensakin usein ammutaan myös peurojen joukosta poroja, joiden
merkkiä ei tunne kukaan tänne jouluksi kokoontuneesta kansasta.
Semmoisten porojen luullaan tulleen tänne aina Kajaanin tai Karjalan
paikoilta metsäpeurojen seurassa, jotka täältä ovat samoilleet
etelään ja sitten palanneet tänne. Kummallista on muuten, kuinka
kaukaa lappalainen voi nähdä onko porolla merkki korvassa vai ei,
jonka tähden hän, tavatessaan metsäpeuroja, joiden joukossa on
myöskin merkitty poro, erehtymättä ampuu merkitsemättömän, jotta
ei olisi pakko saalista jakaa poronomistajan kanssa. Ani harvoin
tapahtuu, että ajoporo, ollessaan laitumella, liittyy metsäpeuroihin ja
jää sille matkalle.

Tavallista enemmän majaviakin olivat inarilaiset tänä vuonna


saaneet pyydetyiksi, kaikki Venäjän Lapista. Venäjän lappalaiset,
jotka eivät ole kehuttavia metsämiehiä, ehkä sentähden että
kalarikas Tulomanjoki antaa niille riittävästi elatusta, sallivat meidän
lappalaistemme pientä veroa vastaan, tavallisesti naarasporo
talvesta, metsästää heidän avaroilla alueillaan. Metsästyksen
onnistumisesta riippuu veron suuruus.
VI.

Käynti Matti Samulin luona.

Syyskuun 23 p:nä 1826 laski kaksi venekuntaa pappilan rantaan.


Toinen venekunta oli tullut noutamaan minut papin toimitukseen
Vesterjargaan, kaksi penikulmaa pappilasta Tenojokea myöten,
toinen etsiäksensä pari penikulmaa pohjoiseen Utsjoen pappilasta
hongankantoja, saadaksensa sopivia tervaksia käytettäviksi
tuulastuskalastuksessa. Ilma oli leuto, kun me lähdimme
sunnuntaina syyskuun 24 p:nä, joksi päiväksi ei ollut kuulutettu
mitään kokousta. Aurinko paistoi ihanasti vuorilla, kun pääsimme
Utsjoen suulle. Halusin tällä matkallani käydä kirkkoisännän Laitin
luona, jota lappalaiset nimittivät Matti Samuliksi. Yksinään vanhus
istui mättäällä turvekojunsa edustalla Erik Sorolaisen postilla
kädessään, ja katse suunnattuna laskevaa aurinkoa kohden. Kauvan
seisoin katselemassa ukkoa, joka minua ei huomannut ennenkuin
häiritsin häntä hänen hurskaissa mietelmissään. Hän iloitsi tulostani
ja rupesi kertomaan, kuinka hänelläkin oli ollut tässä paikassa hyvä
toimeentulo, kun hän, maailman mieltä täynnänsä, palveli
mammonaa, mutta kuinka hän nyt, kun hän oli menettänyt maalliset
hyvät, omisti aarteen taivaassa ja ikävöi sinne. Vuoden 1798
pakkas-talven jälkeen oli jää Tenojoessa tavallista paksumpi.
Lumensulaminen, joka alkoi vasta kesäkuussa, oli käynyt tavattoman
nopeasti. Jääpadot sulkivat vedenkulun ja vesi yhtenä yönä nousi
muutamia syliä. Tuolla, hän viittasi pohjoiseen, oli jääpato. Siellä
menetin mitä minulla oli rakkainta, kaksi lastani. Kristus erosi usein
ihmisten parista etsien yksinäisyyttä, ja silloin enkelit astuivat
taivaasta häntä palvelemaan. Minäkin joskus tarvitsen yksinäisyyttä
palvellakseni Jumalaa ja ylistääkseni hänen töitänsä taivaan ihanan
laen alla, jossa hänen enkelinsä minua suojelevat ja hänen
suuruutensa ilmenee tähdissä. Kaikesta, mikä minua ympäröitsee,
huomaan Jumalan valoa ja suuruutta. Hiljaisesti miettien Jumalan
sanaa opin tuntemaan kuinka Jumala rakasti maailmaa. Minulla ovat
seuralaisina Mooses ja profeetat. Olen, niinkuin Paavalikin,
nuoruudessani ollut suuri syntinen, ja olen vieläkin; mutta Jumalan
armo on suuri. Mies-ijässä olen koettanut noudattaa apostolin
esimerkkiä antautuen katumukseen ja sovinnollisuuteen, ja Jumala
on kuullut rukoukseni. Hän on keventänyt sydäntäni ja rauhoittanut
mieleni. Hän on lahjoittanut minulle lohdutuksen.

Siten puhui Laiti. Hän oli yksi niistä kuudesta lappalaispojasta,


joita nuorina kruunun kustannuksella käytettiin koulussa silloisen
Utsjoen pastorin luona, valmistettaviksi katekeetoiksi Lapissa.
Semmoinen toimi onkin hänellä ollut enemmän kuin 30 vuotta, mutta
jo aikoja sitten hän siitä luopui, sanoen syyksi, ettei hän enään
pakkasen tähden kestänyt oleskelua tunturilappalaisten teltoissa
talvisin. Hän olikin jo vanha, syntynyt 1751, eikä hänen vaimonsa
ollut paljoa nuorempi, hän oli nim. syntynyt 1754. Laiti oli muun
muassa saavuttanut erinomaisen kyvyn määrätä ajan kuun ja tähtien
aseman mukaan, ja siinä häntä usein koettelinkin.
Hämärä levitti jo harsonsa vuorien ja laaksojen yli, kun jatkoimme
matkaamme, joka airojen avulla nopeasti edistyi Tenojoen uomassa.
Niemen takana loisti kaukana punanen valo, joka näytti
taivaanrannalla liitelevältä soihdulta. Pian näkyi toinenkin soihtu ja
kolmas ja neljäs. Tuolla tuulastaa Pietari Hellander, tuolla Antti
Jauva, tuolla Olli Mikonpoika. Minusta tuntui mahdottomalta, että he
näin kaukaa saattoivat tuntea ihmiset. "Miksi emme tietäisi missä
kukin kalastaa", vastasivat he varsin ihmeissään. Sopimus ja
nautinto säätävät täällä muutamia oikeuksia, ja ne ovat pyhempiä
kuin ne, joita maallinen valta säätää.

Seuraavakin päivä oli kaunis, mutta suven viheriyys oli jo täälläkin


kadonnut. Viikko sitten olivat Tenojoen rannat vielä olleet
suvipuvussa, ja vielä lyhyemmässä ajassa Lapissa kaikki kellastuu,
jos riehuu kova pohjoistuuli.

Suoritettuani tehtäväni olin valmis palaamaan. Kyyditsijäni


suostumuksella lähdettiin matkaan yön pimeydessä, jotta saisin
nauttia harvoin näkemistäni tuulastustulista, jotka heti lähtömme
jälkeen kaikkialla loimusivat pitkin Tenojoen harvaan asuttuja rantoja.
Jokainen kalastaja, jonka tapasin, tahtoi tietää, oliko minulla tuoretta
kalaa. He tahtoivat päästää minut osalliseksi runsaasta saalistaan.
Mutta kun saivat tietää, ettei pöydältäni puuttunut kalaa, tyytyivät
kiitokseeni. Utsjoen suussa loimusivat useimmat tulet. Tänne
pysähdyimme, kun soutomieheni halusivat levätä ja tavata tuttavia.
Niitä ei etsitty, vaan koottiin risuja ja puita rannalle, ne sytytettiin, ja
silloin toinen vene toisensa jälkeen saapui sinne. Minua varten
tahdottiin paistaa lohi. Tuorein heitettiin tuleen ja sille viskeltiin usein
suolavettä. Leipää ja voita minulla oli muassani, niin että sain aimo
aterian. Lappalaisetkin ruokailivat, ja saadaksemme yhdessäolomme
juhlallisemmaksi, kohennettiin tulta ja minä panin tupakkamassini
siinä yhteiseksi omaisuudeksi. Pari tuntia kului siten rattoisassa
puhelussa. Hiljainen tuuli lakasi tuon tuostakin kirkkaaksi kuun, joka
silloin piirsi kauniin hopeapilarin pitkin vedenpintaa, ja siitä syystä
kalastuksen jatkaminen sinä yönä kävi mahdottomaksi. Kaikki
veneet lähtivät silloin Utsjokea ylöspäin. Mutta pian oli taas kuu
pilvien peitossa ja useita pyrähteleviä lohia nostettiin vedestä.
VII.

Kirkollisia ja siveellisiä oloja.

Yrityksistä lappalaisten kääntämiseksi puhutaan kyllä jo Eerikki


IX:nen ajoilta. Mutta Ruotsin Lappiin rakennettiin kirkkoja ja
rukoushuoneita vasta Kaarlo IX:nen, Kristina kuningattaren ja Kaarlo
XI:nen aikana; ja sinne perustettiin myös kouluja.

Suomen Lappiinkin rakennutti Kristina kuningatar v. 1648 kaksi


kirkkoa, ensimäiset siellä; toisen Kemijärvelle, toisen Inariin.
Edelliseen tuli silloin ensimäiseksi papiksi Jaakko Eerikinpoika
Lapodius, jälkimmäiseen Esaias Mansvetuksenpoika Fellman tahi
Joander, joksi häntä myös sanottiin, koska hän oli listä kotoisin.

Noin penikulman päässä Inarin kirkolta on pieni järvi, nimeltä


"Kolmen kuninkaan järvi", jonka nimen sanotaan syntyneen siitä, että
täällä muinoin yhtyi kolmen valtakunnan, Venäjän, Ruotsin ja Norjan
rajat. Minuun on tämä järvi vaikuttanut erityisellä vetovoimalla
mieskohtaisesta syystä. Kuinka usein olenkaan käydessäni
kesäaikana Inarissa suunnannut askeleeni sinne ja sen ympäristöön,
vaikka sen autioilla rannoilla ei ole yhtään ihmisasuntoa, eikä
suinkaan luontokaan ole houkutteleva. Järveä ympäröi laiha,
hiekkaperäinen maa, joka ei kasva muuta kuin hirsiksi kelpaavaa
metsää ja jäkälää. Käynneilläni ei ole ollut tarkoituksena etsiä noiden
kolmen valtakunnan rajapyykkejä, jotka sanottiin sinne pystytetyiksi
kuningas Sigismundin aikana. Asiani on ollut vallan toinen. Muisto
lappalaisten muinoisesta apostolista, yllä mainitusta Esaiaksesta, on
minut sinne houkutellut, siellä kun sanotaan hänen asuneen
vuodesta 1648 aina vuoteen 1661. Olenkin hartaasti etsinyt edes
jotakin jälkeä hänen asumuksestaan, ei ainoastaan sentähden, että
hän oli isänisäni isänisä, vaan ehkä enemmänkin sentähden, että
hän oli ensimäinen pappi, joka asui täällä tunturiselän
pohjoispuolella levittämässä ja juurruttamassa evankeliumin
totuuksia silloin vielä pakanallisten lappalaisten keskuuteen, joiden
rakkauden ja luottamuksen hän saavuttikin siinä määrässä, että he
niinä 36:na vuotena, joina hän, muutettuansa Inarista Kemijärvelle,
siellä eli, vuosittain kokoontuivat hänen ympärilleen saamaan
opetusta ja lohdutusta. Kuinka iloinen olisinkaan ollut, jos olisin
onnistunut löytämään edes jonkun hänen asuntonsa kulmakiven.
Mutta turha on ollut etsimiseni. Eräänä kesäiltana, jolloin aurinko
paistoi punasena ja hehkuvana, ja juhlallinen hiljaisuus vallitsi
seudulla, jossa näkyi vain joku peura tai vauhko kettu
sammuttamassa janoaan järven vedellä, havaitsin vihdoin
sammaltuneessa maassa ylennyksen, joka kiinnitti huomiotani.

Astuin lähemmäksi ja löysin vähäpätöisen kiviröykkiön.


Kaihomielin katselin näitä sammalten peittämiä kiviä, kykenemättä
ratkaista, olivatko ne asuinrakennuksen tulisijan jäännöksiä vai, mikä
luultavampaa, ainoastaan metsäsaunan tähteitä. Tämän kurjan
lieden tai jonkun samanlaatuisen ääressä, ajattelin, sinä
kunnioitettava vanhus ehkä olet nauttinut ravintoa ja lämpöä sekä
tyyninä ja onnellisina että katkerina ja vaivaloisina hetkinä. Tai ehkä
sinulla ei ollutkaan täällä parempaa asuntoa kuin siirrettävä teltta,
samanlainen kuin niillä luonnonlapsilla, joiden opettamista varten olit
tänne lähetetty. Tämä näyttääkin todenmukaisemmalta, päättäen
Turun tuomiokapitulin kirjeestä huhtikuun 28 p:ltä 1675 maaherra
Graanille. Siitä käy näet selville, että eräs Antti Palmannus, joka
silloin oli määrätty papiksi Inariin, oli pyytänyt siitä päästä, muun
muassa syystä, että hän pelkäsi siellä erämaassa nälän ja vilun
painostamana menettävänsä henkensä, siellä kun ei ole mitään
asuntoa. Sen vuoksi tuomiokapitulikaan ei luullut voivansa pakottaa
pappia asettumaan Inariin, ennenkuin ollaan varmoja siitä, että
hänelle on siellä asunto ja ylöspito, joka ensin oli saatava selville.
Maaherran olisi siis ensin ryhtyminen semmoisiin toimenpiteisiin, että
Inarin pappi saa itselleen tyydyttävän asunnon ja jotakin, josta hän
voi elää. Tuomiokapituli, niin lausutaan, oli sitä paitsi alkanut epäillä
voiko pappi vakituisesti asuakaan Kemin Lapissa — vaikkakin
Esaias Mansveti, ollessaan siellä 12 vuotta, oli sen todistanut
mahdolliseksi.

Esaias Mansveti oli Iin, sittemmin Sotkamon kirkkoherran


Mansvetus Fellmanin poika. Hän tuli ylioppilaaksi 1648 ja lähetettiin,
niinkuin jo on sanottu, vielä samana vuonna, Kristina kuningattaren
käskyn mukaan ja piispa Isak Rothoviuksen määräyksestä,
ensimäiseksi papiksi meidän tunturitakaiseen Lappiin. Vaikka pyhää
sanaa jo varemmin oli näilläkin seuduilla julistettu, oli siellä tunturin
sekä etelä- että pohjoispuolella täydellinen pakanuus vallalla vielä
silloin kun Esaias Mansveti sinne saapui. Työ oli siis sekä tärkeätä
että raskasta. Mutta kun hänen vihdoin onnistui kääntää mainio
Sompion kylänvanhin, lappalainen Suas, ja tämä oli hänelle tarjonnut
kätensä, tuli sieltä muitakin anomaan opetusta ja kastetta. Hänen
onnistui saada myös Inarin kylänvanhin, ovela Valle, omasta ja
talonväkensä puolesta taipumaan kristinuskon oppimiseen, vaikka
tosin vasta sitkeän vastarinnan jälkeen. Ja kun Vallekin oli kastettu,
noudatti vähitellen koko väestö Inarijärven itäisellä ja eteläisellä
puolella Suaan ja Vallen esimerkkiä. Ja siksi innokkaan sanottiin
tämän pappismiehen olleen, että kaikki inarilaiset olivat kastetut ja
vieläpä lukutaitoisetkin, kun hän 1661 sieltä siirtyi Kemijärvelle, jonne
piispa Johannes Elai Terserus, Lapodiusen 1660 kuoltua, oli
määrännyt hänet kappalaiseksi. Aina vuoteen 1669 hän sitten oli
ainoana pappina koko Kemin Lapissa, jossa hänen täytyi talvisin
matkustaa ja palvella rahvasta seitsemässä käräjäkunnassa:
Inarissa, Sompiossa, Sodankylässä, Keminkylässä, Kittilässä,
Kuolajärvellä ja Kitkassa. Ollessaan Inarissa hänen kääntämistyönsä
kuitenkin oli siihen määrään edistynyt, että vielä nytkin pidetään
inarilaisten paremman lukutaidon, muihin lappalaisiin verrattuna,
olevan seurauksena hänen opetuksestaan. Tuon tuostakin olivatkin
inarilaiset sekä maaherralle että kihlakunnanoikeudessa
ilmilausuneet toivomuksensa saada "Mansvetus" takaisin. Sillä
Kaapro Tuderus, joka 1669 ryhtyi toimeensa lappalaispappina,
vaikka olikin harras virassaan, oli ehkä liiallisella kiivaudella ja
kovakouraisuudella, josta monet häntä vastaan nostetut syytökset ja
käräjäjutut ovat todistuksena, suuressa määrässä saanut lappalaiset
tyytymättömiksi.

Tuderus ei kuitenkaan asunut Lapissa, vaan Torniossa, josta hän


kerran vuodessa kävi Lapissa ja Inarissakin. Vanhemmissa
asiakirjoissa häntä myös sanotaan Sompion (Sombeån eli Sombyn)
kirkkoherraksi. Sinne piti Kunink. M:tin määräyksestä rakennettaman
kirkko ja siellä kirkkoherrankin tuli talvisin asua, mutta kesällä
Kitkajärvellä (Kuusamossa). Sinne olisi rakennettava avara tupa,
sellaiselle paikalle, joka voisi olla Kuolajärven ja Maanselän kylien
lappalaisille sopiva, kun ne suvisin täällä kalastelevat. Torniossa
huhtikuun 3 p:nä 1675 päivätyssä päätöksessä, samassa jossa
maaherra Juhana Graan antaa lausuntonsa lappalaisten
uudistetuista valituksista Tuderusta vastaan, ja jonka 6 §:stä äsken
mainitut tiedot ovat saadut, sanotaan edelleen: "Ja mitä koskee
herra Esaiasta Kemijärvellä, niin sopii hänen kesällä saarnata siellä
niille lappalaisille, jotka muista kylistä saapuvat kalastamaan
Kemijärvelle. Mutta lappalaisten anomukseen päästä hra Kaaprosta,
hänen usein ankaran kovakouraisuutensa tähden, lupaa maaherra
vastedes vastata." Saman Graanin edellä mainitusta päätöksestä
joulukuun 27 p:ltä 1671 ilmenee myös, että Sompion ja
Sodankylänkin lappalaiset pyysivät saada pysyä entisessä
kirkossaan Kemijärvellä; mutta "koska Sompion ja Sodankylän kylät
ovat hänen tiellään, kun hra Kaapro isänsä puolesta tulee näihin
kyliin, täytyy heidän olla hänelle kuuliaiset, koska hän on virassaan
ahkera ja vakava mies." Kuitenkin Esaias Mansveti yhä edelleen
palveli myöskin inarilaisia ja oli, Tuderuksen v. 1684 tultua Tornion
kirkkoherraksi, taas monta vuotta ainoana pappina koko
Keminlapissa.

Esaias Mansveti harrasti myös paikkakuntansa (Kemijärven)


edistystä taloudellisellakin alalla, koettaen virittää halua
maanviljelykseen ja taitoa siihen. Siinä tarkoituksessa hänen
onnistuikin saada muutamia Iiläisiä ja Oululaisia asettumaan sinne ja
siellä perustamaan uutistaloja. Innokkaasti työskenneltyään 49
vuotta täällä kaukaisessa pohjolassa Esaias Mansveti kuoli 1697 ja
haudattiin Kemijärven kirkkoon, jonka lattian alla hänen ruumiinsa
vielä lahoamatta lepää, ja luullaan sen semmoiseksi jäävän
tuomiopäivään saakka, koska häntä pidettiin niin vanhurskaana
Jumalan sanan palvelijana, ettei hänen ruumiinsa tarvinnut joutua
häviön jalostumisen alaiseksi. Sjögren kertoo tästä: "1821 vuoden
vaiheilla huomattiin tämän lappalaisapostolin ruumis vielä hyvin
säilyneeksi, vaikka toiset myöhemmät ruumiit jo olivat lahonneet.
Ainoastaan silmät ja nenä olivat jotensakin lutistuneet. Tuon
kaltainen sattuma olisi muissa maissa korottanut, etenkin
semmoisen miehen kuin Mansvetus oli, pyhimykseksi". Muuta
maallista palkintoa uhraavaisesta toiminnastaan hän ei saanut —
ehkäpä ei halunnutkaan — kuin tämän kappalaisen viran
Kemijärvellä, jota varten ei edes liene määrätty mitään vakinaista
palkkaa, paitsi ne 20, myöhemmin 30 tynnyriä ohria, jotka sai
kruunulta. Siltä ainakin tuntuu piispa Terseruksen hänelle annetusta
virkavahvistuskirjasta. Siinä näet sanotaan: "Sentähden teitä kaikkia
Kemijärven ympärillä asuvia kehoitetaan pitämään tätä arvon miestä
oikeana saarnaajananne, ollen hänelle kuuliaisia ja tottelevaisia
virassaan, ja samoin kuin hän teille jakaa hengellisiä hyviä
opettamalla ja Jumalan sanaa saarnaamalla, toivotaan myös, että
kukin teistä varojensa mukaan mielellään pitää huolta hänen
ajallisesta toimeentulostaan."

*****

Utsjoen kirkkoherra on Utsjoen ja Inarin 240 neliöpenikulman


laajoissa, vaikka harvaan asutuissa seurakunnissa vieläkin ainoana
pappina. Avustajina lastenopetuksessa on hänellä kolme
katekeettaa, joista kaksi asuu Utsjoella, yksi Inarissa. Nämä ovat
kiertäviä, ja velvolliset matkoillaan pitämään aamu- ja iltarukouksia
lappalaisten kanssa tuntureilla, sekä sunnuntai ja juhlapäivinä
saarnakirjasta lukemaan päivän saarnan, joka tapahtuu Utsjoella
lapiksi, mutta Inarissa tavallisesti suomeksi. Koulunsa ovat
katekeetat ikimuistoisista ajoista olleet velvolliset alkamaan heti
joulun jälkeen ja jatkamaan sitä Marianpäivään saakka, kuitenkin
siten, että pappi aina on ollut oikeutettu käyttämään Utsjoen toista
katekeettaa rippikoulussa tulkkina ja avustajana.
Joulun ajan kirkkoherra aina viettää Inarissa, jossa hän sitäpaitsi
käy helmikuussa ja Pääsiäisen aikana. Paikkakunnalla hän silloin
viipyy jonkun viikon, pitäen rippikoulua, useita jumalanpalveluksia ja
kuulustellen uskonnollisissa asioissa kansaa, jota on koolla koko
papin siellä oloajan. Kesämatkoja kirkkoherra kyllä ei ole velvollinen
tekemään Inariin, mutta olen keskimäärin käynyt siellä joka toinen
kesä. Sillä välin kirkkoherra asuu Utsjoella, joka on hänen
vakinainen olopaikkansa. Pitkien matkojen vuoksi ei kansa
kumminkaan edes talvisaikoina yleisesti kokoonnu kirkolle joka
sunnuntai. On sentähden vanhastaan ollut tapana kuuluuttaa
varsinaisia kirkkopäiviä tahi kokouksia talvella noin joka toiseksi tahi
kolmanneksi sunnuntaiksi, kesäisin, kun lappalaiset ovat
kalastuksillaan, vaan harvoin. Näihin tilaisuuksiin lappalaiset
saapuvat lukuisasti. Jokainen tietää silloin tapaavansa toisiakin
kirkolla ja siten saavansa siellä kaikellaiset asiansa ajetuksi. Silloin
vaihtavat kalastaja- ja porolappalaiset tuotteitaan, silloin pestataan
palvelioita ja saadaan tietoja karanneista poroista, joten omistaja
taas voi päästä niiden perille. Kirkon ympäristöä näistä syistä
sanotaan markkinapaikaksi Utsjoellakin, vaikka varsinaisia
markkinoita siellä ei pidetä. Kulmasaarnoja on silloin tällöin pidetty
Utsjoen Nuorkamissa ja Outakoskella, sekä Inarin Kyrön ja Patsjoen
kylissä.

Niinkuin Inarissa, tutkitaan myös Utsjoellakin kirkonkokousten


aikana sekä lasten että vanhempain lukutaitoa ja uskonnonkäsitystä,
ja annetaan heille tarpeellisia selityksiä. Katkismussaarnoja
pidetään, jos ilma on lauhkea, sunnuntaisin kirkossa, mutta muussa
tapauksessa sakaristossa lukukinkerien aikana, jota usein kestää
monta päivää.

You might also like