/articles/toma

To get this branch, use:
bzr branch http://darksoft.org/webbzr/articles/toma

« back to all changes in this revision

Viewing changes to section_2x_setup.tex

  • Committer: Suren A. Chilingaryan
  • Date: 2018-04-25 11:20:53 UTC
  • Revision ID: csa@suren.me-20180425112053-fxc3s4tdx1vmyqb7
Re-integrate proofs in long version, step1

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
\section{Setup, Methodology, and Conventions}\label{section:setup}
2
2
\subsection{Hardware Platform}
3
 
 To evaluate the performance of the proposed methods, we have selected 9 graphics adapters with varying micro-architectures which were produced by AMD and NVIDIA. Table \ref{table:gpus} summarizes the considered GPUs. 
 
3
 To evaluate performance of the proposed methods, we have selected 9 AMD and NVIDIA GPUs with varying micro-architectures. Table \ref{table:gpus} summarizes the considered GPUs. These GPUs were assembled into the 3 GPU servers. The newer NVIDIA cards with Maxwell and Pascal architectures were installed in the Supermicro 7047GT based server specified in the table~\ref{table:sys1}. The older NVIDIA cards and all AMD cards were installed in two identical systems based on Supermicro 7046GT platform. The full specification is given in the table~\ref{table:sys2}. Additionally, we have tested how the developed code is performing on Intel Xeon Phi 5110P accelerator. The accelerator was installed in the first platform along with the newer NVIDIA cards.
 
4
 
 
5
 
4
6
\begin{table}[htb]
5
7
\caption{\label{table:gpus} List of targeted GPU architectures}
6
8
\centering
20
22
\end{tabular}
21
23
\end{table}
22
24
 
23
 
 These GPUs were assembled into the 3 GPU servers. The newer NVIDIA cards with Maxwell and Pascal architectures were installed in the Supermicro 7047GT based server specified in the table~\ref{table:sys1}. The older NVIDIA cards and all AMD cards were installed in two identical systems based on Supermicro 7046GT platform. The full specification is given in the table~\ref{table:sys2}. Additionally, we have tested how the developed code is performing on Intel Xeon Phi 5110P accelerator. The accelerator was installed in the first platform along with the newer NVIDIA cards.
24
 
 
25
25
\begin{table}[htb]
26
26
\caption{\label{table:sys1} Server running the newer NVIDIA cards}
27
27
\begin{tabular} { l || p{5.5cm} }
65
65
\end{table}
66
66
 
67
67
\subsection{Benchmarking Strategy}
68
 
 In this article we are not aiming to precisely characterize the performance of the graphics cards, but rather validate efficiency of the proposed optimizations. For this reason we take a relatively relaxed approach to the performance measurements. In most tests, we use a data set consisting of 2048 projections with dimensions of 2048 by 2048 pixels each. 512 slices with the same dimensions are reconstructed and the median reconstruction time is used to estimate performance. 
 
68
 In this article we are not aiming to precisely characterize the performance of the graphics cards, but rather validate efficiency of the proposed optimizations. For this reason we take a relatively lax approach to the performance measurements. In most tests, we use a data set consisting of 2048 projections with dimensions of 2048 by 2048 pixels each. 512 slices with the same dimensions are reconstructed and the median reconstruction time is used to estimate performance. 
69
69
%  Unless specified otherwise, 512 similar slices are reconstructed and the median time is measured to compute the performance. In most tests, we use a typical data set recorded by 4~MPix camera utilized at ANKA synchrotron. It consists of 2000 projections with dimensions of 1776 by 1707 pixels each. 
70
70
%ToDo: reintroduce if we provide the sections...
71
71
%To prove that these parameters has a negligible effect on the performance, we show how the reconstruction performance depend on size in the section~\ref{section:perf_size} and the stability of the performance in the section~\ref{section:perf_gpuboost}.
85
85
\end{figure} 
86
86
 
87
87
\subsection{Pseudo-code Conventions}
88
 
 To avoid long code listings we use pseudo-code to describe the algorithms. We adapted an approach mixing the mathematical and \emph{C}-style notation to keep it minimalistic and easy to follow. We mostly adapt \emph{C}  syntaxes for operations, loops, and conditionals. We use $\idiv$ to denote integer division and $\%$ for modulo operation. No floating point division is performed in any of algorithms. The division is always executed on positive integer arguments and produces integer number which is rounded towards zero. The standard  naming scheme for variables is used across all presented algorithms. We group related variables together. The same letter is used to refer all variables of the group and the actual variable is specified using subscript. Furthermore, some algorithms use shared memory to cache the data stored in global or constant memory. In such cases, we keep the variable name, but add superscript indicating the memory domain. For instance, $\shmem{c_s}$ points to the sine of the projection angle stored in the shared memory. $c$ is a group of variables storing the projection constants. $c_s$ refers specifically the sine of the projection angle and the superscript $\shmem{\cdot}$ indicates that the copy in shared memory is accessed. All variables used across algorithms are listed in \tablename~\ref{table:alg_prms}, \ref{table:alg_idxs}, \ref{table:alg_vars}. The superscripts used to indicate memory segment are specified in \tablename~\ref{table:alg_ss}.
 
88
 To avoid long code listings we use pseudo-code to describe the algorithms. We use mixture of a mathematical and a \emph{C}-style notation to keep it minimalistic and easy to follow. \emph{C}  syntax is mostly adapted for operations, loops, and conditionals. We use $\idiv$ to denote integer division and $\%$ for modulo operation. No floating point division is performed in any of algorithms. The division is always executed on positive integer arguments and produces integer number which is rounded towards zero. The standard  naming scheme for variables is used across all presented algorithms. We group related variables together. The same letter is used to refer all variables of the group and the actual variable is specified using subscript. Furthermore, some algorithms use shared memory to cache the data stored in global or constant memory. In such cases, we keep the variable name, but add superscript indicating the memory domain. For instance, $\shmem{c_s}$ points to the sine of the projection angle stored in the shared memory. $c$ is a group of variables storing the projection constants. $c_s$ refers specifically the sine of the projection angle and the superscript $\shmem{\cdot}$ indicates that the copy in shared memory is accessed. All variables used across the algorithms are listed in \tablename~\ref{table:alg_prms}, \ref{table:alg_idxs}, \ref{table:alg_vars}. The superscripts used to indicate memory segment are specified in \tablename~\ref{table:alg_ss}.
89
89
 
90
90
\input{table_2x_vars}
91
91
 
92
 
 We use $\vdata{\cdot}$ symbol to denote all vector variables, i.e. $float2$, $float4$, etc. Furthermore, all proposed algorithms are capable to reconstruct 1 to 4 slices in parallel. If more than 1 slice is reconstructed, the accumulator and a few other temporary variables use the floating-point vector format to store values for multiple slices. These variables are marked with $\vfloat{\cdot}$. All arithmetic operations in this case are performed in vector form and affect all slices. The vector multiplication is performed element wise as it would be in CUDA and OpenCL. We use the standard \emph{C} notation to refer array indexes and components of the vector variables. The arrays are indexed from 0. For instance $\vx{\vfloat{s}[0]}$ refers to the first component of the accumulator. The assignment between vector variable and scalars are shown using curly braces, like $\vlist{x, y} = \vfloat{s}[0]$. The floating point constants are shown without \emph{C} type specification. However, it is of utmost importance to qualify all floating-point constants as single precision in the \emph{C} code, i.e. using $0.5f$ in place of $0.5$. Otherwise the double-precision arithmetic will be executed severely penalizing performance on majority of consumer-grade GPUs.
 
92
 We use $\vdata{\cdot}$ symbol to denote all vector variables, i.e. $float2$, $float4$, etc. Furthermore, all proposed algorithms are capable to reconstruct 1, 2, or 4 slices in parallel. If more than 1 slice is reconstructed, the accumulator and a few other temporary variables use the floating-point vector format to store values for multiple slices. These variables are marked with $\vfloat{\cdot}$. All arithmetic operations in this case are performed in vector form and affect all slices. The vector multiplication is performed element wise as it would be in CUDA and OpenCL. We use the standard \emph{C} notation to refer array indexes and components of the vector variables. The arrays are indexed from 0. For instance $\vx{\vfloat{s}[0]}$ refers to the first component of the accumulator. The assignment between vector variable and scalars are shown using curly braces, like $\vlist{x, y} = \vfloat{s}[0]$. The floating point constants are shown without \emph{C} type specification. However, it is of utmost importance to qualify all floating-point constants as single precision in the \emph{C} code, i.e. using $0.5f$ in place of $0.5$. Otherwise the double-precision arithmetic will be executed severely penalizing performance on majority of consumer-grade GPUs.
93
93
 
94
 
 To perform thread synchronization and to access the texture engine, the algorithms rely on a few functions provided by CUDA SDK or defined in the OpenCL specifications. To preserve neutrality of notation, we use abbreviated keywords to reference this functions. This list of used abbreviations along with the corresponding CUDA and OpenCL functions are listed in \tablename~\ref{table:alg_cmd}. Actually, the syntax of OpenCL and CUDA kernels is very closely related. Only a few language keywords are named differently. It should be a trivial task to generate both CUDA and OpenCL kernels based on the provided pseudo-code. 
 
94
 To perform thread synchronization and to access the texture engine, the algorithms rely on a few functions provided by CUDA SDK or defined in the OpenCL specifications. To preserve neutrality of notation, we use abbreviated keywords to reference this functions. This list of used abbreviations along with the corresponding CUDA and OpenCL functions are listed in \tablename~\ref{table:alg_cmd}. Actually, the syntax of OpenCL and CUDA kernels is very closely related. Only a few language keywords are named differently. It is a trivial task to generate both CUDA and OpenCL kernels based on the provided pseudo-code. 
95
95
 
96
96
\input{table_2x_funcs}
97
97
 
98
 
 We use integer division and modulo operations across the code listings. These operations are very slow on GPUs and actually should be performed as bit mangling operations instead. However, the optimizing compilers will generate proper hardware instructions automatically. So, we are free to use notation which is easier to read. There are a few other cases when the optimization is left to compiler. 
 
98
 We use integer division and modulo operations across the code listings. These operations are very slow on GPUs and actually should be performed as bit mangling operations instead. However, the optimizing compilers
 
99
can replace them automatically by the faster bit-mangling instructions. So, we are free to use notation which is easier to read. There are a few other cases where the optimization is left to the compiler.