<!-- HTML header for doxygen 1.8.8-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- For Mobile Devices -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
<title>QuEST: QuEST_gpu.cu Source File</title>
<!--<link href="tabs.css" rel="stylesheet" type="text/css"/>-->
<script type="text/javascript" src="dynsections.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="style.css" rel="stylesheet" type="text/css"/>
<link href='https://fonts.googleapis.com/css?family=Roboto+Slab' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<link href="jquery.smartmenus.bootstrap.css" rel="stylesheet">
<script type="text/javascript" src="jquery.smartmenus.js"></script>
<!-- SmartMenus jQuery Bootstrap Addon -->
<script type="text/javascript" src="jquery.smartmenus.bootstrap.js"></script>
<!-- SmartMenus jQuery plugin -->
</head>
<body>
<nav class="navbar navbar-default" role="navigation">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand"><img alt="Logo" src="logo.png"/></a>
<a class="navbar-brand"><b>QuEST</b> v3.1.0<br>The Quantum Exact Simulation Toolkit</a>
</div>
</div>
</nav>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div class="content" id="content">
<div class="container">
<div class="row">
<div class="col-sm-12 panel " style="padding-bottom: 15px;">
<div style="margin-bottom: 15px;">
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_d522931ffa1371640980b621734a4381.html">Users</a></li><li class="navelem"><a class="el" href="dir_70834f0dcd10de01d2e35ab402a2238e.html">tysonjones</a></li><li class="navelem"><a class="el" href="dir_1957401ef452be7528010ba0f4832a45.html">Desktop</a></li><li class="navelem"><a class="el" href="dir_dee4414d5d72b49a9429e079789ffd08.html">GithubRepos</a></li><li class="navelem"><a class="el" href="dir_a89b43d59316bb5045aa22bb53a67d29.html">QuEST</a></li><li class="navelem"><a class="el" href="dir_f1fe56bf5ef15ff22696c757278c6962.html">QuEST</a></li><li class="navelem"><a class="el" href="dir_757750313c878cfe3b7d1ade55b4b819.html">src</a></li><li class="navelem"><a class="el" href="dir_7eb3fa4849c17b542966d4ab4b7cdb3f.html">GPU</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">QuEST_gpu.cu</div> </div>
</div><!--header-->
<div class="contents">
<a href="QuEST__gpu_8cu.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">// Distributed under MIT licence. See https://github.com/QuEST-Kit/QuEST/blob/master/LICENCE.txt for details</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="preprocessor"># include "<a class="code" href="QuEST_8h.html">QuEST.h</a>"</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="preprocessor"># include "<a class="code" href="QuEST__precision_8h.html">QuEST_precision.h</a>"</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor"># include "<a class="code" href="QuEST__internal_8h.html">QuEST_internal.h</a>"</span> <span class="comment">// purely to resolve getQuESTDefaultSeedKey</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor"># include "<a class="code" href="mt19937ar_8h.html">mt19937ar.h</a>"</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  </div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="preprocessor"># include <stdlib.h></span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="preprocessor"># include <stdio.h></span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor"># include <math.h></span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  </div>
<div class="line"><a name="l00019"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53"> 19</a></span> <span class="preprocessor"># define REDUCE_SHARED_SIZE 512</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ad72dbcf6d0153db1b8d8a58001feed83"> 20</a></span> <span class="preprocessor"># define DEBUG 0</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  </div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  </div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  </div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment">/*</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment"> * struct types for concisely passing unitaries to kernels</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment"> */</span></div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  </div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  <span class="comment">// hide these from doxygen</span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="comment"></span> </div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  <span class="keyword">typedef</span> <span class="keyword">struct </span>ArgMatrix2 {</div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  <a class="code" href="structComplex.html">Complex</a> r0c0, r0c1;</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  <a class="code" href="structComplex.html">Complex</a> r1c0, r1c1;</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  } ArgMatrix2;</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  </div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  <span class="keyword">typedef</span> <span class="keyword">struct </span>ArgMatrix4</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  {</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  <a class="code" href="structComplex.html">Complex</a> r0c0, r0c1, r0c2, r0c3;</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  <a class="code" href="structComplex.html">Complex</a> r1c0, r1c1, r1c2, r1c3;</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  <a class="code" href="structComplex.html">Complex</a> r2c0, r2c1, r2c2, r2c3;</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  <a class="code" href="structComplex.html">Complex</a> r3c0, r3c1, r3c2, r3c3;</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  } ArgMatrix4;</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  </div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span> ArgMatrix2 argifyMatrix2(<a class="code" href="structComplexMatrix2.html">ComplexMatrix2</a> m) { </div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  ArgMatrix2 a;</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  a.r0c0.real=m.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[0][0]; a.r0c0.imag=m.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[0][0];</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  a.r0c1.real=m.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[0][1]; a.r0c1.imag=m.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[0][1];</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  a.r1c0.real=m.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[1][0]; a.r1c0.imag=m.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[1][0];</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  a.r1c1.real=m.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[1][1]; a.r1c1.imag=m.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[1][1];</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <span class="keywordflow">return</span> a;</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  }</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  </div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span> ArgMatrix4 argifyMatrix4(<a class="code" href="structComplexMatrix4.html">ComplexMatrix4</a> m) { </div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  ArgMatrix4 a;</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  a.r0c0.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[0][0]; a.r0c0.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[0][0];</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  a.r0c1.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[0][1]; a.r0c1.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[0][1];</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  a.r0c2.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[0][2]; a.r0c2.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[0][2];</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  a.r0c3.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[0][3]; a.r0c3.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[0][3];</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  a.r1c0.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[1][0]; a.r1c0.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[1][0];</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  a.r1c1.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[1][1]; a.r1c1.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[1][1];</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  a.r1c2.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[1][2]; a.r1c2.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[1][2];</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  a.r1c3.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[1][3]; a.r1c3.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[1][3];</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  a.r2c0.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[2][0]; a.r2c0.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[2][0];</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  a.r2c1.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[2][1]; a.r2c1.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[2][1];</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  a.r2c2.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[2][2]; a.r2c2.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[2][2];</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  a.r2c3.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[2][3]; a.r2c3.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[2][3];</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  a.r3c0.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[3][0]; a.r3c0.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[3][0];</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  a.r3c1.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[3][1]; a.r3c1.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[3][1];</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  a.r3c2.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[3][2]; a.r3c2.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[3][2];</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  a.r3c3.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[3][3]; a.r3c3.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[3][3];</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  <span class="keywordflow">return</span> a;</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  }</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  </div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  </div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  </div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  </div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span> <span class="comment">/*</span></div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span> <span class="comment"> * in-kernel bit twiddling functions</span></div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span> <span class="comment"> */</span></div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  </div>
<div class="line"><a name="l00082"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226"> 82</a></span> __forceinline__ __device__ <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a> (<span class="keywordtype">int</span> locationOfBitFromRight, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> theEncodedNumber) {</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <span class="keywordflow">return</span> (theEncodedNumber & ( 1LL << locationOfBitFromRight )) >> locationOfBitFromRight;</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span> }</div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  </div>
<div class="line"><a name="l00086"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a1775b7abce55ccfd036bd5f55707877c"> 86</a></span> __forceinline__ __device__ <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#a1775b7abce55ccfd036bd5f55707877c">getBitMaskParity</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> mask) {</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <span class="keywordtype">int</span> parity = 0;</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  <span class="keywordflow">while</span> (mask) {</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  parity = !parity;</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  mask = mask & (mask-1);</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  }</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <span class="keywordflow">return</span> parity;</div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span> }</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  </div>
<div class="line"><a name="l00095"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a6aea6cf9c06d05a5765ad01311531627"> 95</a></span> __forceinline__ __device__ <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#a6aea6cf9c06d05a5765ad01311531627">flipBit</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> number, <span class="keywordtype">int</span> bitInd) {</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  <span class="keywordflow">return</span> (number ^ (1LL << bitInd));</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span> }</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  </div>
<div class="line"><a name="l00099"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a4536acc227ff24e63aaf47b2b42e765f"> 99</a></span> __forceinline__ __device__ <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#a4536acc227ff24e63aaf47b2b42e765f">insertZeroBit</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> number, <span class="keywordtype">int</span> index) {</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> left, right;</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  left = (number >> index) << index;</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  right = number - left;</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <span class="keywordflow">return</span> (left << 1) ^ right;</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span> }</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  </div>
<div class="line"><a name="l00106"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a60b4893613de0cd6595f60cdec24999a"> 106</a></span> __forceinline__ __device__ <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#a60b4893613de0cd6595f60cdec24999a">insertTwoZeroBits</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> number, <span class="keywordtype">int</span> bit1, <span class="keywordtype">int</span> bit2) {</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <span class="keywordtype">int</span> small = (bit1 < bit2)? bit1 : bit2;</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  <span class="keywordtype">int</span> big = (bit1 < bit2)? bit2 : bit1;</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="keywordflow">return</span> <a class="code" href="QuEST__gpu_8cu.html#a4536acc227ff24e63aaf47b2b42e765f">insertZeroBit</a>(<a class="code" href="QuEST__gpu_8cu.html#a4536acc227ff24e63aaf47b2b42e765f">insertZeroBit</a>(number, small), big);</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span> }</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  </div>
<div class="line"><a name="l00112"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a5f14823d1125e973c4b350bd6ac84552"> 112</a></span> __forceinline__ __device__ <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#a5f14823d1125e973c4b350bd6ac84552">insertZeroBits</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> number, <span class="keywordtype">int</span>* inds, <span class="keywordtype">int</span> numInds) {</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  <span class="comment">/* inserted bit inds must strictly increase, so that their final indices are correct.</span></div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span> <span class="comment"> * in-lieu of sorting (avoided since no C++ variable-size arrays, and since we're already </span></div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span> <span class="comment"> * memory bottle-necked so overhead eats this slowdown), we find the next-smallest index each </span></div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span> <span class="comment"> * at each insert. recall every element of inds (a positive or zero number) is unique.</span></div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span> <span class="comment"> * This function won't appear in the CPU code, which can use C99 variable-size arrays and </span></div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span> <span class="comment"> * ought to make a sorted array before threading</span></div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span> <span class="comment"> */</span></div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <span class="keywordtype">int</span> curMin = inds[0];</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keywordtype">int</span> prevMin = -1;</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> n=0; n < numInds; n++) {</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  </div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="comment">// find next min</span></div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t=0; t < numInds; t++)</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <span class="keywordflow">if</span> (inds[t]>prevMin && inds[t]<curMin)</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  curMin = inds[t];</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  </div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  number = <a class="code" href="QuEST__gpu_8cu.html#a4536acc227ff24e63aaf47b2b42e765f">insertZeroBit</a>(number, curMin);</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  </div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  <span class="comment">// set curMin to an arbitrary non-visited elem</span></div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  prevMin = curMin;</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t=0; t < numInds; t++)</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keywordflow">if</span> (inds[t] > curMin) {</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  curMin = inds[t];</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  }</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  }</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <span class="keywordflow">return</span> number;</div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span> }</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  </div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  </div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  </div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span> <span class="comment">/*</span></div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span> <span class="comment"> * state vector and density matrix operations </span></div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span> <span class="comment"> */</span></div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  </div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span> <span class="preprocessor">#ifdef __cplusplus</span></div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> {</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span> <span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  </div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  </div>
<div class="line"><a name="l00153"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aa121d55f2ca09c06a96ddcd433c60b0f"> 153</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aa121d55f2ca09c06a96ddcd433c60b0f">statevec_setAmps</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> startInd, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* reals, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* imags, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmps) {</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  </div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  cudaDeviceSynchronize();</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  cudaMemcpy(</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real + startInd, </div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  reals,</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  numAmps * <span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real)), </div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  cudaMemcpy(</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag + startInd,</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  imags,</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  numAmps * <span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real)), </div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span> }</div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  </div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  </div>
<div class="line"><a name="l00170"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aa4b77089145184d990848cd66993aa8b"> 170</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aa4b77089145184d990848cd66993aa8b">statevec_cloneQureg</a>(<a class="code" href="structQureg.html">Qureg</a> targetQureg, <a class="code" href="structQureg.html">Qureg</a> copyQureg) {</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  </div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="comment">// copy copyQureg's GPU statevec to targetQureg's GPU statevec</span></div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  cudaDeviceSynchronize();</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  cudaMemcpy(</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  targetQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  copyQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  targetQureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*<span class="keyword">sizeof</span>(*(targetQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real)), </div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  cudaMemcpyDeviceToDevice);</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  cudaMemcpy(</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  targetQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  copyQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  targetQureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*<span class="keyword">sizeof</span>(*(targetQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag)), </div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  cudaMemcpyDeviceToDevice);</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span> }</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  </div>
<div class="line"><a name="l00186"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a664339e2afc50b0418a56adfc1bc512e"> 186</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a664339e2afc50b0418a56adfc1bc512e">densmatr_initPureStateKernel</a>(</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numPureAmps,</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *targetVecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *targetVecImag, </div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *copyVecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *copyVecImag) </div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span> {</div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <span class="comment">// this is a particular index of the pure copyQureg</span></div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="keywordflow">if</span> (index>=numPureAmps) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  </div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> realRow = copyVecReal[index];</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> imagRow = copyVecImag[index];</div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  <span class="keywordflow">for</span> (<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> col=0; col < numPureAmps; col++) {</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> realCol = copyVecReal[col];</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> imagCol = - copyVecImag[col]; <span class="comment">// minus for conjugation</span></div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  targetVecReal[col*numPureAmps + index] = realRow*realCol - imagRow*imagCol;</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  targetVecImag[col*numPureAmps + index] = realRow*imagCol + imagRow*realCol;</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  }</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span> }</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  </div>
<div class="line"><a name="l00205"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ae5ad68d054875913d0f7ec654840a9ec"> 205</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ae5ad68d054875913d0f7ec654840a9ec">densmatr_initPureState</a>(<a class="code" href="structQureg.html">Qureg</a> targetQureg, <a class="code" href="structQureg.html">Qureg</a> copyQureg)</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span> {</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(copyQureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  densmatr_initPureStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  copyQureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>,</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  targetQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, targetQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag,</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  copyQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, copyQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span> }</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  </div>
<div class="line"><a name="l00216"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a4cf98d55602d1138a2101c158095afdc"> 216</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a4cf98d55602d1138a2101c158095afdc">densmatr_initPlusStateKernel</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> probFactor, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag){</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  </div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  </div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  stateVecReal[index] = probFactor;</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span> }</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  </div>
<div class="line"><a name="l00226"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ad5b2ac0b00afa495f385520b2c5fa839"> 226</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ad5b2ac0b00afa495f385520b2c5fa839">densmatr_initPlusState</a>(<a class="code" href="structQureg.html">Qureg</a> qureg)</div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span> {</div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> probFactor = 1.0/((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) (1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>));</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  densmatr_initPlusStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  probFactor,</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span> }</div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  </div>
<div class="line"><a name="l00239"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a9f4bb112d5e95abb8e35bf051a02a06e"> 239</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a9f4bb112d5e95abb8e35bf051a02a06e">densmatr_initClassicalStateKernel</a>(</div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> densityNumElems, </div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *densityReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *densityImag, </div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> densityInd)</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span> {</div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <span class="comment">// initialise the state to all zeros</span></div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">if</span> (index >= densityNumElems) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  </div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  densityReal[index] = 0.0;</div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  densityImag[index] = 0.0;</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  </div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  <span class="keywordflow">if</span> (index==densityInd){</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <span class="comment">// classical state has probability 1</span></div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  densityReal[densityInd] = 1.0;</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  densityImag[densityInd] = 0.0;</div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  }</div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span> }</div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  </div>
<div class="line"><a name="l00258"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a20a155f53efc45c16803d7539c2c199d"> 258</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a20a155f53efc45c16803d7539c2c199d">densmatr_initClassicalState</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateInd)</div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span> {</div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  </div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="comment">// index of the desired state in the flat density matrix</span></div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> densityDim = 1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> densityInd = (densityDim + 1)*stateInd;</div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  </div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  <span class="comment">// identical to pure version</span></div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  densmatr_initClassicalStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, densityInd);</div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span> }</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  </div>
<div class="line"><a name="l00275"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a365bbb1b80cb00405c8bf1a4fa1ea8e5"> 275</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a365bbb1b80cb00405c8bf1a4fa1ea8e5">statevec_createQureg</a>(<a class="code" href="structQureg.html">Qureg</a> *qureg, <span class="keywordtype">int</span> numQubits, <a class="code" href="structQuESTEnv.html">QuESTEnv</a> env)</div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span> { </div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="comment">// allocate CPU memory</span></div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmps = 1L << numQubits;</div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsPerRank = numAmps/env.<a class="code" href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">numRanks</a>;</div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  qureg-><a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real = (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*) malloc(numAmpsPerRank * <span class="keyword">sizeof</span>(qureg-><a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real));</div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  qureg-><a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag = (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*) malloc(numAmpsPerRank * <span class="keyword">sizeof</span>(qureg-><a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag));</div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  <span class="keywordflow">if</span> (env.<a class="code" href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">numRanks</a>>1){</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  qureg-><a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.real = (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*) malloc(numAmpsPerRank * <span class="keyword">sizeof</span>(qureg-><a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.real));</div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  qureg-><a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.imag = (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*) malloc(numAmpsPerRank * <span class="keyword">sizeof</span>(qureg-><a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.imag));</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  }</div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  </div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <span class="comment">// check cpu memory allocation was successful</span></div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <span class="keywordflow">if</span> ( (!(qureg-><a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real) || !(qureg-><a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag))</div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  && numAmpsPerRank ) {</div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  printf(<span class="stringliteral">"Could not allocate memory!\n"</span>);</div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  exit (EXIT_FAILURE);</div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  }</div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <span class="keywordflow">if</span> ( env.<a class="code" href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">numRanks</a>>1 && (!(qureg-><a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.real) || !(qureg-><a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.imag))</div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  && numAmpsPerRank ) {</div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  printf(<span class="stringliteral">"Could not allocate memory!\n"</span>);</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  exit (EXIT_FAILURE);</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  }</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  </div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  qureg-><a class="code" href="structQureg.html#a0a86e8a50ea8c998b4a0a6640c5a1218">numQubitsInStateVec</a> = numQubits;</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  qureg-><a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> = numAmpsPerRank;</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  qureg-><a class="code" href="structQureg.html#adef4935cac95763c29164cf99b144ed4">numAmpsTotal</a> = numAmps;</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  qureg-><a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a> = env.<a class="code" href="structQuESTEnv.html#aa648bb336cf8598467cb62db00b9cee8">rank</a>;</div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  qureg-><a class="code" href="structQureg.html#aa3deb7163aab90a61e755a1f200f5413">numChunks</a> = env.<a class="code" href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">numRanks</a>;</div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  qureg-><a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a> = 0;</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  </div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  <span class="comment">// allocate GPU memory</span></div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  cudaMalloc(&(qureg-><a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real), qureg-><a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*<span class="keyword">sizeof</span>(*(qureg-><a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real)));</div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  cudaMalloc(&(qureg-><a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag), qureg-><a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*<span class="keyword">sizeof</span>(*(qureg-><a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag)));</div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  cudaMalloc(&(qureg-><a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), ceil(qureg-><a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>/(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)<a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>)*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>));</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  cudaMalloc(&(qureg-><a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>), ceil(qureg-><a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>/(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(<a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>*<a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>))*</div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>));</div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  </div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <span class="comment">// check gpu memory allocation was successful</span></div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  <span class="keywordflow">if</span> (!(qureg-><a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real) || !(qureg-><a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag)){</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  printf(<span class="stringliteral">"Could not allocate memory on GPU!\n"</span>);</div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  exit (EXIT_FAILURE);</div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  }</div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  </div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span> }</div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  </div>
<div class="line"><a name="l00321"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a2a52ad9f9ad9b2fd6a76f6d433b3b217"> 321</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a2a52ad9f9ad9b2fd6a76f6d433b3b217">statevec_destroyQureg</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <a class="code" href="structQuESTEnv.html">QuESTEnv</a> env)</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span> {</div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <span class="comment">// Free CPU memory</span></div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  free(qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real);</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  free(qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag);</div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  <span class="keywordflow">if</span> (env.<a class="code" href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">numRanks</a>>1){</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  free(qureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.real);</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  free(qureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.imag);</div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  }</div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  </div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <span class="comment">// Free GPU memory</span></div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  cudaFree(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real);</div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  cudaFree(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span> }</div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  </div>
<div class="line"><a name="l00336"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a0aabd5ed69a74e5bc0b46a17af45c886"> 336</a></span> <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#a0aabd5ed69a74e5bc0b46a17af45c886">GPUExists</a>(<span class="keywordtype">void</span>){</div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  <span class="keywordtype">int</span> deviceCount, device;</div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <span class="keywordtype">int</span> gpuDeviceCount = 0;</div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="keyword">struct </span>cudaDeviceProp properties;</div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  cudaError_t cudaResultCode = cudaGetDeviceCount(&deviceCount);</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  <span class="keywordflow">if</span> (cudaResultCode != cudaSuccess) deviceCount = 0;</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  <span class="comment">/* machines with no GPUs can still report one emulation device */</span></div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  <span class="keywordflow">for</span> (device = 0; device < deviceCount; ++device) {</div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  cudaGetDeviceProperties(&properties, device);</div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  <span class="keywordflow">if</span> (properties.major != 9999) { <span class="comment">/* 9999 means emulation only */</span></div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  ++gpuDeviceCount;</div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  }</div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  }</div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <span class="keywordflow">if</span> (gpuDeviceCount) <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  <span class="keywordflow">else</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span> }</div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  </div>
<div class="line"><a name="l00353"></a><span class="lineno"><a class="line" href="group__type.html#ga8ba2c3388dd64d9348c3b091852d36d4"> 353</a></span> <a class="code" href="structQuESTEnv.html">QuESTEnv</a> <a class="code" href="group__type.html#ga8ba2c3388dd64d9348c3b091852d36d4">createQuESTEnv</a>(<span class="keywordtype">void</span>) {</div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  </div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  <span class="keywordflow">if</span> (!<a class="code" href="QuEST__gpu_8cu.html#a0aabd5ed69a74e5bc0b46a17af45c886">GPUExists</a>()){</div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  printf(<span class="stringliteral">"Trying to run GPU code with no GPU available\n"</span>);</div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  exit(EXIT_FAILURE);</div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  }</div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  </div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  <a class="code" href="structQuESTEnv.html">QuESTEnv</a> env;</div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  env.<a class="code" href="structQuESTEnv.html#aa648bb336cf8598467cb62db00b9cee8">rank</a>=0;</div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  env.<a class="code" href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">numRanks</a>=1;</div>
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  </div>
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  <a class="code" href="group__debug.html#gaa8437ef3bf135231e2916e64dde1c94e">seedQuESTDefault</a>();</div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  </div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <span class="keywordflow">return</span> env;</div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span> }</div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  </div>
<div class="line"><a name="l00369"></a><span class="lineno"><a class="line" href="group__debug.html#ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77"> 369</a></span> <span class="keywordtype">void</span> <a class="code" href="group__debug.html#ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77">syncQuESTEnv</a>(<a class="code" href="structQuESTEnv.html">QuESTEnv</a> env){</div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  cudaDeviceSynchronize();</div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span> } </div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  </div>
<div class="line"><a name="l00373"></a><span class="lineno"><a class="line" href="group__debug.html#gac7e38d768a1bd79019f88cc1e6295092"> 373</a></span> <span class="keywordtype">int</span> <a class="code" href="group__debug.html#gac7e38d768a1bd79019f88cc1e6295092">syncQuESTSuccess</a>(<span class="keywordtype">int</span> successCode){</div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  <span class="keywordflow">return</span> successCode;</div>
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span> }</div>
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  </div>
<div class="line"><a name="l00377"></a><span class="lineno"><a class="line" href="group__type.html#gaeff624226629d7063a8a776958a4f991"> 377</a></span> <span class="keywordtype">void</span> <a class="code" href="group__type.html#gaeff624226629d7063a8a776958a4f991">destroyQuESTEnv</a>(<a class="code" href="structQuESTEnv.html">QuESTEnv</a> env){</div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  <span class="comment">// MPI finalize goes here in MPI version. Call this function anyway for consistency</span></div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span> }</div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  </div>
<div class="line"><a name="l00381"></a><span class="lineno"><a class="line" href="group__debug.html#gaf8a14ae79c3fb2c0b5f6255cc37bebf9"> 381</a></span> <span class="keywordtype">void</span> <a class="code" href="group__debug.html#gaf8a14ae79c3fb2c0b5f6255cc37bebf9">reportQuESTEnv</a>(<a class="code" href="structQuESTEnv.html">QuESTEnv</a> env){</div>
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  printf(<span class="stringliteral">"EXECUTION ENVIRONMENT:\n"</span>);</div>
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  printf(<span class="stringliteral">"Running locally on one node with GPU\n"</span>);</div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  printf(<span class="stringliteral">"Number of ranks is %d\n"</span>, env.<a class="code" href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">numRanks</a>);</div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  printf(<span class="stringliteral">"OpenMP enabled\n"</span>);</div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  printf(<span class="stringliteral">"Number of threads available is %d\n"</span>, omp_get_max_threads());</div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span> <span class="preprocessor"># else</span></div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  printf(<span class="stringliteral">"OpenMP disabled\n"</span>);</div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span> }</div>
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  </div>
<div class="line"><a name="l00393"></a><span class="lineno"><a class="line" href="group__debug.html#ga2d955c6e51067371eee69795532a2d62"> 393</a></span> <span class="keywordtype">void</span> <a class="code" href="group__debug.html#ga2d955c6e51067371eee69795532a2d62">getEnvironmentString</a>(<a class="code" href="structQuESTEnv.html">QuESTEnv</a> env, <a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">char</span> str[200]){</div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  sprintf(str, <span class="stringliteral">"%dqubits_GPU_noMpi_noOMP"</span>, qureg.<a class="code" href="structQureg.html#a0a86e8a50ea8c998b4a0a6640c5a1218">numQubitsInStateVec</a>); </div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span> }</div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  </div>
<div class="line"><a name="l00397"></a><span class="lineno"><a class="line" href="group__debug.html#ga11448560006dd165128e404b54ebb2f7"> 397</a></span> <span class="keywordtype">void</span> <a class="code" href="group__debug.html#ga11448560006dd165128e404b54ebb2f7">copyStateToGPU</a>(<a class="code" href="structQureg.html">Qureg</a> qureg)</div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span> {</div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#ad72dbcf6d0153db1b8d8a58001feed83">DEBUG</a>) printf(<span class="stringliteral">"Copying data to GPU\n"</span>);</div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  cudaMemcpy(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real, </div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*<span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real)), cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  cudaMemcpy(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag, </div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*<span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag)), cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#ad72dbcf6d0153db1b8d8a58001feed83">DEBUG</a>) printf(<span class="stringliteral">"Finished copying data to GPU\n"</span>);</div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span> }</div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  </div>
<div class="line"><a name="l00407"></a><span class="lineno"><a class="line" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece"> 407</a></span> <span class="keywordtype">void</span> <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(<a class="code" href="structQureg.html">Qureg</a> qureg)</div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span> {</div>
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  cudaDeviceSynchronize();</div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#ad72dbcf6d0153db1b8d8a58001feed83">DEBUG</a>) printf(<span class="stringliteral">"Copying data from GPU\n"</span>);</div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  cudaMemcpy(qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*<span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real)), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  cudaMemcpy(qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*<span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag)), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#ad72dbcf6d0153db1b8d8a58001feed83">DEBUG</a>) printf(<span class="stringliteral">"Finished copying data from GPU\n"</span>);</div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span> }</div>
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  </div>
<div class="line"><a name="l00421"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a1e57230c7995447039e62a84c0a36524"> 421</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a1e57230c7995447039e62a84c0a36524">statevec_reportStateToScreen</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <a class="code" href="structQuESTEnv.html">QuESTEnv</a> env, <span class="keywordtype">int</span> reportRank){</div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <span class="keywordtype">int</span> rank;</div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(qureg); </div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#a0a86e8a50ea8c998b4a0a6640c5a1218">numQubitsInStateVec</a><=5){</div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  <span class="keywordflow">for</span> (rank=0; rank<qureg.<a class="code" href="structQureg.html#aa3deb7163aab90a61e755a1f200f5413">numChunks</a>; rank++){</div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>==rank){</div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <span class="keywordflow">if</span> (reportRank) {</div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  printf(<span class="stringliteral">"Reporting state from rank %d [\n"</span>, qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>);</div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <span class="comment">//printf("\trank, index, real, imag\n");</span></div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  printf(<span class="stringliteral">"real, imag\n"</span>);</div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (rank==0) {</div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  printf(<span class="stringliteral">"Reporting state [\n"</span>);</div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  printf(<span class="stringliteral">"real, imag\n"</span>);</div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  }</div>
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  </div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  <span class="keywordflow">for</span>(index=0; index<qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>; index++){</div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  printf(REAL_STRING_FORMAT <span class="stringliteral">", "</span> REAL_STRING_FORMAT <span class="stringliteral">"\n"</span>, qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[index], qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[index]);</div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  }</div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  <span class="keywordflow">if</span> (reportRank || rank==qureg.<a class="code" href="structQureg.html#aa3deb7163aab90a61e755a1f200f5413">numChunks</a>-1) printf(<span class="stringliteral">"]\n"</span>);</div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  }</div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <a class="code" href="group__debug.html#ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77">syncQuESTEnv</a>(env);</div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  }</div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  }</div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span> }</div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  </div>
<div class="line"><a name="l00447"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#abc9a9ef4344c7faaaf28ac25c76649b9"> 447</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#abc9a9ef4344c7faaaf28ac25c76649b9">statevec_getRealAmp</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index){</div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> el=0;</div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  cudaMemcpy(&el, &(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index]), </div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  <span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real)), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  <span class="keywordflow">return</span> el;</div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span> }</div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  </div>
<div class="line"><a name="l00454"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#abd509244d57657e148e4084c5ab5d28f"> 454</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#abd509244d57657e148e4084c5ab5d28f">statevec_getImagAmp</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index){</div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> el=0;</div>
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  cudaMemcpy(&el, &(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index]), </div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  <span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag)), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  <span class="keywordflow">return</span> el;</div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span> }</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  </div>
<div class="line"><a name="l00461"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a2116805f30cb063a0e7c0341583d1550"> 461</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a2116805f30cb063a0e7c0341583d1550">statevec_initBlankStateKernel</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag){</div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  </div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="comment">// initialise the statevector to be all-zeros</span></div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  stateVecReal[index] = 0.0;</div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span> }</div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  </div>
<div class="line"><a name="l00471"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a758bad4237ff0bf3b4ff5be626a982ae"> 471</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a758bad4237ff0bf3b4ff5be626a982ae">statevec_initBlankState</a>(<a class="code" href="structQureg.html">Qureg</a> qureg)</div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span> {</div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  statevec_initBlankStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span> }</div>
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  </div>
<div class="line"><a name="l00482"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a43b35abfab0d6093b052e2c2e4b15064"> 482</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a43b35abfab0d6093b052e2c2e4b15064">statevec_initZeroStateKernel</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag){</div>
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  </div>
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  <span class="comment">// initialise the state to |0000..0000></span></div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  stateVecReal[index] = 0.0;</div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  </div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  <span class="keywordflow">if</span> (index==0){</div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  <span class="comment">// zero state |0000..0000> has probability 1</span></div>
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  stateVecReal[0] = 1.0;</div>
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  stateVecImag[0] = 0.0;</div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  }</div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span> }</div>
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  </div>
<div class="line"><a name="l00498"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a2ca0c6ba07ab2b4b437321bf17efc966"> 498</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a2ca0c6ba07ab2b4b437321bf17efc966">statevec_initZeroState</a>(<a class="code" href="structQureg.html">Qureg</a> qureg)</div>
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span> {</div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  statevec_initZeroStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span> }</div>
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  </div>
<div class="line"><a name="l00509"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aaa36e3e86a5b79e676c6268fa2b02222"> 509</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aaa36e3e86a5b79e676c6268fa2b02222">statevec_initPlusStateKernel</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag){</div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  </div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  </div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> normFactor = 1.0/sqrt((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)stateVecSize);</div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  stateVecReal[index] = normFactor;</div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span> }</div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  </div>
<div class="line"><a name="l00520"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a482fc361fd5f08075404c72e536316a0"> 520</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a482fc361fd5f08075404c72e536316a0">statevec_initPlusState</a>(<a class="code" href="structQureg.html">Qureg</a> qureg)</div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span> {</div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  statevec_initPlusStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span> }</div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  </div>
<div class="line"><a name="l00531"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a0f1817fe73e2911937af3979b6506ebd"> 531</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a0f1817fe73e2911937af3979b6506ebd">statevec_initClassicalStateKernel</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateInd){</div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  </div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  <span class="comment">// initialise the state to |stateInd></span></div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  stateVecReal[index] = 0.0;</div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  </div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  <span class="keywordflow">if</span> (index==stateInd){</div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <span class="comment">// classical state has probability 1</span></div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  stateVecReal[stateInd] = 1.0;</div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  stateVecImag[stateInd] = 0.0;</div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  }</div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span> }</div>
<div class="line"><a name="l00546"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a288dc4b46bdacd69cbf4a6fd070d26a7"> 546</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a288dc4b46bdacd69cbf4a6fd070d26a7">statevec_initClassicalState</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateInd)</div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span> {</div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  statevec_initClassicalStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, stateInd);</div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span> }</div>
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  </div>
<div class="line"><a name="l00557"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ad947613d4d62b0b659a0be1e9c736427"> 557</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ad947613d4d62b0b659a0be1e9c736427">statevec_initDebugStateKernel</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag){</div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  </div>
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  </div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  stateVecReal[index] = (index*2.0)/10.0;</div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  stateVecImag[index] = (index*2.0+1.0)/10.0;</div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span> }</div>
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  </div>
<div class="line"><a name="l00567"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ad9fd3017ea40cf63fd04b39e03494972"> 567</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ad9fd3017ea40cf63fd04b39e03494972">statevec_initDebugState</a>(<a class="code" href="structQureg.html">Qureg</a> qureg)</div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span> {</div>
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  statevec_initDebugStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>,</div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span> }</div>
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  </div>
<div class="line"><a name="l00578"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ace807c2089e172363db9ffe083f60f71"> 578</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ace807c2089e172363db9ffe083f60f71">statevec_initStateOfSingleQubitKernel</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag, <span class="keywordtype">int</span> qubitId, <span class="keywordtype">int</span> outcome){</div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <span class="keywordtype">int</span> bit;</div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  </div>
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  </div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> normFactor = 1.0/sqrt((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)stateVecSize/2);</div>
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  bit = <a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a>(qubitId, index);</div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <span class="keywordflow">if</span> (bit==outcome) {</div>
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  stateVecReal[index] = normFactor;</div>
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  stateVecReal[index] = 0.0;</div>
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  }</div>
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span> }</div>
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  </div>
<div class="line"><a name="l00596"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a923906770cac0da9e3459bae58de9e64"> 596</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a923906770cac0da9e3459bae58de9e64">statevec_initStateOfSingleQubit</a>(<a class="code" href="structQureg.html">Qureg</a> *qureg, <span class="keywordtype">int</span> qubitId, <span class="keywordtype">int</span> outcome)</div>
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span> {</div>
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg-><a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  statevec_initStateOfSingleQubitKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg-><a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, qureg-><a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg-><a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, qubitId, outcome);</div>
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span> }</div>
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  </div>
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span> <span class="comment">// returns 1 if successful, else 0</span></div>
<div class="line"><a name="l00605"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a05756b45f10135bb2eeb07380f806c20"> 605</a></span> <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#a05756b45f10135bb2eeb07380f806c20">statevec_initStateFromSingleFile</a>(<a class="code" href="structQureg.html">Qureg</a> *qureg, <span class="keywordtype">char</span> filename[200], <a class="code" href="structQuESTEnv.html">QuESTEnv</a> env){</div>
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkSize, stateVecSize;</div>
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> indexInChunk, totalIndex;</div>
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  </div>
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  chunkSize = qureg-><a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  stateVecSize = chunkSize*qureg-><a class="code" href="structQureg.html#aa3deb7163aab90a61e755a1f200f5413">numChunks</a>;</div>
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  </div>
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg-><a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg-><a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  </div>
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  FILE *fp;</div>
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  <span class="keywordtype">char</span> line[200];</div>
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  </div>
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  fp = fopen(filename, <span class="stringliteral">"r"</span>);</div>
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  <span class="keywordflow">if</span> (fp == NULL)</div>
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  </div>
<div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  indexInChunk = 0; totalIndex = 0;</div>
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  <span class="keywordflow">while</span> (fgets(line, <span class="keyword">sizeof</span>(<span class="keywordtype">char</span>)*200, fp) != NULL && totalIndex<stateVecSize){</div>
<div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  <span class="keywordflow">if</span> (line[0]!=<span class="charliteral">'#'</span>){</div>
<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  <span class="keywordtype">int</span> chunkId = totalIndex/chunkSize;</div>
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  <span class="keywordflow">if</span> (chunkId==qureg-><a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>){</div>
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span> <span class="preprocessor"> # if QuEST_PREC==1</span></div>
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  sscanf(line, <span class="stringliteral">"%f, %f"</span>, &(stateVecReal[indexInChunk]),</div>
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  &(stateVecImag[indexInChunk]));</div>
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span> <span class="preprocessor"> # elif QuEST_PREC==2</span></div>
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  sscanf(line, <span class="stringliteral">"%lf, %lf"</span>, &(stateVecReal[indexInChunk]),</div>
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  &(stateVecImag[indexInChunk]));</div>
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span> <span class="preprocessor"> # elif QuEST_PREC==4</span></div>
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  sscanf(line, <span class="stringliteral">"%lf, %lf"</span>, &(stateVecReal[indexInChunk]),</div>
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  &(stateVecImag[indexInChunk]));</div>
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span> <span class="preprocessor"> # endif</span></div>
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  indexInChunk += 1;</div>
<div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  }</div>
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  totalIndex += 1;</div>
<div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  }</div>
<div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  }</div>
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  fclose(fp);</div>
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  <a class="code" href="group__debug.html#ga11448560006dd165128e404b54ebb2f7">copyStateToGPU</a>(*qureg);</div>
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  </div>
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  <span class="comment">// indicate success</span></div>
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span> }</div>
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  </div>
<div class="line"><a name="l00649"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ae6cecbad32a03416138b321cdc1a2c33"> 649</a></span> <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#ae6cecbad32a03416138b321cdc1a2c33">statevec_compareStates</a>(<a class="code" href="structQureg.html">Qureg</a> mq1, <a class="code" href="structQureg.html">Qureg</a> mq2, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> precision){</div>
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> diff;</div>
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  <span class="keywordtype">int</span> chunkSize = mq1.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  </div>
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(mq1);</div>
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(mq2);</div>
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  </div>
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i<chunkSize; i++){</div>
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  diff = mq1.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[i] - mq2.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[i];</div>
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  <span class="keywordflow">if</span> (diff<0) diff *= -1;</div>
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  <span class="keywordflow">if</span> (diff>precision) <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  diff = mq1.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[i] - mq2.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[i];</div>
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  <span class="keywordflow">if</span> (diff<0) diff *= -1;</div>
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  <span class="keywordflow">if</span> (diff>precision) <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  }</div>
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span> }</div>
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  </div>
<div class="line"><a name="l00667"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a1338d7ca4e83bbb81da02aca456c53e6"> 667</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a1338d7ca4e83bbb81da02aca456c53e6">statevec_compactUnitaryKernel</a> (<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> rotQubit, <a class="code" href="structComplex.html">Complex</a> alpha, <a class="code" href="structComplex.html">Complex</a> beta){</div>
<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  </div>
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo, <span class="comment">// storage for previous state values</span></div>
<div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  <span class="keyword">const</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  </div>
<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  sizeHalfBlock = 1LL << rotQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  </div>
<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  </div>
<div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> alphaImag=alpha.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>, alphaReal=alpha.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>;</div>
<div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> betaImag=beta.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>, betaReal=beta.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>;</div>
<div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  </div>
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  </div>
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  </div>
<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  </div>
<div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l00707"></a><span class="lineno"> 707</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  </div>
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  <span class="comment">// state[indexUp] = alpha * state[indexUp] - conj(beta) * state[indexLo]</span></div>
<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  stateVecReal[indexUp] = alphaReal*stateRealUp - alphaImag*stateImagUp </div>
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span>  - betaReal*stateRealLo - betaImag*stateImagLo;</div>
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  stateVecImag[indexUp] = alphaReal*stateImagUp + alphaImag*stateRealUp </div>
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  - betaReal*stateImagLo + betaImag*stateRealLo;</div>
<div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  </div>
<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  <span class="comment">// state[indexLo] = beta * state[indexUp] + conj(alpha) * state[indexLo]</span></div>
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  stateVecReal[indexLo] = betaReal*stateRealUp - betaImag*stateImagUp </div>
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span>  + alphaReal*stateRealLo + alphaImag*stateImagLo;</div>
<div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  stateVecImag[indexLo] = betaReal*stateImagUp + betaImag*stateRealUp </div>
<div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  + alphaReal*stateImagLo - alphaImag*stateRealLo;</div>
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span> }</div>
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  </div>
<div class="line"><a name="l00722"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a94ee4df9faba286ad7a5bc829ef5174d"> 722</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a94ee4df9faba286ad7a5bc829ef5174d">statevec_compactUnitary</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit, <a class="code" href="structComplex.html">Complex</a> alpha, <a class="code" href="structComplex.html">Complex</a> beta) </div>
<div class="line"><a name="l00723"></a><span class="lineno"> 723</span> {</div>
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  statevec_compactUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, alpha, beta);</div>
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span> }</div>
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  </div>
<div class="line"><a name="l00730"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a55fdf6604434dab8a5c0b8522b6cc10c"> 730</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a55fdf6604434dab8a5c0b8522b6cc10c">statevec_controlledCompactUnitaryKernel</a> (<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> controlQubit, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit, <a class="code" href="structComplex.html">Complex</a> alpha, <a class="code" href="structComplex.html">Complex</a> beta){</div>
<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  </div>
<div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo, <span class="comment">// storage for previous state values</span></div>
<div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l00741"></a><span class="lineno"> 741</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  <span class="keyword">const</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  </div>
<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  </div>
<div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  </div>
<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> alphaImag=alpha.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>, alphaReal=alpha.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>;</div>
<div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> betaImag=beta.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>, betaReal=beta.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>;</div>
<div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  </div>
<div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  </div>
<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  </div>
<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a>(controlQubit, indexUp);</div>
<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l00771"></a><span class="lineno"> 771</span>  </div>
<div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  </div>
<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  <span class="comment">// state[indexUp] = alpha * state[indexUp] - conj(beta) * state[indexLo]</span></div>
<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  stateVecReal[indexUp] = alphaReal*stateRealUp - alphaImag*stateImagUp </div>
<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  - betaReal*stateRealLo - betaImag*stateImagLo;</div>
<div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  stateVecImag[indexUp] = alphaReal*stateImagUp + alphaImag*stateRealUp </div>
<div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  - betaReal*stateImagLo + betaImag*stateRealLo;</div>
<div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  </div>
<div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  <span class="comment">// state[indexLo] = beta * state[indexUp] + conj(alpha) * state[indexLo]</span></div>
<div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  stateVecReal[indexLo] = betaReal*stateRealUp - betaImag*stateImagUp </div>
<div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  + alphaReal*stateRealLo + alphaImag*stateImagLo;</div>
<div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  stateVecImag[indexLo] = betaReal*stateImagUp + betaImag*stateRealUp </div>
<div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  + alphaReal*stateImagLo - alphaImag*stateRealLo;</div>
<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  }</div>
<div class="line"><a name="l00787"></a><span class="lineno"> 787</span> }</div>
<div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  </div>
<div class="line"><a name="l00789"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a47b467a5445c7f15d1a8b0b2ec0ef2de"> 789</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a47b467a5445c7f15d1a8b0b2ec0ef2de">statevec_controlledCompactUnitary</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> controlQubit, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit, <a class="code" href="structComplex.html">Complex</a> alpha, <a class="code" href="structComplex.html">Complex</a> beta) </div>
<div class="line"><a name="l00790"></a><span class="lineno"> 790</span> {</div>
<div class="line"><a name="l00791"></a><span class="lineno"> 791</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00792"></a><span class="lineno"> 792</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  statevec_controlledCompactUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit, alpha, beta);</div>
<div class="line"><a name="l00795"></a><span class="lineno"> 795</span> }</div>
<div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  </div>
<div class="line"><a name="l00797"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ab2ade4284b49f76631d51845ae54abdb"> 797</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ab2ade4284b49f76631d51845ae54abdb">statevec_unitaryKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit, ArgMatrix2 u){</div>
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l00803"></a><span class="lineno"> 803</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  </div>
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00806"></a><span class="lineno"> 806</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo, <span class="comment">// storage for previous state values</span></div>
<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l00808"></a><span class="lineno"> 808</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  <span class="keyword">const</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l00811"></a><span class="lineno"> 811</span>  </div>
<div class="line"><a name="l00812"></a><span class="lineno"> 812</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  </div>
<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>  </div>
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>  </div>
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  </div>
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>  </div>
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  </div>
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l00836"></a><span class="lineno"> 836</span>  </div>
<div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  <span class="comment">// state[indexUp] = u00 * state[indexUp] + u01 * state[indexLo]</span></div>
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  stateVecReal[indexUp] = u.r0c0.real*stateRealUp - u.r0c0.imag*stateImagUp </div>
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>  + u.r0c1.real*stateRealLo - u.r0c1.imag*stateImagLo;</div>
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  stateVecImag[indexUp] = u.r0c0.real*stateImagUp + u.r0c0.imag*stateRealUp </div>
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  + u.r0c1.real*stateImagLo + u.r0c1.imag*stateRealLo;</div>
<div class="line"><a name="l00842"></a><span class="lineno"> 842</span>  </div>
<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  <span class="comment">// state[indexLo] = u10 * state[indexUp] + u11 * state[indexLo]</span></div>
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span>  stateVecReal[indexLo] = u.r1c0.real*stateRealUp - u.r1c0.imag*stateImagUp </div>
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  + u.r1c1.real*stateRealLo - u.r1c1.imag*stateImagLo;</div>
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  stateVecImag[indexLo] = u.r1c0.real*stateImagUp + u.r1c0.imag*stateRealUp </div>
<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  + u.r1c1.real*stateImagLo + u.r1c1.imag*stateRealLo;</div>
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span> }</div>
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  </div>
<div class="line"><a name="l00850"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a4bea7ed7967083cbabd8a8e5acdd48c0"> 850</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a4bea7ed7967083cbabd8a8e5acdd48c0">statevec_unitary</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit, <a class="code" href="structComplexMatrix2.html">ComplexMatrix2</a> u)</div>
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span> {</div>
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  statevec_unitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, argifyMatrix2(u));</div>
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span> }</div>
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  </div>
<div class="line"><a name="l00858"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#afd7fc4d67072a80dbc609bf328b5be20"> 858</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#afd7fc4d67072a80dbc609bf328b5be20">statevec_multiControlledMultiQubitUnitaryKernel</a>(</div>
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  <a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlMask, <span class="keywordtype">int</span>* targs, <span class="keywordtype">int</span> numTargs, </div>
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* uRe, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* uIm, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span>* ampInds, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* reAmps, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* imAmps, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTargAmps)</div>
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span> {</div>
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  </div>
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  <span class="comment">// decide the amplitudes this thread will modify</span></div>
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask = blockIdx.x*blockDim.x + threadIdx.x; </div>
<div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> >> numTargs; <span class="comment">// kernel called on every 1 in 2^numTargs amplitudes</span></div>
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  </div>
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>  <span class="comment">// find this task's start index (where all targs are 0)</span></div>
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind00 = <a class="code" href="QuEST__gpu_8cu.html#a5f14823d1125e973c4b350bd6ac84552">insertZeroBits</a>(thisTask, targs, numTargs);</div>
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  </div>
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>  <span class="comment">// this task only modifies amplitudes if control qubits are 1 for this state</span></div>
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  <span class="keywordflow">if</span> (ctrlMask && (ctrlMask&ind00) != ctrlMask)</div>
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  </div>
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reVec = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *imVec = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  </div>
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  <span class="comment">/*</span></div>
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span> <span class="comment"> each thread needs:</span></div>
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span> <span class="comment"> long long int ampInds[numAmps];</span></div>
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span> <span class="comment"> qreal reAmps[numAmps];</span></div>
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span> <span class="comment"> qreal imAmps[numAmps];</span></div>
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span> <span class="comment"> but instead has access to shared arrays, with below stride and offset</span></div>
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span> <span class="comment"> */</span></div>
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  <span class="keywordtype">size_t</span> stride = gridDim.x*blockDim.x;</div>
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  <span class="keywordtype">size_t</span> offset = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>  </div>
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  <span class="comment">// determine the indices and record values of target amps</span></div>
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind;</div>
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i < numTargAmps; i++) {</div>
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  </div>
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  <span class="comment">// get global index of current target qubit assignment</span></div>
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  ind = ind00;</div>
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t=0; t < numTargs; t++)</div>
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a>(t, i))</div>
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>  ind = <a class="code" href="QuEST__gpu_8cu.html#a6aea6cf9c06d05a5765ad01311531627">flipBit</a>(ind, targs[t]);</div>
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  </div>
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  ampInds[i*stride+offset] = ind;</div>
<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>  reAmps [i*stride+offset] = reVec[ind];</div>
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  imAmps [i*stride+offset] = imVec[ind];</div>
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  }</div>
<div class="line"><a name="l00902"></a><span class="lineno"> 902</span>  </div>
<div class="line"><a name="l00903"></a><span class="lineno"> 903</span>  <span class="comment">// update the amplitudes</span></div>
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r < numTargAmps; r++) {</div>
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  ind = ampInds[r*stride+offset];</div>
<div class="line"><a name="l00906"></a><span class="lineno"> 906</span>  reVec[ind] = 0;</div>
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>  imVec[ind] = 0;</div>
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> c=0; c < numTargAmps; c++) {</div>
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> uReElem = uRe[c + r*numTargAmps];</div>
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> uImElem = uIm[c + r*numTargAmps];</div>
<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>  reVec[ind] += reAmps[c*stride+offset]*uReElem - imAmps[c*stride+offset]*uImElem;</div>
<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>  imVec[ind] += reAmps[c*stride+offset]*uImElem + imAmps[c*stride+offset]*uReElem;</div>
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  }</div>
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  }</div>
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span> }</div>
<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>  </div>
<div class="line"><a name="l00917"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a47dcab9a0e6b07ddde264ed924add26c"> 917</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a47dcab9a0e6b07ddde264ed924add26c">statevec_multiControlledMultiQubitUnitary</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlMask, <span class="keywordtype">int</span>* targs, <span class="keyword">const</span> <span class="keywordtype">int</span> numTargs, <a class="code" href="structComplexMatrixN.html">ComplexMatrixN</a> u)</div>
<div class="line"><a name="l00918"></a><span class="lineno"> 918</span> {</div>
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>  <span class="keywordtype">int</span> threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>  <span class="keywordtype">int</span> CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>numTargs)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>  </div>
<div class="line"><a name="l00922"></a><span class="lineno"> 922</span>  <span class="comment">// allocate device space for global {targs} (length: numTargs) and populate</span></div>
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  <span class="keywordtype">int</span> *d_targs;</div>
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>  <span class="keywordtype">size_t</span> targMemSize = numTargs * <span class="keyword">sizeof</span> *d_targs;</div>
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  cudaMalloc(&d_targs, targMemSize);</div>
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  cudaMemcpy(d_targs, targs, targMemSize, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>  </div>
<div class="line"><a name="l00928"></a><span class="lineno"> 928</span>  <span class="comment">// flatten out the u.real and u.imag lists</span></div>
<div class="line"><a name="l00929"></a><span class="lineno"> 929</span>  <span class="keywordtype">int</span> uNumRows = (1 << u.<a class="code" href="structComplexMatrixN.html#a606f7afbc3f65a596bdca21cb43be6a8">numQubits</a>);</div>
<div class="line"><a name="l00930"></a><span class="lineno"> 930</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* uReFlat = (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*) malloc(uNumRows*uNumRows * <span class="keyword">sizeof</span> *uReFlat);</div>
<div class="line"><a name="l00931"></a><span class="lineno"> 931</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* uImFlat = (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*) malloc(uNumRows*uNumRows * <span class="keyword">sizeof</span> *uImFlat);</div>
<div class="line"><a name="l00932"></a><span class="lineno"> 932</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> i = 0;</div>
<div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r < uNumRows; r++)</div>
<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> c=0; c < uNumRows; c++) {</div>
<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  uReFlat[i] = u.<a class="code" href="structComplexMatrixN.html#a446e8a077597e4f76049d547df0c9738">real</a>[r][c];</div>
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span>  uImFlat[i] = u.<a class="code" href="structComplexMatrixN.html#afde13e469a3b4f179f45e53d1ec0a7cf">imag</a>[r][c];</div>
<div class="line"><a name="l00937"></a><span class="lineno"> 937</span>  i++;</div>
<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>  }</div>
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>  </div>
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>  <span class="comment">// allocate device space for global u.real and u.imag (flatten by concatenating rows) and populate</span></div>
<div class="line"><a name="l00941"></a><span class="lineno"> 941</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_uRe;</div>
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_uIm;</div>
<div class="line"><a name="l00943"></a><span class="lineno"> 943</span>  <span class="keywordtype">size_t</span> uMemSize = uNumRows*uNumRows * <span class="keyword">sizeof</span> *d_uRe; <span class="comment">// size of each of d_uRe and d_uIm</span></div>
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>  cudaMalloc(&d_uRe, uMemSize);</div>
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  cudaMalloc(&d_uIm, uMemSize);</div>
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  cudaMemcpy(d_uRe, uReFlat, uMemSize, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  cudaMemcpy(d_uIm, uImFlat, uMemSize, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  </div>
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  <span class="comment">// allocate device Wspace for thread-local {ampInds}, {reAmps}, {imAmps} (length: 1<<numTargs)</span></div>
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> *d_ampInds;</div>
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *d_reAmps;</div>
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *d_imAmps;</div>
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  <span class="keywordtype">size_t</span> gridSize = (size_t) threadsPerCUDABlock * CUDABlocks;</div>
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  <span class="keywordtype">int</span> numTargAmps = uNumRows;</div>
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  cudaMalloc(&d_ampInds, numTargAmps*gridSize * <span class="keyword">sizeof</span> *d_ampInds);</div>
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>  cudaMalloc(&d_reAmps, numTargAmps*gridSize * <span class="keyword">sizeof</span> *d_reAmps);</div>
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  cudaMalloc(&d_imAmps, numTargAmps*gridSize * <span class="keyword">sizeof</span> *d_imAmps);</div>
<div class="line"><a name="l00958"></a><span class="lineno"> 958</span>  </div>
<div class="line"><a name="l00959"></a><span class="lineno"> 959</span>  <span class="comment">// call kernel</span></div>
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>  statevec_multiControlledMultiQubitUnitaryKernel<<<CUDABlocks,threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>  qureg, ctrlMask, d_targs, numTargs, d_uRe, d_uIm, d_ampInds, d_reAmps, d_imAmps, numTargAmps);</div>
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  </div>
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  <span class="comment">// free kernel memory</span></div>
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>  free(uReFlat);</div>
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>  free(uImFlat);</div>
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>  cudaFree(d_targs);</div>
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  cudaFree(d_uRe);</div>
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  cudaFree(d_uIm);</div>
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  cudaFree(d_ampInds);</div>
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  cudaFree(d_reAmps);</div>
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>  cudaFree(d_imAmps);</div>
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span> }</div>
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>  </div>
<div class="line"><a name="l00974"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ad4ec89e571c55b3d0dee1413a2fd1d43"> 974</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ad4ec89e571c55b3d0dee1413a2fd1d43">statevec_multiControlledTwoQubitUnitaryKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlMask, <span class="keyword">const</span> <span class="keywordtype">int</span> q1, <span class="keyword">const</span> <span class="keywordtype">int</span> q2, ArgMatrix4 u){</div>
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>  </div>
<div class="line"><a name="l00976"></a><span class="lineno"> 976</span>  <span class="comment">// decide the 4 amplitudes this thread will modify</span></div>
<div class="line"><a name="l00977"></a><span class="lineno"> 977</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask = blockIdx.x*blockDim.x + threadIdx.x; </div>
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> >> 2; <span class="comment">// kernel called on every 1 in 4 amplitudes</span></div>
<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00980"></a><span class="lineno"> 980</span>  </div>
<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reVec = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *imVec = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l00983"></a><span class="lineno"> 983</span>  </div>
<div class="line"><a name="l00984"></a><span class="lineno"> 984</span>  <span class="comment">// find indices of amplitudes to modify (treat q1 as the least significant bit)</span></div>
<div class="line"><a name="l00985"></a><span class="lineno"> 985</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind00, ind01, ind10, ind11;</div>
<div class="line"><a name="l00986"></a><span class="lineno"> 986</span>  ind00 = <a class="code" href="QuEST__gpu_8cu.html#a60b4893613de0cd6595f60cdec24999a">insertTwoZeroBits</a>(thisTask, q1, q2);</div>
<div class="line"><a name="l00987"></a><span class="lineno"> 987</span>  </div>
<div class="line"><a name="l00988"></a><span class="lineno"> 988</span>  <span class="comment">// modify only if control qubits are 1 for this state</span></div>
<div class="line"><a name="l00989"></a><span class="lineno"> 989</span>  <span class="keywordflow">if</span> (ctrlMask && (ctrlMask&ind00) != ctrlMask)</div>
<div class="line"><a name="l00990"></a><span class="lineno"> 990</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00991"></a><span class="lineno"> 991</span>  </div>
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  ind01 = <a class="code" href="QuEST__gpu_8cu.html#a6aea6cf9c06d05a5765ad01311531627">flipBit</a>(ind00, q1);</div>
<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  ind10 = <a class="code" href="QuEST__gpu_8cu.html#a6aea6cf9c06d05a5765ad01311531627">flipBit</a>(ind00, q2);</div>
<div class="line"><a name="l00994"></a><span class="lineno"> 994</span>  ind11 = <a class="code" href="QuEST__gpu_8cu.html#a6aea6cf9c06d05a5765ad01311531627">flipBit</a>(ind01, q2);</div>
<div class="line"><a name="l00995"></a><span class="lineno"> 995</span>  </div>
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span>  <span class="comment">// extract statevec amplitudes </span></div>
<div class="line"><a name="l00997"></a><span class="lineno"> 997</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re00, re01, re10, re11;</div>
<div class="line"><a name="l00998"></a><span class="lineno"> 998</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> im00, im01, im10, im11;</div>
<div class="line"><a name="l00999"></a><span class="lineno"> 999</span>  re00 = reVec[ind00]; im00 = imVec[ind00];</div>
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>  re01 = reVec[ind01]; im01 = imVec[ind01];</div>
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>  re10 = reVec[ind10]; im10 = imVec[ind10];</div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>  re11 = reVec[ind11]; im11 = imVec[ind11];</div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>  </div>
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>  <span class="comment">// apply u * {amp00, amp01, amp10, amp11}</span></div>
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>  reVec[ind00] = </div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>  u.r0c0.real*re00 - u.r0c0.imag*im00 +</div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>  u.r0c1.real*re01 - u.r0c1.imag*im01 +</div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>  u.r0c2.real*re10 - u.r0c2.imag*im10 +</div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  u.r0c3.real*re11 - u.r0c3.imag*im11;</div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>  imVec[ind00] =</div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  u.r0c0.imag*re00 + u.r0c0.real*im00 +</div>
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  u.r0c1.imag*re01 + u.r0c1.real*im01 +</div>
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  u.r0c2.imag*re10 + u.r0c2.real*im10 +</div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>  u.r0c3.imag*re11 + u.r0c3.real*im11;</div>
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>  </div>
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>  reVec[ind01] = </div>
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  u.r1c0.real*re00 - u.r1c0.imag*im00 +</div>
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  u.r1c1.real*re01 - u.r1c1.imag*im01 +</div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  u.r1c2.real*re10 - u.r1c2.imag*im10 +</div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>  u.r1c3.real*re11 - u.r1c3.imag*im11;</div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>  imVec[ind01] =</div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>  u.r1c0.imag*re00 + u.r1c0.real*im00 +</div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  u.r1c1.imag*re01 + u.r1c1.real*im01 +</div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>  u.r1c2.imag*re10 + u.r1c2.real*im10 +</div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  u.r1c3.imag*re11 + u.r1c3.real*im11;</div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  </div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  reVec[ind10] = </div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>  u.r2c0.real*re00 - u.r2c0.imag*im00 +</div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>  u.r2c1.real*re01 - u.r2c1.imag*im01 +</div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>  u.r2c2.real*re10 - u.r2c2.imag*im10 +</div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>  u.r2c3.real*re11 - u.r2c3.imag*im11;</div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>  imVec[ind10] =</div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>  u.r2c0.imag*re00 + u.r2c0.real*im00 +</div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>  u.r2c1.imag*re01 + u.r2c1.real*im01 +</div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>  u.r2c2.imag*re10 + u.r2c2.real*im10 +</div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>  u.r2c3.imag*re11 + u.r2c3.real*im11; </div>
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>  </div>
<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>  reVec[ind11] = </div>
<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>  u.r3c0.real*re00 - u.r3c0.imag*im00 +</div>
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>  u.r3c1.real*re01 - u.r3c1.imag*im01 +</div>
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>  u.r3c2.real*re10 - u.r3c2.imag*im10 +</div>
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>  u.r3c3.real*re11 - u.r3c3.imag*im11;</div>
<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>  imVec[ind11] =</div>
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>  u.r3c0.imag*re00 + u.r3c0.real*im00 +</div>
<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>  u.r3c1.imag*re01 + u.r3c1.real*im01 +</div>
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>  u.r3c2.imag*re10 + u.r3c2.real*im10 +</div>
<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>  u.r3c3.imag*re11 + u.r3c3.real*im11; </div>
<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span> }</div>
<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>  </div>
<div class="line"><a name="l01050"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a49af21aad0ad254c64a10cb6d39e4a64"> 1050</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a49af21aad0ad254c64a10cb6d39e4a64">statevec_multiControlledTwoQubitUnitary</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlMask, <span class="keyword">const</span> <span class="keywordtype">int</span> q1, <span class="keyword">const</span> <span class="keywordtype">int</span> q2, <a class="code" href="structComplexMatrix4.html">ComplexMatrix4</a> u)</div>
<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span> {</div>
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>  <span class="keywordtype">int</span> threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>  <span class="keywordtype">int</span> CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>2)/threadsPerCUDABlock); <span class="comment">// one kernel eval for every 4 amplitudes</span></div>
<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>  statevec_multiControlledTwoQubitUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, ctrlMask, q1, q2, argifyMatrix4(u));</div>
<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span> }</div>
<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>  </div>
<div class="line"><a name="l01057"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a4295d3add539f787362b56adf5d155f0"> 1057</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a4295d3add539f787362b56adf5d155f0">statevec_controlledUnitaryKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> controlQubit, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit, ArgMatrix2 u){</div>
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>  </div>
<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo, <span class="comment">// storage for previous state values</span></div>
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>  <span class="keyword">const</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>  </div>
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>  </div>
<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>  </div>
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>  </div>
<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>  </div>
<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>  </div>
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>  </div>
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>  </div>
<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>  </div>
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a>(controlQubit, indexUp);</div>
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>  <span class="comment">// state[indexUp] = u00 * state[indexUp] + u01 * state[indexLo]</span></div>
<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>  stateVecReal[indexUp] = u.r0c0.real*stateRealUp - u.r0c0.imag*stateImagUp </div>
<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>  + u.r0c1.real*stateRealLo - u.r0c1.imag*stateImagLo;</div>
<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>  stateVecImag[indexUp] = u.r0c0.real*stateImagUp + u.r0c0.imag*stateRealUp </div>
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>  + u.r0c1.real*stateImagLo + u.r0c1.imag*stateRealLo;</div>
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>  </div>
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>  <span class="comment">// state[indexLo] = u10 * state[indexUp] + u11 * state[indexLo]</span></div>
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>  stateVecReal[indexLo] = u.r1c0.real*stateRealUp - u.r1c0.imag*stateImagUp </div>
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>  + u.r1c1.real*stateRealLo - u.r1c1.imag*stateImagLo;</div>
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>  stateVecImag[indexLo] = u.r1c0.real*stateImagUp + u.r1c0.imag*stateRealUp </div>
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>  + u.r1c1.real*stateImagLo + u.r1c1.imag*stateRealLo;</div>
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>  }</div>
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span> }</div>
<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>  </div>
<div class="line"><a name="l01115"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a2600999a19c817bfcf7ca14779e33b9a"> 1115</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a2600999a19c817bfcf7ca14779e33b9a">statevec_controlledUnitary</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> controlQubit, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit, <a class="code" href="structComplexMatrix2.html">ComplexMatrix2</a> u)</div>
<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span> {</div>
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>  statevec_controlledUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit, argifyMatrix2(u));</div>
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span> }</div>
<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>  </div>
<div class="line"><a name="l01123"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a6fb74f09125cd2ce2658824182248c6e"> 1123</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a6fb74f09125cd2ce2658824182248c6e">statevec_multiControlledUnitaryKernel</a>(</div>
<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>  <a class="code" href="structQureg.html">Qureg</a> qureg, </div>
<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlQubitsMask, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlFlipMask, </div>
<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>  <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit, ArgMatrix2 u</div>
<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span> ){</div>
<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>  </div>
<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo, <span class="comment">// storage for previous state values</span></div>
<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>  <span class="keyword">const</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>  </div>
<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>  </div>
<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>  </div>
<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>  </div>
<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>  </div>
<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>  </div>
<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>  </div>
<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>  <span class="keywordflow">if</span> (ctrlQubitsMask == (ctrlQubitsMask & (indexUp ^ ctrlFlipMask))) {</div>
<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>  </div>
<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>  </div>
<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>  <span class="comment">// state[indexUp] = u00 * state[indexUp] + u01 * state[indexLo]</span></div>
<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>  stateVecReal[indexUp] = u.r0c0.real*stateRealUp - u.r0c0.imag*stateImagUp </div>
<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>  + u.r0c1.real*stateRealLo - u.r0c1.imag*stateImagLo;</div>
<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>  stateVecImag[indexUp] = u.r0c0.real*stateImagUp + u.r0c0.imag*stateRealUp </div>
<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>  + u.r0c1.real*stateImagLo + u.r0c1.imag*stateRealLo;</div>
<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>  </div>
<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>  <span class="comment">// state[indexLo] = u10 * state[indexUp] + u11 * state[indexLo]</span></div>
<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>  stateVecReal[indexLo] = u.r1c0.real*stateRealUp - u.r1c0.imag*stateImagUp </div>
<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>  + u.r1c1.real*stateRealLo - u.r1c1.imag*stateImagLo;</div>
<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>  stateVecImag[indexLo] = u.r1c0.real*stateImagUp + u.r1c0.imag*stateRealUp </div>
<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>  + u.r1c1.real*stateImagLo + u.r1c1.imag*stateRealLo;</div>
<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>  }</div>
<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span> }</div>
<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>  </div>
<div class="line"><a name="l01183"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a7ec46b4b96cda399095a2488ceff69b6"> 1183</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a7ec46b4b96cda399095a2488ceff69b6">statevec_multiControlledUnitary</a>(</div>
<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>  <a class="code" href="structQureg.html">Qureg</a> qureg, </div>
<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlQubitsMask, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlFlipMask, </div>
<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>  <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit, <a class="code" href="structComplexMatrix2.html">ComplexMatrix2</a> u</div>
<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span> ){</div>
<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>  <span class="keywordtype">int</span> threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>  <span class="keywordtype">int</span> CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>  statevec_multiControlledUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>  qureg, ctrlQubitsMask, ctrlFlipMask, targetQubit, argifyMatrix2(u));</div>
<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span> }</div>
<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>  </div>
<div class="line"><a name="l01194"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ab1662a828dc725610a71168a58430fae"> 1194</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ab1662a828dc725610a71168a58430fae">statevec_pauliXKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit){</div>
<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>  </div>
<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp, <span class="comment">// storage for previous state values</span></div>
<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>  stateImagUp; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>  <span class="keyword">const</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>  </div>
<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>  </div>
<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>  </div>
<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>  </div>
<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>  </div>
<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>  </div>
<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>  </div>
<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>  stateVecReal[indexUp] = stateVecReal[indexLo];</div>
<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>  stateVecImag[indexUp] = stateVecImag[indexLo];</div>
<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>  </div>
<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>  stateVecReal[indexLo] = stateRealUp;</div>
<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>  stateVecImag[indexLo] = stateImagUp;</div>
<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span> }</div>
<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>  </div>
<div class="line"><a name="l01238"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#abdb6e0ee1e407755e1b944086cedd90e"> 1238</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#abdb6e0ee1e407755e1b944086cedd90e">statevec_pauliX</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit) </div>
<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span> {</div>
<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>  statevec_pauliXKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit);</div>
<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span> }</div>
<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>  </div>
<div class="line"><a name="l01246"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a1f5b1f46708a7c96275e379b873ba2f6"> 1246</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a1f5b1f46708a7c96275e379b873ba2f6">statevec_pauliYKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit, <span class="keyword">const</span> <span class="keywordtype">int</span> conjFac){</div>
<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>  </div>
<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeHalfBlock = 1LL << targetQubit;</div>
<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock = 2LL * sizeHalfBlock;</div>
<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> >> 1;</div>
<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>  </div>
<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp, stateImagUp;</div>
<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>  </div>
<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>  </div>
<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>  <span class="comment">// update under +-{{0, -i}, {i, 0}}</span></div>
<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>  stateVecReal[indexUp] = conjFac * stateVecImag[indexLo];</div>
<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>  stateVecImag[indexUp] = conjFac * -stateVecReal[indexLo];</div>
<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>  stateVecReal[indexLo] = conjFac * -stateImagUp;</div>
<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>  stateVecImag[indexLo] = conjFac * stateRealUp;</div>
<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span> }</div>
<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>  </div>
<div class="line"><a name="l01271"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a73b56fbac6e464a37805fa9d9657a8f9"> 1271</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a73b56fbac6e464a37805fa9d9657a8f9">statevec_pauliY</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit) </div>
<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span> {</div>
<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>  statevec_pauliYKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, 1);</div>
<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span> }</div>
<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>  </div>
<div class="line"><a name="l01279"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aee97816cfabeea7874cd837a8d105412"> 1279</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aee97816cfabeea7874cd837a8d105412">statevec_pauliYConj</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit) </div>
<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span> {</div>
<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>  statevec_pauliYKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, -1);</div>
<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span> }</div>
<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>  </div>
<div class="line"><a name="l01287"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a9c7dfe745a3bb35f18440891d267e963"> 1287</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a9c7dfe745a3bb35f18440891d267e963">statevec_controlledPauliYKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> controlQubit, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit, <span class="keyword">const</span> <span class="keywordtype">int</span> conjFac)</div>
<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span> {</div>
<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, sizeHalfBlock;</div>
<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>  </div>
<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp, stateImagUp; </div>
<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, indexUp, indexLo; </div>
<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>  sizeHalfBlock = 1LL << targetQubit;</div>
<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>  sizeBlock = 2LL * sizeHalfBlock;</div>
<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>  </div>
<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>  </div>
<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>  <span class="keywordflow">if</span> (index>=(stateVecSize>>1)) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>  thisBlock = index / sizeHalfBlock;</div>
<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>  indexUp = thisBlock*sizeBlock + index%sizeHalfBlock;</div>
<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>  </div>
<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a>(controlQubit, indexUp);</div>
<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>  </div>
<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>  </div>
<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>  <span class="comment">// update under +-{{0, -i}, {i, 0}}</span></div>
<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>  stateVecReal[indexUp] = conjFac * stateVecImag[indexLo];</div>
<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>  stateVecImag[indexUp] = conjFac * -stateVecReal[indexLo];</div>
<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>  stateVecReal[indexLo] = conjFac * -stateImagUp;</div>
<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>  stateVecImag[indexLo] = conjFac * stateRealUp;</div>
<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>  }</div>
<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span> }</div>
<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>  </div>
<div class="line"><a name="l01323"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a708246b16236c492094c2633da0c08ff"> 1323</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a708246b16236c492094c2633da0c08ff">statevec_controlledPauliY</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> controlQubit, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit)</div>
<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span> {</div>
<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>  <span class="keywordtype">int</span> conjFactor = 1;</div>
<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>  statevec_controlledPauliYKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit, conjFactor);</div>
<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span> }</div>
<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>  </div>
<div class="line"><a name="l01332"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a9e647339720bf82b30c6331fad544ec5"> 1332</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a9e647339720bf82b30c6331fad544ec5">statevec_controlledPauliYConj</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> controlQubit, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit)</div>
<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span> {</div>
<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>  <span class="keywordtype">int</span> conjFactor = -1;</div>
<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>  statevec_controlledPauliYKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit, conjFactor);</div>
<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span> }</div>
<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>  </div>
<div class="line"><a name="l01341"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a5ef71ca3bb26774d7317253128a4aeab"> 1341</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a5ef71ca3bb26774d7317253128a4aeab">statevec_phaseShiftByTermKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle) {</div>
<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>  </div>
<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, sizeHalfBlock;</div>
<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, indexUp,indexLo;</div>
<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>  </div>
<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealLo, stateImagLo; </div>
<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>  <span class="keyword">const</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> >> 1;</div>
<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>  </div>
<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>  sizeHalfBlock = 1LL << targetQubit;</div>
<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>  sizeBlock = 2LL * sizeHalfBlock;</div>
<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>  </div>
<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>  </div>
<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>  </div>
<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>  </div>
<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>  stateVecReal[indexLo] = cosAngle*stateRealLo - sinAngle*stateImagLo;</div>
<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>  stateVecImag[indexLo] = sinAngle*stateRealLo + cosAngle*stateImagLo;</div>
<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span> }</div>
<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>  </div>
<div class="line"><a name="l01369"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a8972669148af60d7e1c09687f69673d4"> 1369</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a8972669148af60d7e1c09687f69673d4">statevec_phaseShiftByTerm</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit, <a class="code" href="structComplex.html">Complex</a> term)</div>
<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span> { </div>
<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle = term.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>;</div>
<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle = term.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>;</div>
<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>  </div>
<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>  statevec_phaseShiftByTermKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, cosAngle, sinAngle);</div>
<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span> }</div>
<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>  </div>
<div class="line"><a name="l01380"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#af7723faf3f94342480a54fc2137522ce"> 1380</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#af7723faf3f94342480a54fc2137522ce">statevec_controlledPhaseShiftKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> idQubit1, <span class="keyword">const</span> <span class="keywordtype">int</span> idQubit2, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle)</div>
<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span> {</div>
<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>  <span class="keywordtype">int</span> bit1, bit2;</div>
<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealLo, stateImagLo;</div>
<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>  </div>
<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>  </div>
<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>  </div>
<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>  bit1 = <a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a> (idQubit1, index);</div>
<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>  bit2 = <a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a> (idQubit2, index);</div>
<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>  <span class="keywordflow">if</span> (bit1 && bit2) {</div>
<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>  stateRealLo = stateVecReal[index];</div>
<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>  stateImagLo = stateVecImag[index];</div>
<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>  </div>
<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>  stateVecReal[index] = cosAngle*stateRealLo - sinAngle*stateImagLo;</div>
<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>  stateVecImag[index] = sinAngle*stateRealLo + cosAngle*stateImagLo;</div>
<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>  }</div>
<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span> }</div>
<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>  </div>
<div class="line"><a name="l01405"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#adeb715f3f2c167f9bfbe92b75f5988ce"> 1405</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#adeb715f3f2c167f9bfbe92b75f5988ce">statevec_controlledPhaseShift</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> idQubit1, <span class="keyword">const</span> <span class="keywordtype">int</span> idQubit2, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</div>
<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span> {</div>
<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle = cos(angle);</div>
<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle = sin(angle);</div>
<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>  </div>
<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>  statevec_controlledPhaseShiftKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, idQubit1, idQubit2, cosAngle, sinAngle);</div>
<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span> }</div>
<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>  </div>
<div class="line"><a name="l01416"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a11dc3581b1efe1332854eac7594bc647"> 1416</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a11dc3581b1efe1332854eac7594bc647">statevec_multiControlledPhaseShiftKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> mask, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle) {</div>
<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealLo, stateImagLo;</div>
<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>  </div>
<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>  </div>
<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>  </div>
<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>  <span class="keywordflow">if</span> (mask == (mask & index) ){</div>
<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>  stateRealLo = stateVecReal[index];</div>
<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>  stateImagLo = stateVecImag[index];</div>
<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>  stateVecReal[index] = cosAngle*stateRealLo - sinAngle*stateImagLo;</div>
<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>  stateVecImag[index] = sinAngle*stateRealLo + cosAngle*stateImagLo;</div>
<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>  }</div>
<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span> }</div>
<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>  </div>
<div class="line"><a name="l01436"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aa662796ea6e0f471143c53becae8c12c"> 1436</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aa662796ea6e0f471143c53becae8c12c">statevec_multiControlledPhaseShift</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> *controlQubits, <span class="keywordtype">int</span> numControlQubits, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</div>
<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span> { </div>
<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle = cos(angle);</div>
<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle = sin(angle);</div>
<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>  </div>
<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> mask = <a class="code" href="QuEST__common_8c.html#abd1285091450c7c2806cc26c71eb5df2">getQubitBitMask</a>(controlQubits, numControlQubits);</div>
<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>  </div>
<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>  statevec_multiControlledPhaseShiftKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, mask, cosAngle, sinAngle);</div>
<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span> }</div>
<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>  </div>
<div class="line"><a name="l01449"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a754e4531aa159461177751dd12e988ed"> 1449</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a754e4531aa159461177751dd12e988ed">statevec_multiRotateZKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> mask, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle) {</div>
<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>  </div>
<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>  </div>
<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>  </div>
<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>  <span class="keywordtype">int</span> fac = <a class="code" href="QuEST__gpu_8cu.html#a1775b7abce55ccfd036bd5f55707877c">getBitMaskParity</a>(mask & index)? -1 : 1;</div>
<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateReal = stateVecReal[index];</div>
<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateImag = stateVecImag[index];</div>
<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>  </div>
<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>  stateVecReal[index] = cosAngle*stateReal + fac * sinAngle*stateImag;</div>
<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>  stateVecImag[index] = - fac * sinAngle*stateReal + cosAngle*stateImag; </div>
<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span> }</div>
<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>  </div>
<div class="line"><a name="l01466"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a8d88b4ed94ab024e5e7b2f1f4f505b44"> 1466</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a8d88b4ed94ab024e5e7b2f1f4f505b44">statevec_multiRotateZ</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> mask, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</div>
<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span> { </div>
<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle = cos(angle/2.0);</div>
<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle = sin(angle/2.0);</div>
<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>  </div>
<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>  statevec_multiRotateZKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, mask, cosAngle, sinAngle);</div>
<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span> }</div>
<div class="line"><a name="l01476"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a6153547f245c05874161a105e9a2f02c"> 1476</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#a6153547f245c05874161a105e9a2f02c">densmatr_calcTotalProb</a>(<a class="code" href="structQureg.html">Qureg</a> qureg) {</div>
<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>  </div>
<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>  <span class="comment">// computes the trace using Kahan summation</span></div>
<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> pTotal=0;</div>
<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> y, t, c;</div>
<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>  c = 0;</div>
<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>  </div>
<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numCols = 1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> diagIndex;</div>
<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>  </div>
<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(qureg);</div>
<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>  </div>
<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> col=0; col< numCols; col++) {</div>
<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>  diagIndex = col*(numCols + 1);</div>
<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>  y = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[diagIndex] - c;</div>
<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>  t = pTotal + y;</div>
<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>  c = ( t - pTotal ) - y; <span class="comment">// brackets are important</span></div>
<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>  pTotal = t;</div>
<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>  }</div>
<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>  </div>
<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>  <span class="keywordflow">return</span> pTotal;</div>
<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span> }</div>
<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>  </div>
<div class="line"><a name="l01499"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ad65ad1b5ea6f30b0c6b4ffda96e1a8e6"> 1499</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#ad65ad1b5ea6f30b0c6b4ffda96e1a8e6">statevec_calcTotalProb</a>(<a class="code" href="structQureg.html">Qureg</a> qureg){</div>
<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>  <span class="comment">/* IJB - implemented using Kahan summation for greater accuracy at a slight floating</span></div>
<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span> <span class="comment"> point operation overhead. For more details see https://en.wikipedia.org/wiki/Kahan_summation_algorithm */</span></div>
<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>  <span class="comment">/* Don't change the bracketing in this routine! */</span></div>
<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> pTotal=0;</div>
<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> y, t, c;</div>
<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsPerRank = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>  </div>
<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(qureg);</div>
<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>  </div>
<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>  c = 0.0;</div>
<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>  <span class="keywordflow">for</span> (index=0; index<numAmpsPerRank; index++){</div>
<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>  <span class="comment">/* Perform pTotal+=qureg.stateVec.real[index]*qureg.stateVec.real[index]; by Kahan */</span></div>
<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>  <span class="comment">// pTotal+=qureg.stateVec.real[index]*qureg.stateVec.real[index];</span></div>
<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>  y = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[index]*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[index] - c;</div>
<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>  t = pTotal + y;</div>
<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>  c = ( t - pTotal ) - y;</div>
<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>  pTotal = t;</div>
<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>  </div>
<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>  <span class="comment">/* Perform pTotal+=qureg.stateVec.imag[index]*qureg.stateVec.imag[index]; by Kahan */</span></div>
<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>  <span class="comment">//pTotal+=qureg.stateVec.imag[index]*qureg.stateVec.imag[index];</span></div>
<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>  y = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[index]*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[index] - c;</div>
<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>  t = pTotal + y;</div>
<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>  c = ( t - pTotal ) - y;</div>
<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>  pTotal = t;</div>
<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>  </div>
<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>  </div>
<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>  }</div>
<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>  <span class="keywordflow">return</span> pTotal;</div>
<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span> }</div>
<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>  </div>
<div class="line"><a name="l01531"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#abf9e7eae332bbbd2e8b7b9c3ca3bad92"> 1531</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#abf9e7eae332bbbd2e8b7b9c3ca3bad92">statevec_controlledPhaseFlipKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> idQubit1, <span class="keyword">const</span> <span class="keywordtype">int</span> idQubit2)</div>
<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span> {</div>
<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>  <span class="keywordtype">int</span> bit1, bit2;</div>
<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>  </div>
<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>  </div>
<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>  </div>
<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>  bit1 = <a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a> (idQubit1, index);</div>
<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>  bit2 = <a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a> (idQubit2, index);</div>
<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>  <span class="keywordflow">if</span> (bit1 && bit2) {</div>
<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>  stateVecReal [index] = - stateVecReal [index];</div>
<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>  stateVecImag [index] = - stateVecImag [index];</div>
<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>  }</div>
<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span> }</div>
<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>  </div>
<div class="line"><a name="l01552"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a7c0067cb9f243ead20de7392aea328bc"> 1552</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a7c0067cb9f243ead20de7392aea328bc">statevec_controlledPhaseFlip</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> idQubit1, <span class="keyword">const</span> <span class="keywordtype">int</span> idQubit2)</div>
<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span> {</div>
<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>  statevec_controlledPhaseFlipKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, idQubit1, idQubit2);</div>
<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span> }</div>
<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>  </div>
<div class="line"><a name="l01560"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ab1f13b1980ec46bac75e97c578d15e98"> 1560</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ab1f13b1980ec46bac75e97c578d15e98">statevec_multiControlledPhaseFlipKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> mask)</div>
<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span> {</div>
<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>  </div>
<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>  </div>
<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>  </div>
<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>  <span class="keywordflow">if</span> (mask == (mask & index) ){</div>
<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>  stateVecReal [index] = - stateVecReal [index];</div>
<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>  stateVecImag [index] = - stateVecImag [index];</div>
<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>  }</div>
<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span> }</div>
<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>  </div>
<div class="line"><a name="l01578"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ac4ee5979d475e8c729294b8ef7e0270d"> 1578</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ac4ee5979d475e8c729294b8ef7e0270d">statevec_multiControlledPhaseFlip</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> *controlQubits, <span class="keywordtype">int</span> numControlQubits)</div>
<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span> {</div>
<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> mask = <a class="code" href="QuEST__common_8c.html#abd1285091450c7c2806cc26c71eb5df2">getQubitBitMask</a>(controlQubits, numControlQubits);</div>
<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>  statevec_multiControlledPhaseFlipKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, mask);</div>
<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span> }</div>
<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>  </div>
<div class="line"><a name="l01587"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a89a450a1932e4f4f94cf1487af9d263b"> 1587</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a89a450a1932e4f4f94cf1487af9d263b">statevec_swapQubitAmpsKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> qb1, <span class="keywordtype">int</span> qb2) {</div>
<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>  </div>
<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reVec = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *imVec = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>  </div>
<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> >> 2; <span class="comment">// each iteration updates 2 amps and skips 2 amps</span></div>
<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>  </div>
<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind00, ind01, ind10;</div>
<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re01, re10, im01, im10;</div>
<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>  </div>
<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>  <span class="comment">// determine ind00 of |..0..0..>, |..0..1..> and |..1..0..></span></div>
<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>  ind00 = <a class="code" href="QuEST__gpu_8cu.html#a60b4893613de0cd6595f60cdec24999a">insertTwoZeroBits</a>(thisTask, qb1, qb2);</div>
<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>  ind01 = <a class="code" href="QuEST__gpu_8cu.html#a6aea6cf9c06d05a5765ad01311531627">flipBit</a>(ind00, qb1);</div>
<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>  ind10 = <a class="code" href="QuEST__gpu_8cu.html#a6aea6cf9c06d05a5765ad01311531627">flipBit</a>(ind00, qb2);</div>
<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>  </div>
<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>  <span class="comment">// extract statevec amplitudes </span></div>
<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>  re01 = reVec[ind01]; im01 = imVec[ind01];</div>
<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>  re10 = reVec[ind10]; im10 = imVec[ind10];</div>
<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>  </div>
<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>  <span class="comment">// swap 01 and 10 amps</span></div>
<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>  reVec[ind01] = re10; reVec[ind10] = re01;</div>
<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>  imVec[ind01] = im10; imVec[ind10] = im01;</div>
<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span> }</div>
<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>  </div>
<div class="line"><a name="l01613"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ab7478fcaf6357ab202d72853b672e375"> 1613</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ab7478fcaf6357ab202d72853b672e375">statevec_swapQubitAmps</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> qb1, <span class="keywordtype">int</span> qb2) </div>
<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span> {</div>
<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>2)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>  statevec_swapQubitAmpsKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, qb1, qb2);</div>
<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span> }</div>
<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>  </div>
<div class="line"><a name="l01621"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a14b5999f157b704aced4776c9ccbc982"> 1621</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a14b5999f157b704aced4776c9ccbc982">statevec_hadamardKernel</a> (<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit){</div>
<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>  </div>
<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo, <span class="comment">// storage for previous state values</span></div>
<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>  <span class="keyword">const</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>  </div>
<div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>  </div>
<div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>  </div>
<div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>  </div>
<div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> recRoot2 = 1.0/sqrt(2.0);</div>
<div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>  </div>
<div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>  </div>
<div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>  </div>
<div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>  </div>
<div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>  </div>
<div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>  stateVecReal[indexUp] = recRoot2*(stateRealUp + stateRealLo);</div>
<div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>  stateVecImag[indexUp] = recRoot2*(stateImagUp + stateImagLo);</div>
<div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>  </div>
<div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>  stateVecReal[indexLo] = recRoot2*(stateRealUp - stateRealLo);</div>
<div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>  stateVecImag[indexLo] = recRoot2*(stateImagUp - stateImagLo);</div>
<div class="line"><a name="l01668"></a><span class="lineno"> 1668</span> }</div>
<div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>  </div>
<div class="line"><a name="l01670"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a9226f386d010aaa85efc0e8889d341d5"> 1670</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a9226f386d010aaa85efc0e8889d341d5">statevec_hadamard</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit) </div>
<div class="line"><a name="l01671"></a><span class="lineno"> 1671</span> {</div>
<div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>  statevec_hadamardKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit);</div>
<div class="line"><a name="l01676"></a><span class="lineno"> 1676</span> }</div>
<div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>  </div>
<div class="line"><a name="l01678"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aca8a32f46dbaabdbffc38d7b8023bf20"> 1678</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aca8a32f46dbaabdbffc38d7b8023bf20">statevec_controlledNotKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> controlQubit, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit)</div>
<div class="line"><a name="l01679"></a><span class="lineno"> 1679</span> {</div>
<div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>  </div>
<div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp, <span class="comment">// storage for previous state values</span></div>
<div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>  stateImagUp; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>  </div>
<div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>  </div>
<div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>  <span class="keywordflow">if</span> (index>=(stateVecSize>>1)) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>  thisBlock = index / sizeHalfBlock;</div>
<div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>  indexUp = thisBlock*sizeBlock + index%sizeHalfBlock;</div>
<div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>  </div>
<div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a>(controlQubit, indexUp);</div>
<div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>  </div>
<div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>  stateVecReal[indexUp] = stateVecReal[indexLo];</div>
<div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>  stateVecImag[indexUp] = stateVecImag[indexLo];</div>
<div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>  </div>
<div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>  stateVecReal[indexLo] = stateRealUp;</div>
<div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>  stateVecImag[indexLo] = stateImagUp;</div>
<div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>  }</div>
<div class="line"><a name="l01715"></a><span class="lineno"> 1715</span> }</div>
<div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>  </div>
<div class="line"><a name="l01717"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a114038296eb404b9b8a66aaad7b48800"> 1717</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a114038296eb404b9b8a66aaad7b48800">statevec_controlledNot</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> controlQubit, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit)</div>
<div class="line"><a name="l01718"></a><span class="lineno"> 1718</span> {</div>
<div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>  statevec_controlledNotKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit);</div>
<div class="line"><a name="l01723"></a><span class="lineno"> 1723</span> }</div>
<div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>  </div>
<div class="line"><a name="l01725"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a8ce1e311ea72b862a8757dc71082fbf3"> 1725</a></span> __device__ __host__ <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#a8ce1e311ea72b862a8757dc71082fbf3">log2Int</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> x )</div>
<div class="line"><a name="l01726"></a><span class="lineno"> 1726</span> {</div>
<div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ans = 0 ;</div>
<div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>  <span class="keywordflow">while</span>( x>>=1 ) ans++;</div>
<div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>  <span class="keywordflow">return</span> ans ;</div>
<div class="line"><a name="l01730"></a><span class="lineno"> 1730</span> }</div>
<div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>  </div>
<div class="line"><a name="l01732"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254"> 1732</a></span> __device__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *arrayIn, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray, <span class="keywordtype">int</span> length){</div>
<div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>  <span class="keywordtype">int</span> i, l, r;</div>
<div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>  <span class="keywordtype">int</span> threadMax, maxDepth;</div>
<div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>  threadMax = length/2;</div>
<div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>  maxDepth = <a class="code" href="QuEST__gpu_8cu.html#a8ce1e311ea72b862a8757dc71082fbf3">log2Int</a>(length/2);</div>
<div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>  </div>
<div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>  <span class="keywordflow">for</span> (i=0; i<maxDepth+1; i++){</div>
<div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>  <span class="keywordflow">if</span> (threadIdx.x<threadMax){</div>
<div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>  l = threadIdx.x;</div>
<div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>  r = l + threadMax;</div>
<div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>  arrayIn[l] = arrayIn[r] + arrayIn[l];</div>
<div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>  }</div>
<div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>  threadMax = threadMax >> 1;</div>
<div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>  __syncthreads(); <span class="comment">// optimise -- use warp shuffle instead</span></div>
<div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>  }</div>
<div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>  </div>
<div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>  <span class="keywordflow">if</span> (threadIdx.x==0) reducedArray[blockIdx.x] = arrayIn[0];</div>
<div class="line"><a name="l01749"></a><span class="lineno"> 1749</span> }</div>
<div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>  </div>
<div class="line"><a name="l01751"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997"> 1751</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*arrayIn, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray, <span class="keywordtype">int</span> length){</div>
<div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>  <span class="keywordtype">int</span> blockOffset = blockIdx.x*length;</div>
<div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>  tempReductionArray[threadIdx.x*2] = arrayIn[blockOffset + threadIdx.x*2];</div>
<div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>  tempReductionArray[threadIdx.x*2+1] = arrayIn[blockOffset + threadIdx.x*2+1];</div>
<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>  __syncthreads();</div>
<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, length);</div>
<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span> }</div>
<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>  </div>
<div class="line"><a name="l01760"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a3414d9307ecfd0caa2be560a00eb7c61"> 1760</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a3414d9307ecfd0caa2be560a00eb7c61">densmatr_findProbabilityOfZeroKernel</a>(</div>
<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>  <a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> measureQubit, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray</div>
<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span> ) {</div>
<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>  <span class="comment">// run by each thread</span></div>
<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>  <span class="comment">// use of block here refers to contiguous amplitudes where measureQubit = 0, </span></div>
<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>  <span class="comment">// (then =1) and NOT the CUDA block, which is the partitioning of CUDA threads</span></div>
<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>  </div>
<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> densityDim = 1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = densityDim >> 1;</div>
<div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeHalfBlock = 1LL << (measureQubit);</div>
<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock = 2LL * sizeHalfBlock;</div>
<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>  </div>
<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock; <span class="comment">// which block this thread is processing</span></div>
<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// which part of the block this thread is processing</span></div>
<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> basisIndex; <span class="comment">// index of this thread's computational basis state</span></div>
<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> densityIndex; <span class="comment">// " " index of |basis><basis| in the flat density matrix</span></div>
<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>  </div>
<div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>  <span class="comment">// array of each thread's collected probability, to be summed</span></div>
<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>  </div>
<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>  <span class="comment">// figure out which density matrix prob that this thread is assigned</span></div>
<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>  basisIndex = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>  densityIndex = (densityDim + 1) * basisIndex;</div>
<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>  </div>
<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>  <span class="comment">// record the probability in the CUDA-BLOCK-wide array</span></div>
<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prob = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[densityIndex]; <span class="comment">// im[densityIndex] assumed ~ 0</span></div>
<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>  tempReductionArray[threadIdx.x] = prob;</div>
<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>  </div>
<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>  <span class="comment">// sum the probs collected by this CUDA-BLOCK's threads into a per-CUDA-BLOCK array</span></div>
<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>  __syncthreads();</div>
<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2){</div>
<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>  }</div>
<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span> }</div>
<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>  </div>
<div class="line"><a name="l01798"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aae568d73d0de878acffe3798779de474"> 1798</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aae568d73d0de878acffe3798779de474">statevec_findProbabilityOfZeroKernel</a>(</div>
<div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>  <a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> measureQubit, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray</div>
<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span> ) {</div>
<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>  index; <span class="comment">// current index for first half block</span></div>
<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>  <span class="comment">// (good for shared memory parallelism)</span></div>
<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>  </div>
<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>  </div>
<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>  <span class="comment">// dimensions //</span></div>
<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>  sizeHalfBlock = 1LL << (measureQubit); <span class="comment">// number of state vector elements to sum,</span></div>
<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>  <span class="comment">// and then the number to skip</span></div>
<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks (pairs of measure and skip entries)</span></div>
<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>  </div>
<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>  <span class="comment">// find probability //</span></div>
<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>  </div>
<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>  <span class="comment">//</span></div>
<div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>  <span class="comment">// --- task-based shared-memory parallel implementation</span></div>
<div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>  <span class="comment">//</span></div>
<div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>  </div>
<div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>  </div>
<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>  </div>
<div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>  index = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> realVal, imagVal;</div>
<div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>  realVal = stateVecReal[index];</div>
<div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>  imagVal = stateVecImag[index]; </div>
<div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>  tempReductionArray[threadIdx.x] = realVal*realVal + imagVal*imagVal;</div>
<div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>  __syncthreads();</div>
<div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>  </div>
<div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2){</div>
<div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>  }</div>
<div class="line"><a name="l01846"></a><span class="lineno"> 1846</span> }</div>
<div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>  </div>
<div class="line"><a name="l01848"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a112c74b3365bda6697813d9931b55377"> 1848</a></span> <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#a112c74b3365bda6697813d9931b55377">getNumReductionLevels</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce, <span class="keywordtype">int</span> numReducedPerLevel){</div>
<div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>  <span class="keywordtype">int</span> levels=0;</div>
<div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>  <span class="keywordflow">while</span> (numValuesToReduce){</div>
<div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>  numValuesToReduce = numValuesToReduce/numReducedPerLevel;</div>
<div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>  levels++;</div>
<div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>  }</div>
<div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>  <span class="keywordflow">return</span> levels;</div>
<div class="line"><a name="l01855"></a><span class="lineno"> 1855</span> }</div>
<div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>  </div>
<div class="line"><a name="l01857"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b"> 1857</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> **a, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> **b){</div>
<div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *temp;</div>
<div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>  temp = *a;</div>
<div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>  *a = *b;</div>
<div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>  *b = temp;</div>
<div class="line"><a name="l01862"></a><span class="lineno"> 1862</span> }</div>
<div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>  </div>
<div class="line"><a name="l01864"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#afbb044d76bf22d5c81a2a70a977f29bc"> 1864</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#afbb044d76bf22d5c81a2a70a977f29bc">densmatr_findProbabilityOfZero</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> measureQubit)</div>
<div class="line"><a name="l01865"></a><span class="lineno"> 1865</span> {</div>
<div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> densityDim = 1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce = densityDim >> 1; <span class="comment">// half of the diagonal has measureQubit=0</span></div>
<div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>  </div>
<div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>  <span class="keywordtype">int</span> maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>  <span class="keywordtype">int</span> firstTime = 1;</div>
<div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>  </div>
<div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>  </div>
<div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>  <span class="comment">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>  }</div>
<div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>  }</div>
<div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>  </div>
<div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>  </div>
<div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>  <span class="comment">// spawn threads to sum the probs in each block</span></div>
<div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>  densmatr_findProbabilityOfZeroKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>  qureg, measureQubit, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>  firstTime = 0;</div>
<div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>  </div>
<div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>  <span class="comment">// sum the block probs</span></div>
<div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>  qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>  }</div>
<div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>  </div>
<div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>  }</div>
<div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>  </div>
<div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> zeroProb;</div>
<div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>  cudaMemcpy(&zeroProb, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>  <span class="keywordflow">return</span> zeroProb;</div>
<div class="line"><a name="l01910"></a><span class="lineno"> 1910</span> }</div>
<div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>  </div>
<div class="line"><a name="l01912"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a067da9fba487d5821fbd689718b19de2"> 1912</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#a067da9fba487d5821fbd689718b19de2">statevec_findProbabilityOfZero</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> measureQubit)</div>
<div class="line"><a name="l01913"></a><span class="lineno"> 1913</span> {</div>
<div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateProb=0;</div>
<div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>  <span class="keywordtype">int</span> firstTime=1;</div>
<div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>  <span class="keywordtype">int</span> maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>  </div>
<div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>  <span class="keywordflow">while</span>(numValuesToReduce>1){ </div>
<div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>  <span class="keywordflow">if</span> (numValuesToReduce<maxReducedPerLevel){</div>
<div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>  <span class="comment">// Need less than one CUDA block to reduce values</span></div>
<div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>  <span class="comment">// Use full CUDA blocks, with block size constrained by shared mem usage</span></div>
<div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>  }</div>
<div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>  </div>
<div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>  <span class="keywordflow">if</span> (firstTime){</div>
<div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>  statevec_findProbabilityOfZeroKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>  qureg, measureQubit, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>  firstTime=0;</div>
<div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>  qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>  }</div>
<div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>  }</div>
<div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>  cudaMemcpy(&stateProb, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>  <span class="keywordflow">return</span> stateProb;</div>
<div class="line"><a name="l01948"></a><span class="lineno"> 1948</span> }</div>
<div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>  </div>
<div class="line"><a name="l01950"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ab33cdf01831c4545e51299178acf7f27"> 1950</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#ab33cdf01831c4545e51299178acf7f27">statevec_calcProbOfOutcome</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> measureQubit, <span class="keywordtype">int</span> outcome)</div>
<div class="line"><a name="l01951"></a><span class="lineno"> 1951</span> {</div>
<div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb = <a class="code" href="QuEST__gpu_8cu.html#a067da9fba487d5821fbd689718b19de2">statevec_findProbabilityOfZero</a>(qureg, measureQubit);</div>
<div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>  <span class="keywordflow">if</span> (outcome==1)</div>
<div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>  outcomeProb = 1.0 - outcomeProb;</div>
<div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>  <span class="keywordflow">return</span> outcomeProb;</div>
<div class="line"><a name="l01956"></a><span class="lineno"> 1956</span> }</div>
<div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>  </div>
<div class="line"><a name="l01958"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ad405e3fac20997043e0236b751e44270"> 1958</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#ad405e3fac20997043e0236b751e44270">densmatr_calcProbOfOutcome</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> measureQubit, <span class="keywordtype">int</span> outcome)</div>
<div class="line"><a name="l01959"></a><span class="lineno"> 1959</span> {</div>
<div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb = <a class="code" href="QuEST__gpu_8cu.html#afbb044d76bf22d5c81a2a70a977f29bc">densmatr_findProbabilityOfZero</a>(qureg, measureQubit);</div>
<div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>  <span class="keywordflow">if</span> (outcome==1) </div>
<div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>  outcomeProb = 1.0 - outcomeProb;</div>
<div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>  <span class="keywordflow">return</span> outcomeProb;</div>
<div class="line"><a name="l01964"></a><span class="lineno"> 1964</span> }</div>
<div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>  </div>
<div class="line"><a name="l01967"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a24d53b07592f424e5cc3dcd12f51bf32"> 1967</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a24d53b07592f424e5cc3dcd12f51bf32">densmatr_calcInnerProductKernel</a>(</div>
<div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>  <a class="code" href="structQureg.html">Qureg</a> a, <a class="code" href="structQureg.html">Qureg</a> b, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTermsToSum, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* reducedArray</div>
<div class="line"><a name="l01969"></a><span class="lineno"> 1969</span> ) { </div>
<div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>  <span class="keywordflow">if</span> (index >= numTermsToSum) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>  </div>
<div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>  <span class="comment">// Re{ conj(a) b } = Re{ (aRe - i aIm)(bRe + i bIm) } = aRe bRe + aIm bIm</span></div>
<div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prod = (</div>
<div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>  a.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index]*b.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index] </div>
<div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>  + a.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index]*b.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index]);</div>
<div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>  </div>
<div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>  <span class="comment">// array of each thread's collected sum term, to be summed</span></div>
<div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>  tempReductionArray[threadIdx.x] = prod;</div>
<div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>  __syncthreads();</div>
<div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>  </div>
<div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l01986"></a><span class="lineno"> 1986</span> }</div>
<div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>  </div>
<div class="line"><a name="l01988"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a6ff3dc624b5fafe8edae4fe327c255a0"> 1988</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#a6ff3dc624b5fafe8edae4fe327c255a0">densmatr_calcInnerProduct</a>(<a class="code" href="structQureg.html">Qureg</a> a, <a class="code" href="structQureg.html">Qureg</a> b) {</div>
<div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>  </div>
<div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>  <span class="comment">// we're summing the square of every term in the density matrix</span></div>
<div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce = a.<a class="code" href="structQureg.html#adef4935cac95763c29164cf99b144ed4">numAmpsTotal</a>;</div>
<div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>  </div>
<div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>  <span class="keywordtype">int</span> maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>  <span class="keywordtype">int</span> firstTime = 1;</div>
<div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>  </div>
<div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>  </div>
<div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>  <span class="comment">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>  }</div>
<div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>  }</div>
<div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>  <span class="comment">// dictates size of reduction array</span></div>
<div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>  </div>
<div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>  <span class="comment">// spawn threads to sum the terms in each block</span></div>
<div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>  <span class="comment">// arbitrarily store the reduction in the b qureg's array</span></div>
<div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>  densmatr_calcInnerProductKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>  a, b, a.<a class="code" href="structQureg.html#adef4935cac95763c29164cf99b144ed4">numAmpsTotal</a>, b.firstLevelReduction);</div>
<div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>  firstTime = 0;</div>
<div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>  } </div>
<div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>  <span class="comment">// sum the block terms</span></div>
<div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>  b.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>  b.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(b.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(b.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>  }</div>
<div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>  </div>
<div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>  }</div>
<div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>  </div>
<div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> innerprod;</div>
<div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>  cudaMemcpy(&innerprod, b.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>  <span class="keywordflow">return</span> innerprod;</div>
<div class="line"><a name="l02035"></a><span class="lineno"> 2035</span> }</div>
<div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>  </div>
<div class="line"><a name="l02038"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a4f3c49fa4904bb120bbb6ae2e6395dfd"> 2038</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a4f3c49fa4904bb120bbb6ae2e6395dfd">statevec_calcInnerProductKernel</a>(</div>
<div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>  <span class="keywordtype">int</span> getRealComp,</div>
<div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal1, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecImag1, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal2, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecImag2, </div>
<div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTermsToSum, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* reducedArray) </div>
<div class="line"><a name="l02042"></a><span class="lineno"> 2042</span> {</div>
<div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>  <span class="keywordflow">if</span> (index >= numTermsToSum) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>  </div>
<div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>  <span class="comment">// choose whether to calculate the real or imaginary term of the inner product</span></div>
<div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> innerProdTerm;</div>
<div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>  <span class="keywordflow">if</span> (getRealComp)</div>
<div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>  innerProdTerm = vecReal1[index]*vecReal2[index] + vecImag1[index]*vecImag2[index];</div>
<div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>  <span class="keywordflow">else</span></div>
<div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>  innerProdTerm = vecReal1[index]*vecImag2[index] - vecImag1[index]*vecReal2[index];</div>
<div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>  </div>
<div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>  <span class="comment">// array of each thread's collected sum term, to be summed</span></div>
<div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>  tempReductionArray[threadIdx.x] = innerProdTerm;</div>
<div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>  __syncthreads();</div>
<div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>  </div>
<div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l02061"></a><span class="lineno"> 2061</span> }</div>
<div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>  </div>
<div class="line"><a name="l02068"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a7ebd3198a198f4cd20840f64fd8b84d0"> 2068</a></span> <a class="code" href="structComplex.html">Complex</a> <a class="code" href="QuEST__gpu_8cu.html#a7ebd3198a198f4cd20840f64fd8b84d0">statevec_calcInnerProduct</a>(<a class="code" href="structQureg.html">Qureg</a> bra, <a class="code" href="structQureg.html">Qureg</a> ket) {</div>
<div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>  </div>
<div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> innerProdReal, innerProdImag;</div>
<div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>  </div>
<div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>  <span class="keywordtype">int</span> getRealComp;</div>
<div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce;</div>
<div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>  <span class="keywordtype">int</span> maxReducedPerLevel;</div>
<div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>  <span class="keywordtype">int</span> firstTime;</div>
<div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>  </div>
<div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>  <span class="comment">// compute real component of inner product</span></div>
<div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>  getRealComp = 1;</div>
<div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>  numValuesToReduce = bra.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>  maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>  firstTime = 1;</div>
<div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>  }</div>
<div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>  }</div>
<div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>  statevec_calcInnerProductKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>  getRealComp,</div>
<div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>  bra.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, bra.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>  ket.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, ket.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>  numValuesToReduce, </div>
<div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>  bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>  firstTime = 0;</div>
<div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>  bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>  bra.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(bra.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>  }</div>
<div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>  }</div>
<div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>  cudaMemcpy(&innerProdReal, bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>  </div>
<div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>  <span class="comment">// compute imag component of inner product</span></div>
<div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>  getRealComp = 0;</div>
<div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>  numValuesToReduce = bra.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>  maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>  firstTime = 1;</div>
<div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>  }</div>
<div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>  }</div>
<div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>  statevec_calcInnerProductKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>  getRealComp,</div>
<div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>  bra.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, bra.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>  ket.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, ket.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>  numValuesToReduce, </div>
<div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>  bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>  firstTime = 0;</div>
<div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>  bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>  bra.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(bra.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>  }</div>
<div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>  }</div>
<div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>  cudaMemcpy(&innerProdImag, bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>  </div>
<div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>  <span class="comment">// return complex</span></div>
<div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>  <a class="code" href="structComplex.html">Complex</a> innerProd;</div>
<div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>  innerProd.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a> = innerProdReal;</div>
<div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>  innerProd.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a> = innerProdImag;</div>
<div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>  <span class="keywordflow">return</span> innerProd;</div>
<div class="line"><a name="l02153"></a><span class="lineno"> 2153</span> }</div>
<div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>  </div>
<div class="line"><a name="l02156"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a090901670793c53a1b08629712b2cdae"> 2156</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a090901670793c53a1b08629712b2cdae">densmatr_calcFidelityKernel</a>(<a class="code" href="structQureg.html">Qureg</a> dens, <a class="code" href="structQureg.html">Qureg</a> vec, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> dim, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* reducedArray) {</div>
<div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>  </div>
<div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>  <span class="comment">// figure out which density matrix row to consider</span></div>
<div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> col;</div>
<div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> row = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>  <span class="keywordflow">if</span> (row >= dim) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>  </div>
<div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* densReal = dens.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* densImag = dens.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal = vec.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecImag = vec.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>  </div>
<div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>  <span class="comment">// compute the row-th element of the product dens*vec</span></div>
<div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prodReal = 0;</div>
<div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prodImag = 0;</div>
<div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>  <span class="keywordflow">for</span> (col=0LL; col < dim; col++) {</div>
<div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densElemReal = densReal[dim*col + row];</div>
<div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densElemImag = densImag[dim*col + row];</div>
<div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>  </div>
<div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>  prodReal += densElemReal*vecReal[col] - densElemImag*vecImag[col];</div>
<div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>  prodImag += densElemReal*vecImag[col] + densElemImag*vecReal[col];</div>
<div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>  }</div>
<div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>  </div>
<div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>  <span class="comment">// multiply with row-th elem of (vec^*)</span></div>
<div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> termReal = prodImag*vecImag[row] + prodReal*vecReal[row];</div>
<div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>  </div>
<div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>  <span class="comment">// imag of every term should be zero, because each is a valid fidelity calc of an eigenstate</span></div>
<div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>  <span class="comment">//qreal termImag = prodImag*vecReal[row] - prodReal*vecImag[row];</span></div>
<div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>  </div>
<div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>  tempReductionArray[threadIdx.x] = termReal;</div>
<div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>  __syncthreads();</div>
<div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>  </div>
<div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l02192"></a><span class="lineno"> 2192</span> }</div>
<div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>  </div>
<div class="line"><a name="l02194"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aa6c3f86010ad398f42b0577ea3bb5bcf"> 2194</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#aa6c3f86010ad398f42b0577ea3bb5bcf">densmatr_calcFidelity</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <a class="code" href="structQureg.html">Qureg</a> pureState) {</div>
<div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>  </div>
<div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>  <span class="comment">// we're summing the square of every term in the density matrix</span></div>
<div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> densityDim = 1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce = densityDim;</div>
<div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>  </div>
<div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>  <span class="keywordtype">int</span> maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>  <span class="keywordtype">int</span> firstTime = 1;</div>
<div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>  </div>
<div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>  </div>
<div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>  <span class="comment">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>  }</div>
<div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>  }</div>
<div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>  <span class="comment">// dictates size of reduction array</span></div>
<div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>  </div>
<div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>  <span class="comment">// spawn threads to sum the probs in each block</span></div>
<div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>  <span class="comment">// store the reduction in the pureState array</span></div>
<div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>  densmatr_calcFidelityKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>  qureg, pureState, densityDim, pureState.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>  firstTime = 0;</div>
<div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>  </div>
<div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>  <span class="comment">// sum the block probs</span></div>
<div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>  pureState.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>  pureState.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(pureState.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(pureState.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>  }</div>
<div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>  </div>
<div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>  }</div>
<div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>  </div>
<div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> fidelity;</div>
<div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>  cudaMemcpy(&fidelity, pureState.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>  <span class="keywordflow">return</span> fidelity;</div>
<div class="line"><a name="l02242"></a><span class="lineno"> 2242</span> }</div>
<div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>  </div>
<div class="line"><a name="l02244"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a8e15b37c8dd7514a5480381699aa82c2"> 2244</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a8e15b37c8dd7514a5480381699aa82c2">densmatr_calcHilbertSchmidtDistanceSquaredKernel</a>(</div>
<div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* aRe, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* aIm, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* bRe, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* bIm, </div>
<div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToSum, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray</div>
<div class="line"><a name="l02247"></a><span class="lineno"> 2247</span> ) {</div>
<div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>  <span class="comment">// figure out which density matrix term this thread is assigned</span></div>
<div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>  <span class="keywordflow">if</span> (index >= numAmpsToSum) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>  </div>
<div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>  <span class="comment">// compute this thread's sum term</span></div>
<div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> difRe = aRe[index] - bRe[index];</div>
<div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> difIm = aIm[index] - bIm[index];</div>
<div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> term = difRe*difRe + difIm*difIm;</div>
<div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>  </div>
<div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>  <span class="comment">// array of each thread's collected term, to be summed</span></div>
<div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>  tempReductionArray[threadIdx.x] = term;</div>
<div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>  __syncthreads();</div>
<div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>  </div>
<div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l02265"></a><span class="lineno"> 2265</span> }</div>
<div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>  </div>
<div class="line"><a name="l02267"></a><span class="lineno"> 2267</span> <span class="comment">/* computes sqrt(Tr( (a-b) conjTrans(a-b) ) = sqrt( sum of abs vals of (a-b)) */</span></div>
<div class="line"><a name="l02268"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a8c9da88f734b0862f4cce7d819e6d3b5"> 2268</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#a8c9da88f734b0862f4cce7d819e6d3b5">densmatr_calcHilbertSchmidtDistance</a>(<a class="code" href="structQureg.html">Qureg</a> a, <a class="code" href="structQureg.html">Qureg</a> b) {</div>
<div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>  </div>
<div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>  <span class="comment">// we're summing the square of every term in (a-b)</span></div>
<div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce = a.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>  </div>
<div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>  <span class="keywordtype">int</span> maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>  <span class="keywordtype">int</span> firstTime = 1;</div>
<div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>  </div>
<div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>  </div>
<div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>  <span class="comment">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>  }</div>
<div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>  }</div>
<div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>  <span class="comment">// dictates size of reduction array</span></div>
<div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>  </div>
<div class="line"><a name="l02292"></a><span class="lineno"> 2292</span>  <span class="comment">// spawn threads to sum the probs in each block (store reduction temp values in a's reduction array)</span></div>
<div class="line"><a name="l02293"></a><span class="lineno"> 2293</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>  densmatr_calcHilbertSchmidtDistanceSquaredKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>  a.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, a.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>  b.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, b.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>  numValuesToReduce, a.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>  firstTime = 0;</div>
<div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>  </div>
<div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>  <span class="comment">// sum the block probs</span></div>
<div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>  a.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>  a.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(a.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(a.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>  }</div>
<div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>  </div>
<div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>  }</div>
<div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>  </div>
<div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> trace;</div>
<div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>  cudaMemcpy(&trace, a.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>  </div>
<div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sqrtTrace = sqrt(trace);</div>
<div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>  <span class="keywordflow">return</span> sqrtTrace;</div>
<div class="line"><a name="l02318"></a><span class="lineno"> 2318</span> }</div>
<div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>  </div>
<div class="line"><a name="l02320"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#afe005f9f69319901bb56c4d022359ad5"> 2320</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#afe005f9f69319901bb56c4d022359ad5">densmatr_calcPurityKernel</a>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecImag, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToSum, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray) {</div>
<div class="line"><a name="l02321"></a><span class="lineno"> 2321</span>  </div>
<div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>  <span class="comment">// figure out which density matrix term this thread is assigned</span></div>
<div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>  <span class="keywordflow">if</span> (index >= numAmpsToSum) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>  </div>
<div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> term = vecReal[index]*vecReal[index] + vecImag[index]*vecImag[index];</div>
<div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>  </div>
<div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>  <span class="comment">// array of each thread's collected probability, to be summed</span></div>
<div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>  tempReductionArray[threadIdx.x] = term;</div>
<div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>  __syncthreads();</div>
<div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>  </div>
<div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l02336"></a><span class="lineno"> 2336</span> }</div>
<div class="line"><a name="l02337"></a><span class="lineno"> 2337</span>  </div>
<div class="line"><a name="l02339"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ae45eefa65f4ecd37bab84fade7cf7f1f"> 2339</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#ae45eefa65f4ecd37bab84fade7cf7f1f">densmatr_calcPurity</a>(<a class="code" href="structQureg.html">Qureg</a> qureg) {</div>
<div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>  </div>
<div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>  <span class="comment">// we're summing the square of every term in the density matrix</span></div>
<div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>  </div>
<div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>  <span class="keywordtype">int</span> maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>  <span class="keywordtype">int</span> firstTime = 1;</div>
<div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>  </div>
<div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>  </div>
<div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>  <span class="comment">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>  }</div>
<div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>  }</div>
<div class="line"><a name="l02360"></a><span class="lineno"> 2360</span>  <span class="comment">// dictates size of reduction array</span></div>
<div class="line"><a name="l02361"></a><span class="lineno"> 2361</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02362"></a><span class="lineno"> 2362</span>  </div>
<div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>  <span class="comment">// spawn threads to sum the probs in each block</span></div>
<div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>  densmatr_calcPurityKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02366"></a><span class="lineno"> 2366</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l02367"></a><span class="lineno"> 2367</span>  numValuesToReduce, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>  firstTime = 0;</div>
<div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>  </div>
<div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>  <span class="comment">// sum the block probs</span></div>
<div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>  qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>  }</div>
<div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>  </div>
<div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>  }</div>
<div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>  </div>
<div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> traceDensSquared;</div>
<div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>  cudaMemcpy(&traceDensSquared, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>  <span class="keywordflow">return</span> traceDensSquared;</div>
<div class="line"><a name="l02386"></a><span class="lineno"> 2386</span> }</div>
<div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>  </div>
<div class="line"><a name="l02388"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a5d2202221eed63dc9b003d716a46e879"> 2388</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a5d2202221eed63dc9b003d716a46e879">statevec_collapseToKnownProbOutcomeKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> measureQubit, <span class="keywordtype">int</span> outcome, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> totalProbability)</div>
<div class="line"><a name="l02389"></a><span class="lineno"> 2389</span> {</div>
<div class="line"><a name="l02390"></a><span class="lineno"> 2390</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>  index; <span class="comment">// current index for first half block</span></div>
<div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>  <span class="comment">// ----- measured probability</span></div>
<div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> renorm; <span class="comment">// probability (returned) value</span></div>
<div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>  <span class="comment">// (good for shared memory parallelism)</span></div>
<div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>  </div>
<div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>  <span class="comment">// dimensions //</span></div>
<div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>  sizeHalfBlock = 1LL << (measureQubit); <span class="comment">// number of state vector elements to sum,</span></div>
<div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>  <span class="comment">// and then the number to skip</span></div>
<div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks (pairs of measure and skip entries)</span></div>
<div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>  </div>
<div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>  <span class="comment">// find probability //</span></div>
<div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>  </div>
<div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>  <span class="comment">//</span></div>
<div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>  <span class="comment">// --- task-based shared-memory parallel implementation</span></div>
<div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>  <span class="comment">//</span></div>
<div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>  renorm=1/sqrt(totalProbability);</div>
<div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>  </div>
<div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>  index = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>  </div>
<div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>  <span class="keywordflow">if</span> (outcome==0){</div>
<div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>  stateVecReal[index]=stateVecReal[index]*renorm;</div>
<div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>  stateVecImag[index]=stateVecImag[index]*renorm;</div>
<div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>  </div>
<div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>  stateVecReal[index+sizeHalfBlock]=0;</div>
<div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>  stateVecImag[index+sizeHalfBlock]=0;</div>
<div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (outcome==1){</div>
<div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>  stateVecReal[index]=0;</div>
<div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>  stateVecImag[index]=0;</div>
<div class="line"><a name="l02435"></a><span class="lineno"> 2435</span>  </div>
<div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>  stateVecReal[index+sizeHalfBlock]=stateVecReal[index+sizeHalfBlock]*renorm;</div>
<div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>  stateVecImag[index+sizeHalfBlock]=stateVecImag[index+sizeHalfBlock]*renorm;</div>
<div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>  }</div>
<div class="line"><a name="l02439"></a><span class="lineno"> 2439</span> }</div>
<div class="line"><a name="l02440"></a><span class="lineno"> 2440</span>  </div>
<div class="line"><a name="l02441"></a><span class="lineno"> 2441</span> <span class="comment">/*</span></div>
<div class="line"><a name="l02442"></a><span class="lineno"> 2442</span> <span class="comment"> * outcomeProb must accurately be the probability of that qubit outcome in the state-vector, or</span></div>
<div class="line"><a name="l02443"></a><span class="lineno"> 2443</span> <span class="comment"> * else the state-vector will lose normalisation</span></div>
<div class="line"><a name="l02444"></a><span class="lineno"> 2444</span> <span class="comment"> */</span></div>
<div class="line"><a name="l02445"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ae7f25bb40734e18a992403b17355893b"> 2445</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ae7f25bb40734e18a992403b17355893b">statevec_collapseToKnownProbOutcome</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> measureQubit, <span class="keywordtype">int</span> outcome, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb)</div>
<div class="line"><a name="l02446"></a><span class="lineno"> 2446</span> { </div>
<div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02449"></a><span class="lineno"> 2449</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l02450"></a><span class="lineno"> 2450</span>  statevec_collapseToKnownProbOutcomeKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, measureQubit, outcome, outcomeProb);</div>
<div class="line"><a name="l02451"></a><span class="lineno"> 2451</span> }</div>
<div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>  </div>
<div class="line"><a name="l02454"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#afc4dcedaf429d823f4da83d3521d8293"> 2454</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#afc4dcedaf429d823f4da83d3521d8293">densmatr_collapseToKnownProbOutcomeKernel</a>(</div>
<div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numBasesToVisit,</div>
<div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3, </div>
<div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> desired, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> undesired) </div>
<div class="line"><a name="l02458"></a><span class="lineno"> 2458</span> {</div>
<div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> scanInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>  <span class="keywordflow">if</span> (scanInd >= numBasesToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>  </div>
<div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> base = (scanInd&part1) + ((scanInd&part2)<<1) + ((scanInd&part3)<<2);</div>
<div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>  </div>
<div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>  <span class="comment">// renormalise desired outcome</span></div>
<div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>  vecReal[base + desired] /= outcomeProb;</div>
<div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>  vecImag[base + desired] /= outcomeProb;</div>
<div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>  </div>
<div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>  <span class="comment">// kill undesired outcome</span></div>
<div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>  vecReal[base + undesired] = 0;</div>
<div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>  vecImag[base + undesired] = 0;</div>
<div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>  </div>
<div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>  <span class="comment">// kill |..0..><..1..| states</span></div>
<div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>  vecReal[base + colBit] = 0;</div>
<div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>  vecImag[base + colBit] = 0;</div>
<div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>  vecReal[base + rowBit] = 0;</div>
<div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>  vecImag[base + rowBit] = 0;</div>
<div class="line"><a name="l02477"></a><span class="lineno"> 2477</span> }</div>
<div class="line"><a name="l02478"></a><span class="lineno"> 2478</span>  </div>
<div class="line"><a name="l02480"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ab321af37fe3490253e12b7c70b8d2a98"> 2480</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ab321af37fe3490253e12b7c70b8d2a98">densmatr_collapseToKnownProbOutcome</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> measureQubit, <span class="keywordtype">int</span> outcome, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb) {</div>
<div class="line"><a name="l02481"></a><span class="lineno"> 2481</span>  </div>
<div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>  <span class="keywordtype">int</span> rowQubit = measureQubit + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>  </div>
<div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>  <span class="keywordtype">int</span> colBit = 1LL << measureQubit;</div>
<div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>  <span class="keywordtype">int</span> rowBit = 1LL << rowQubit;</div>
<div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>  </div>
<div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numBasesToVisit = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>/4;</div>
<div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1 = colBit -1; </div>
<div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2 = (rowBit >> 1) - colBit;</div>
<div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3 = numBasesToVisit - (rowBit >> 1);</div>
<div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>  </div>
<div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> desired, undesired;</div>
<div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>  <span class="keywordflow">if</span> (outcome == 0) {</div>
<div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>  desired = 0;</div>
<div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>  undesired = colBit | rowBit;</div>
<div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02497"></a><span class="lineno"> 2497</span>  desired = colBit | rowBit;</div>
<div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>  undesired = 0;</div>
<div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>  }</div>
<div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>  </div>
<div class="line"><a name="l02501"></a><span class="lineno"> 2501</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>  CUDABlocks = ceil(numBasesToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>  densmatr_collapseToKnownProbOutcomeKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>  outcomeProb, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, numBasesToVisit,</div>
<div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>  part1, part2, part3, rowBit, colBit, desired, undesired);</div>
<div class="line"><a name="l02507"></a><span class="lineno"> 2507</span> }</div>
<div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>  </div>
<div class="line"><a name="l02509"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a7f1cf14dd4820a59eb8a9874c2062bef"> 2509</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a7f1cf14dd4820a59eb8a9874c2062bef">densmatr_mixDensityMatrixKernel</a>(<a class="code" href="structQureg.html">Qureg</a> combineQureg, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> otherProb, <a class="code" href="structQureg.html">Qureg</a> otherQureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit) {</div>
<div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>  </div>
<div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ampInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>  <span class="keywordflow">if</span> (ampInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>  </div>
<div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>  combineQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[ampInd] *= 1-otherProb;</div>
<div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>  combineQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[ampInd] *= 1-otherProb;</div>
<div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>  </div>
<div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>  combineQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[ampInd] += otherProb*otherQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[ampInd];</div>
<div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>  combineQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[ampInd] += otherProb*otherQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[ampInd];</div>
<div class="line"><a name="l02519"></a><span class="lineno"> 2519</span> }</div>
<div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>  </div>
<div class="line"><a name="l02521"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a8adaba9dbdad6f7ab41ae4b8db0abefe"> 2521</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a8adaba9dbdad6f7ab41ae4b8db0abefe">densmatr_mixDensityMatrix</a>(<a class="code" href="structQureg.html">Qureg</a> combineQureg, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> otherProb, <a class="code" href="structQureg.html">Qureg</a> otherQureg) {</div>
<div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>  </div>
<div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit = combineQureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02524"></a><span class="lineno"> 2524</span>  </div>
<div class="line"><a name="l02525"></a><span class="lineno"> 2525</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02526"></a><span class="lineno"> 2526</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>  densmatr_mixDensityMatrixKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>  combineQureg, otherProb, otherQureg, numAmpsToVisit</div>
<div class="line"><a name="l02530"></a><span class="lineno"> 2530</span>  );</div>
<div class="line"><a name="l02531"></a><span class="lineno"> 2531</span> }</div>
<div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>  </div>
<div class="line"><a name="l02538"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a37c6a59b2dd008d235474cb7248df952"> 2538</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a37c6a59b2dd008d235474cb7248df952">densmatr_mixDephasingKernel</a>(</div>
<div class="line"><a name="l02539"></a><span class="lineno"> 2539</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> fac, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit,</div>
<div class="line"><a name="l02540"></a><span class="lineno"> 2540</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3, </div>
<div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit)</div>
<div class="line"><a name="l02542"></a><span class="lineno"> 2542</span> {</div>
<div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> scanInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02544"></a><span class="lineno"> 2544</span>  <span class="keywordflow">if</span> (scanInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>  </div>
<div class="line"><a name="l02546"></a><span class="lineno"> 2546</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ampInd = (scanInd&part1) + ((scanInd&part2)<<1) + ((scanInd&part3)<<2);</div>
<div class="line"><a name="l02547"></a><span class="lineno"> 2547</span>  vecReal[ampInd + colBit] *= fac;</div>
<div class="line"><a name="l02548"></a><span class="lineno"> 2548</span>  vecImag[ampInd + colBit] *= fac;</div>
<div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>  vecReal[ampInd + rowBit] *= fac;</div>
<div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>  vecImag[ampInd + rowBit] *= fac;</div>
<div class="line"><a name="l02551"></a><span class="lineno"> 2551</span> }</div>
<div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>  </div>
<div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>  </div>
<div class="line"><a name="l02554"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a303c00c3329a7bf290b68468735b4a8f"> 2554</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a303c00c3329a7bf290b68468735b4a8f">densmatr_oneQubitDegradeOffDiagonal</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephFac) {</div>
<div class="line"><a name="l02555"></a><span class="lineno"> 2555</span>  </div>
<div class="line"><a name="l02556"></a><span class="lineno"> 2556</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>/4;</div>
<div class="line"><a name="l02557"></a><span class="lineno"> 2557</span>  </div>
<div class="line"><a name="l02558"></a><span class="lineno"> 2558</span>  <span class="keywordtype">int</span> rowQubit = targetQubit + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02559"></a><span class="lineno"> 2559</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit = 1LL << targetQubit;</div>
<div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit = 1LL << rowQubit;</div>
<div class="line"><a name="l02561"></a><span class="lineno"> 2561</span>  </div>
<div class="line"><a name="l02562"></a><span class="lineno"> 2562</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1 = colBit - 1;</div>
<div class="line"><a name="l02563"></a><span class="lineno"> 2563</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2 = (rowBit >> 1) - colBit;</div>
<div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3 = numAmpsToVisit - (rowBit >> 1);</div>
<div class="line"><a name="l02565"></a><span class="lineno"> 2565</span>  </div>
<div class="line"><a name="l02566"></a><span class="lineno"> 2566</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02567"></a><span class="lineno"> 2567</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02568"></a><span class="lineno"> 2568</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02569"></a><span class="lineno"> 2569</span>  densmatr_mixDephasingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02570"></a><span class="lineno"> 2570</span>  dephFac, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, numAmpsToVisit,</div>
<div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>  part1, part2, part3, colBit, rowBit);</div>
<div class="line"><a name="l02572"></a><span class="lineno"> 2572</span> }</div>
<div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>  </div>
<div class="line"><a name="l02574"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a515b6a920b1715d4eae25dcf29f39b95"> 2574</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a515b6a920b1715d4eae25dcf29f39b95">densmatr_mixDephasing</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephase) {</div>
<div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>  </div>
<div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>  <span class="keywordflow">if</span> (dephase == 0)</div>
<div class="line"><a name="l02577"></a><span class="lineno"> 2577</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02578"></a><span class="lineno"> 2578</span>  </div>
<div class="line"><a name="l02579"></a><span class="lineno"> 2579</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephFac = 1 - dephase;</div>
<div class="line"><a name="l02580"></a><span class="lineno"> 2580</span>  <a class="code" href="QuEST__gpu_8cu.html#a303c00c3329a7bf290b68468735b4a8f">densmatr_oneQubitDegradeOffDiagonal</a>(qureg, targetQubit, dephFac);</div>
<div class="line"><a name="l02581"></a><span class="lineno"> 2581</span> }</div>
<div class="line"><a name="l02582"></a><span class="lineno"> 2582</span>  </div>
<div class="line"><a name="l02589"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ad27d13bcdcbe777e139a90c2e8d52924"> 2589</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ad27d13bcdcbe777e139a90c2e8d52924">densmatr_mixTwoQubitDephasingKernel</a>(</div>
<div class="line"><a name="l02590"></a><span class="lineno"> 2590</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> fac, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numBackgroundStates, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit,</div>
<div class="line"><a name="l02591"></a><span class="lineno"> 2591</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part4, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part5,</div>
<div class="line"><a name="l02592"></a><span class="lineno"> 2592</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit1, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit1, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit2, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit2) </div>
<div class="line"><a name="l02593"></a><span class="lineno"> 2593</span> {</div>
<div class="line"><a name="l02594"></a><span class="lineno"> 2594</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> outerInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>  <span class="keywordflow">if</span> (outerInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02596"></a><span class="lineno"> 2596</span>  </div>
<div class="line"><a name="l02597"></a><span class="lineno"> 2597</span>  <span class="comment">// sets meta in 1...14 excluding 5, 10, creating bit string DCBA for |..D..C..><..B..A|</span></div>
<div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>  <span class="keywordtype">int</span> meta = 1 + (outerInd/numBackgroundStates);</div>
<div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>  <span class="keywordflow">if</span> (meta > 4) meta++;</div>
<div class="line"><a name="l02600"></a><span class="lineno"> 2600</span>  <span class="keywordflow">if</span> (meta > 9) meta++;</div>
<div class="line"><a name="l02601"></a><span class="lineno"> 2601</span>  </div>
<div class="line"><a name="l02602"></a><span class="lineno"> 2602</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> shift = rowBit2*((meta>>3)%2) + rowBit1*((meta>>2)%2) + colBit2*((meta>>1)%2) + colBit1*(meta%2);</div>
<div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> scanInd = outerInd % numBackgroundStates;</div>
<div class="line"><a name="l02604"></a><span class="lineno"> 2604</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateInd = (</div>
<div class="line"><a name="l02605"></a><span class="lineno"> 2605</span>  shift + </div>
<div class="line"><a name="l02606"></a><span class="lineno"> 2606</span>  (scanInd&part1) + ((scanInd&part2)<<1) + ((scanInd&part3)<<2) + ((scanInd&part4)<<3) + ((scanInd&part5)<<4));</div>
<div class="line"><a name="l02607"></a><span class="lineno"> 2607</span>  </div>
<div class="line"><a name="l02608"></a><span class="lineno"> 2608</span>  vecReal[stateInd] *= fac;</div>
<div class="line"><a name="l02609"></a><span class="lineno"> 2609</span>  vecImag[stateInd] *= fac;</div>
<div class="line"><a name="l02610"></a><span class="lineno"> 2610</span> }</div>
<div class="line"><a name="l02611"></a><span class="lineno"> 2611</span>  </div>
<div class="line"><a name="l02612"></a><span class="lineno"> 2612</span> <span class="comment">// @TODO is separating these 12 amplitudes really faster than letting every 16th base modify 12 elems?</span></div>
<div class="line"><a name="l02613"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a623e577b7230f3c8dc202be6185b4289"> 2613</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a623e577b7230f3c8dc202be6185b4289">densmatr_mixTwoQubitDephasing</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> qubit1, <span class="keywordtype">int</span> qubit2, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephase) {</div>
<div class="line"><a name="l02614"></a><span class="lineno"> 2614</span>  </div>
<div class="line"><a name="l02615"></a><span class="lineno"> 2615</span>  <span class="keywordflow">if</span> (dephase == 0)</div>
<div class="line"><a name="l02616"></a><span class="lineno"> 2616</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02617"></a><span class="lineno"> 2617</span>  </div>
<div class="line"><a name="l02618"></a><span class="lineno"> 2618</span>  <span class="comment">// assumes qubit2 > qubit1</span></div>
<div class="line"><a name="l02619"></a><span class="lineno"> 2619</span>  </div>
<div class="line"><a name="l02620"></a><span class="lineno"> 2620</span>  <span class="keywordtype">int</span> rowQubit1 = qubit1 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>  <span class="keywordtype">int</span> rowQubit2 = qubit2 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02622"></a><span class="lineno"> 2622</span>  </div>
<div class="line"><a name="l02623"></a><span class="lineno"> 2623</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit1 = 1LL << qubit1;</div>
<div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit1 = 1LL << rowQubit1;</div>
<div class="line"><a name="l02625"></a><span class="lineno"> 2625</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit2 = 1LL << qubit2;</div>
<div class="line"><a name="l02626"></a><span class="lineno"> 2626</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit2 = 1LL << rowQubit2;</div>
<div class="line"><a name="l02627"></a><span class="lineno"> 2627</span>  </div>
<div class="line"><a name="l02628"></a><span class="lineno"> 2628</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1 = colBit1 - 1;</div>
<div class="line"><a name="l02629"></a><span class="lineno"> 2629</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2 = (colBit2 >> 1) - colBit1;</div>
<div class="line"><a name="l02630"></a><span class="lineno"> 2630</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3 = (rowBit1 >> 2) - (colBit2 >> 1);</div>
<div class="line"><a name="l02631"></a><span class="lineno"> 2631</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part4 = (rowBit2 >> 3) - (rowBit1 >> 2);</div>
<div class="line"><a name="l02632"></a><span class="lineno"> 2632</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part5 = (qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>/16) - (rowBit2 >> 3);</div>
<div class="line"><a name="l02633"></a><span class="lineno"> 2633</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephFac = 1 - dephase;</div>
<div class="line"><a name="l02634"></a><span class="lineno"> 2634</span>  </div>
<div class="line"><a name="l02635"></a><span class="lineno"> 2635</span>  <span class="comment">// refers to states |a 0 b 0 c><d 0 e 0 f| (target qubits are fixed)</span></div>
<div class="line"><a name="l02636"></a><span class="lineno"> 2636</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numBackgroundStates = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>/16;</div>
<div class="line"><a name="l02637"></a><span class="lineno"> 2637</span>  </div>
<div class="line"><a name="l02638"></a><span class="lineno"> 2638</span>  <span class="comment">// 12 of these states experience dephasing</span></div>
<div class="line"><a name="l02639"></a><span class="lineno"> 2639</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit = 12 * numBackgroundStates;</div>
<div class="line"><a name="l02640"></a><span class="lineno"> 2640</span>  </div>
<div class="line"><a name="l02641"></a><span class="lineno"> 2641</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02643"></a><span class="lineno"> 2643</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02644"></a><span class="lineno"> 2644</span>  densmatr_mixTwoQubitDephasingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02645"></a><span class="lineno"> 2645</span>  dephFac, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, numBackgroundStates, numAmpsToVisit,</div>
<div class="line"><a name="l02646"></a><span class="lineno"> 2646</span>  part1, part2, part3, part4, part5, colBit1, rowBit1, colBit2, rowBit2);</div>
<div class="line"><a name="l02647"></a><span class="lineno"> 2647</span> }</div>
<div class="line"><a name="l02648"></a><span class="lineno"> 2648</span>  </div>
<div class="line"><a name="l02650"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aeb0039eccca94ba644a8728d91eff5bb"> 2650</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aeb0039eccca94ba644a8728d91eff5bb">densmatr_mixDepolarisingKernel</a>(</div>
<div class="line"><a name="l02651"></a><span class="lineno"> 2651</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> depolLevel, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit,</div>
<div class="line"><a name="l02652"></a><span class="lineno"> 2652</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3, </div>
<div class="line"><a name="l02653"></a><span class="lineno"> 2653</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> bothBits)</div>
<div class="line"><a name="l02654"></a><span class="lineno"> 2654</span> {</div>
<div class="line"><a name="l02655"></a><span class="lineno"> 2655</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> scanInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02656"></a><span class="lineno"> 2656</span>  <span class="keywordflow">if</span> (scanInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02657"></a><span class="lineno"> 2657</span>  </div>
<div class="line"><a name="l02658"></a><span class="lineno"> 2658</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> baseInd = (scanInd&part1) + ((scanInd&part2)<<1) + ((scanInd&part3)<<2);</div>
<div class="line"><a name="l02659"></a><span class="lineno"> 2659</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> targetInd = baseInd + bothBits;</div>
<div class="line"><a name="l02660"></a><span class="lineno"> 2660</span>  </div>
<div class="line"><a name="l02661"></a><span class="lineno"> 2661</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> realAvDepol = depolLevel * 0.5 * (vecReal[baseInd] + vecReal[targetInd]);</div>
<div class="line"><a name="l02662"></a><span class="lineno"> 2662</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> imagAvDepol = depolLevel * 0.5 * (vecImag[baseInd] + vecImag[targetInd]);</div>
<div class="line"><a name="l02663"></a><span class="lineno"> 2663</span>  </div>
<div class="line"><a name="l02664"></a><span class="lineno"> 2664</span>  vecReal[baseInd] *= 1 - depolLevel;</div>
<div class="line"><a name="l02665"></a><span class="lineno"> 2665</span>  vecImag[baseInd] *= 1 - depolLevel;</div>
<div class="line"><a name="l02666"></a><span class="lineno"> 2666</span>  vecReal[targetInd] *= 1 - depolLevel;</div>
<div class="line"><a name="l02667"></a><span class="lineno"> 2667</span>  vecImag[targetInd] *= 1 - depolLevel;</div>
<div class="line"><a name="l02668"></a><span class="lineno"> 2668</span>  </div>
<div class="line"><a name="l02669"></a><span class="lineno"> 2669</span>  vecReal[baseInd] += realAvDepol;</div>
<div class="line"><a name="l02670"></a><span class="lineno"> 2670</span>  vecImag[baseInd] += imagAvDepol;</div>
<div class="line"><a name="l02671"></a><span class="lineno"> 2671</span>  vecReal[targetInd] += realAvDepol;</div>
<div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>  vecImag[targetInd] += imagAvDepol;</div>
<div class="line"><a name="l02673"></a><span class="lineno"> 2673</span> }</div>
<div class="line"><a name="l02674"></a><span class="lineno"> 2674</span>  </div>
<div class="line"><a name="l02676"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a7e0a6e9de648b33168d7f56eba53aa7b"> 2676</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a7e0a6e9de648b33168d7f56eba53aa7b">densmatr_mixDampingKernel</a>(</div>
<div class="line"><a name="l02677"></a><span class="lineno"> 2677</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> damping, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit,</div>
<div class="line"><a name="l02678"></a><span class="lineno"> 2678</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3, </div>
<div class="line"><a name="l02679"></a><span class="lineno"> 2679</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> bothBits)</div>
<div class="line"><a name="l02680"></a><span class="lineno"> 2680</span> {</div>
<div class="line"><a name="l02681"></a><span class="lineno"> 2681</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> scanInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02682"></a><span class="lineno"> 2682</span>  <span class="keywordflow">if</span> (scanInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02683"></a><span class="lineno"> 2683</span>  </div>
<div class="line"><a name="l02684"></a><span class="lineno"> 2684</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> baseInd = (scanInd&part1) + ((scanInd&part2)<<1) + ((scanInd&part3)<<2);</div>
<div class="line"><a name="l02685"></a><span class="lineno"> 2685</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> targetInd = baseInd + bothBits;</div>
<div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>  </div>
<div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> realAvDepol = damping * ( vecReal[targetInd]);</div>
<div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> imagAvDepol = damping * ( vecImag[targetInd]);</div>
<div class="line"><a name="l02689"></a><span class="lineno"> 2689</span>  </div>
<div class="line"><a name="l02690"></a><span class="lineno"> 2690</span>  vecReal[targetInd] *= 1 - damping;</div>
<div class="line"><a name="l02691"></a><span class="lineno"> 2691</span>  vecImag[targetInd] *= 1 - damping;</div>
<div class="line"><a name="l02692"></a><span class="lineno"> 2692</span>  </div>
<div class="line"><a name="l02693"></a><span class="lineno"> 2693</span>  vecReal[baseInd] += realAvDepol;</div>
<div class="line"><a name="l02694"></a><span class="lineno"> 2694</span>  vecImag[baseInd] += imagAvDepol;</div>
<div class="line"><a name="l02695"></a><span class="lineno"> 2695</span> }</div>
<div class="line"><a name="l02696"></a><span class="lineno"> 2696</span>  </div>
<div class="line"><a name="l02697"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a3765e92c79d4c2a0df6761a0e7da2676"> 2697</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a3765e92c79d4c2a0df6761a0e7da2676">densmatr_mixDepolarising</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> depolLevel) {</div>
<div class="line"><a name="l02698"></a><span class="lineno"> 2698</span>  </div>
<div class="line"><a name="l02699"></a><span class="lineno"> 2699</span>  <span class="keywordflow">if</span> (depolLevel == 0)</div>
<div class="line"><a name="l02700"></a><span class="lineno"> 2700</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02701"></a><span class="lineno"> 2701</span>  </div>
<div class="line"><a name="l02702"></a><span class="lineno"> 2702</span>  <a class="code" href="QuEST__gpu_8cu.html#a515b6a920b1715d4eae25dcf29f39b95">densmatr_mixDephasing</a>(qureg, targetQubit, depolLevel);</div>
<div class="line"><a name="l02703"></a><span class="lineno"> 2703</span>  </div>
<div class="line"><a name="l02704"></a><span class="lineno"> 2704</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>/4;</div>
<div class="line"><a name="l02705"></a><span class="lineno"> 2705</span>  <span class="keywordtype">int</span> rowQubit = targetQubit + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02706"></a><span class="lineno"> 2706</span>  </div>
<div class="line"><a name="l02707"></a><span class="lineno"> 2707</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit = 1LL << targetQubit;</div>
<div class="line"><a name="l02708"></a><span class="lineno"> 2708</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit = 1LL << rowQubit;</div>
<div class="line"><a name="l02709"></a><span class="lineno"> 2709</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> bothBits = colBit | rowBit;</div>
<div class="line"><a name="l02710"></a><span class="lineno"> 2710</span>  </div>
<div class="line"><a name="l02711"></a><span class="lineno"> 2711</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1 = colBit - 1;</div>
<div class="line"><a name="l02712"></a><span class="lineno"> 2712</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2 = (rowBit >> 1) - colBit;</div>
<div class="line"><a name="l02713"></a><span class="lineno"> 2713</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3 = numAmpsToVisit - (rowBit >> 1);</div>
<div class="line"><a name="l02714"></a><span class="lineno"> 2714</span>  </div>
<div class="line"><a name="l02715"></a><span class="lineno"> 2715</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02716"></a><span class="lineno"> 2716</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02717"></a><span class="lineno"> 2717</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02718"></a><span class="lineno"> 2718</span>  densmatr_mixDepolarisingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02719"></a><span class="lineno"> 2719</span>  depolLevel, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, numAmpsToVisit,</div>
<div class="line"><a name="l02720"></a><span class="lineno"> 2720</span>  part1, part2, part3, bothBits);</div>
<div class="line"><a name="l02721"></a><span class="lineno"> 2721</span> }</div>
<div class="line"><a name="l02722"></a><span class="lineno"> 2722</span>  </div>
<div class="line"><a name="l02723"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a72b26b971531dbdc64de20501f368545"> 2723</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a72b26b971531dbdc64de20501f368545">densmatr_mixDamping</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keyword">const</span> <span class="keywordtype">int</span> targetQubit, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> damping) {</div>
<div class="line"><a name="l02724"></a><span class="lineno"> 2724</span>  </div>
<div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>  <span class="keywordflow">if</span> (damping == 0)</div>
<div class="line"><a name="l02726"></a><span class="lineno"> 2726</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02727"></a><span class="lineno"> 2727</span>  </div>
<div class="line"><a name="l02728"></a><span class="lineno"> 2728</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephase = sqrt(1-damping);</div>
<div class="line"><a name="l02729"></a><span class="lineno"> 2729</span>  <a class="code" href="QuEST__gpu_8cu.html#a303c00c3329a7bf290b68468735b4a8f">densmatr_oneQubitDegradeOffDiagonal</a>(qureg, targetQubit, dephase);</div>
<div class="line"><a name="l02730"></a><span class="lineno"> 2730</span>  </div>
<div class="line"><a name="l02731"></a><span class="lineno"> 2731</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>/4;</div>
<div class="line"><a name="l02732"></a><span class="lineno"> 2732</span>  <span class="keywordtype">int</span> rowQubit = targetQubit + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02733"></a><span class="lineno"> 2733</span>  </div>
<div class="line"><a name="l02734"></a><span class="lineno"> 2734</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit = 1LL << targetQubit;</div>
<div class="line"><a name="l02735"></a><span class="lineno"> 2735</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit = 1LL << rowQubit;</div>
<div class="line"><a name="l02736"></a><span class="lineno"> 2736</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> bothBits = colBit | rowBit;</div>
<div class="line"><a name="l02737"></a><span class="lineno"> 2737</span>  </div>
<div class="line"><a name="l02738"></a><span class="lineno"> 2738</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1 = colBit - 1;</div>
<div class="line"><a name="l02739"></a><span class="lineno"> 2739</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2 = (rowBit >> 1) - colBit;</div>
<div class="line"><a name="l02740"></a><span class="lineno"> 2740</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3 = numAmpsToVisit - (rowBit >> 1);</div>
<div class="line"><a name="l02741"></a><span class="lineno"> 2741</span>  </div>
<div class="line"><a name="l02742"></a><span class="lineno"> 2742</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02743"></a><span class="lineno"> 2743</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02744"></a><span class="lineno"> 2744</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02745"></a><span class="lineno"> 2745</span>  densmatr_mixDampingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02746"></a><span class="lineno"> 2746</span>  damping, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, numAmpsToVisit,</div>
<div class="line"><a name="l02747"></a><span class="lineno"> 2747</span>  part1, part2, part3, bothBits);</div>
<div class="line"><a name="l02748"></a><span class="lineno"> 2748</span> }</div>
<div class="line"><a name="l02749"></a><span class="lineno"> 2749</span>  </div>
<div class="line"><a name="l02751"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a5f96311d9094c382074ad70d4b789612"> 2751</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a5f96311d9094c382074ad70d4b789612">densmatr_mixTwoQubitDepolarisingKernel</a>(</div>
<div class="line"><a name="l02752"></a><span class="lineno"> 2752</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> depolLevel, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit,</div>
<div class="line"><a name="l02753"></a><span class="lineno"> 2753</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3, </div>
<div class="line"><a name="l02754"></a><span class="lineno"> 2754</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part4, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part5,</div>
<div class="line"><a name="l02755"></a><span class="lineno"> 2755</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowCol1, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowCol2)</div>
<div class="line"><a name="l02756"></a><span class="lineno"> 2756</span> {</div>
<div class="line"><a name="l02757"></a><span class="lineno"> 2757</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> scanInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02758"></a><span class="lineno"> 2758</span>  <span class="keywordflow">if</span> (scanInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02759"></a><span class="lineno"> 2759</span>  </div>
<div class="line"><a name="l02760"></a><span class="lineno"> 2760</span>  <span class="comment">// index of |..0..0..><..0..0|</span></div>
<div class="line"><a name="l02761"></a><span class="lineno"> 2761</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind00 = (scanInd&part1) + ((scanInd&part2)<<1) + ((scanInd&part3)<<2) + ((scanInd&part4)<<3) + ((scanInd&part5)<<4);</div>
<div class="line"><a name="l02762"></a><span class="lineno"> 2762</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind01 = ind00 + rowCol1;</div>
<div class="line"><a name="l02763"></a><span class="lineno"> 2763</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind10 = ind00 + rowCol2;</div>
<div class="line"><a name="l02764"></a><span class="lineno"> 2764</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind11 = ind00 + rowCol1 + rowCol2;</div>
<div class="line"><a name="l02765"></a><span class="lineno"> 2765</span>  </div>
<div class="line"><a name="l02766"></a><span class="lineno"> 2766</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> realAvDepol = depolLevel * 0.25 * (</div>
<div class="line"><a name="l02767"></a><span class="lineno"> 2767</span>  vecReal[ind00] + vecReal[ind01] + vecReal[ind10] + vecReal[ind11]);</div>
<div class="line"><a name="l02768"></a><span class="lineno"> 2768</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> imagAvDepol = depolLevel * 0.25 * (</div>
<div class="line"><a name="l02769"></a><span class="lineno"> 2769</span>  vecImag[ind00] + vecImag[ind01] + vecImag[ind10] + vecImag[ind11]);</div>
<div class="line"><a name="l02770"></a><span class="lineno"> 2770</span>  </div>
<div class="line"><a name="l02771"></a><span class="lineno"> 2771</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> retain = 1 - depolLevel;</div>
<div class="line"><a name="l02772"></a><span class="lineno"> 2772</span>  vecReal[ind00] *= retain; vecImag[ind00] *= retain;</div>
<div class="line"><a name="l02773"></a><span class="lineno"> 2773</span>  vecReal[ind01] *= retain; vecImag[ind01] *= retain;</div>
<div class="line"><a name="l02774"></a><span class="lineno"> 2774</span>  vecReal[ind10] *= retain; vecImag[ind10] *= retain;</div>
<div class="line"><a name="l02775"></a><span class="lineno"> 2775</span>  vecReal[ind11] *= retain; vecImag[ind11] *= retain;</div>
<div class="line"><a name="l02776"></a><span class="lineno"> 2776</span>  </div>
<div class="line"><a name="l02777"></a><span class="lineno"> 2777</span>  vecReal[ind00] += realAvDepol; vecImag[ind00] += imagAvDepol;</div>
<div class="line"><a name="l02778"></a><span class="lineno"> 2778</span>  vecReal[ind01] += realAvDepol; vecImag[ind01] += imagAvDepol;</div>
<div class="line"><a name="l02779"></a><span class="lineno"> 2779</span>  vecReal[ind10] += realAvDepol; vecImag[ind10] += imagAvDepol;</div>
<div class="line"><a name="l02780"></a><span class="lineno"> 2780</span>  vecReal[ind11] += realAvDepol; vecImag[ind11] += imagAvDepol;</div>
<div class="line"><a name="l02781"></a><span class="lineno"> 2781</span> }</div>
<div class="line"><a name="l02782"></a><span class="lineno"> 2782</span>  </div>
<div class="line"><a name="l02783"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a43afa97e300b87bce7f3eb1213eb05f6"> 2783</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a43afa97e300b87bce7f3eb1213eb05f6">densmatr_mixTwoQubitDepolarising</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> qubit1, <span class="keywordtype">int</span> qubit2, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> depolLevel) {</div>
<div class="line"><a name="l02784"></a><span class="lineno"> 2784</span>  </div>
<div class="line"><a name="l02785"></a><span class="lineno"> 2785</span>  <span class="keywordflow">if</span> (depolLevel == 0)</div>
<div class="line"><a name="l02786"></a><span class="lineno"> 2786</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02787"></a><span class="lineno"> 2787</span>  </div>
<div class="line"><a name="l02788"></a><span class="lineno"> 2788</span>  <span class="comment">// assumes qubit2 > qubit1</span></div>
<div class="line"><a name="l02789"></a><span class="lineno"> 2789</span>  </div>
<div class="line"><a name="l02790"></a><span class="lineno"> 2790</span>  <a class="code" href="QuEST__gpu_8cu.html#a623e577b7230f3c8dc202be6185b4289">densmatr_mixTwoQubitDephasing</a>(qureg, qubit1, qubit2, depolLevel);</div>
<div class="line"><a name="l02791"></a><span class="lineno"> 2791</span>  </div>
<div class="line"><a name="l02792"></a><span class="lineno"> 2792</span>  <span class="keywordtype">int</span> rowQubit1 = qubit1 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02793"></a><span class="lineno"> 2793</span>  <span class="keywordtype">int</span> rowQubit2 = qubit2 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02794"></a><span class="lineno"> 2794</span>  </div>
<div class="line"><a name="l02795"></a><span class="lineno"> 2795</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit1 = 1LL << qubit1;</div>
<div class="line"><a name="l02796"></a><span class="lineno"> 2796</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit1 = 1LL << rowQubit1;</div>
<div class="line"><a name="l02797"></a><span class="lineno"> 2797</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit2 = 1LL << qubit2;</div>
<div class="line"><a name="l02798"></a><span class="lineno"> 2798</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit2 = 1LL << rowQubit2;</div>
<div class="line"><a name="l02799"></a><span class="lineno"> 2799</span>  </div>
<div class="line"><a name="l02800"></a><span class="lineno"> 2800</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowCol1 = colBit1 | rowBit1;</div>
<div class="line"><a name="l02801"></a><span class="lineno"> 2801</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowCol2 = colBit2 | rowBit2;</div>
<div class="line"><a name="l02802"></a><span class="lineno"> 2802</span>  </div>
<div class="line"><a name="l02803"></a><span class="lineno"> 2803</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>/16;</div>
<div class="line"><a name="l02804"></a><span class="lineno"> 2804</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1 = colBit1 - 1;</div>
<div class="line"><a name="l02805"></a><span class="lineno"> 2805</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2 = (colBit2 >> 1) - colBit1;</div>
<div class="line"><a name="l02806"></a><span class="lineno"> 2806</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3 = (rowBit1 >> 2) - (colBit2 >> 1);</div>
<div class="line"><a name="l02807"></a><span class="lineno"> 2807</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part4 = (rowBit2 >> 3) - (rowBit1 >> 2);</div>
<div class="line"><a name="l02808"></a><span class="lineno"> 2808</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part5 = numAmpsToVisit - (rowBit2 >> 3);</div>
<div class="line"><a name="l02809"></a><span class="lineno"> 2809</span>  </div>
<div class="line"><a name="l02810"></a><span class="lineno"> 2810</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02811"></a><span class="lineno"> 2811</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02812"></a><span class="lineno"> 2812</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02813"></a><span class="lineno"> 2813</span>  densmatr_mixTwoQubitDepolarisingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02814"></a><span class="lineno"> 2814</span>  depolLevel, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, numAmpsToVisit,</div>
<div class="line"><a name="l02815"></a><span class="lineno"> 2815</span>  part1, part2, part3, part4, part5, rowCol1, rowCol2);</div>
<div class="line"><a name="l02816"></a><span class="lineno"> 2816</span> }</div>
<div class="line"><a name="l02817"></a><span class="lineno"> 2817</span>  </div>
<div class="line"><a name="l02818"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a040a1c670457b4b5789c089a3d32bf8f"> 2818</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a040a1c670457b4b5789c089a3d32bf8f">statevec_setWeightedQuregKernel</a>(<a class="code" href="structComplex.html">Complex</a> fac1, <a class="code" href="structQureg.html">Qureg</a> qureg1, <a class="code" href="structComplex.html">Complex</a> fac2, <a class="code" href="structQureg.html">Qureg</a> qureg2, <a class="code" href="structComplex.html">Complex</a> facOut, <a class="code" href="structQureg.html">Qureg</a> out) {</div>
<div class="line"><a name="l02819"></a><span class="lineno"> 2819</span>  </div>
<div class="line"><a name="l02820"></a><span class="lineno"> 2820</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ampInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02821"></a><span class="lineno"> 2821</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit = qureg1.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02822"></a><span class="lineno"> 2822</span>  <span class="keywordflow">if</span> (ampInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02823"></a><span class="lineno"> 2823</span>  </div>
<div class="line"><a name="l02824"></a><span class="lineno"> 2824</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecRe1 = qureg1.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l02825"></a><span class="lineno"> 2825</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecIm1 = qureg1.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l02826"></a><span class="lineno"> 2826</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecRe2 = qureg2.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l02827"></a><span class="lineno"> 2827</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecIm2 = qureg2.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l02828"></a><span class="lineno"> 2828</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReOut = out.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l02829"></a><span class="lineno"> 2829</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImOut = out.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l02830"></a><span class="lineno"> 2830</span>  </div>
<div class="line"><a name="l02831"></a><span class="lineno"> 2831</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> facRe1 = fac1.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>; </div>
<div class="line"><a name="l02832"></a><span class="lineno"> 2832</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> facIm1 = fac1.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>;</div>
<div class="line"><a name="l02833"></a><span class="lineno"> 2833</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> facRe2 = fac2.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>;</div>
<div class="line"><a name="l02834"></a><span class="lineno"> 2834</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> facIm2 = fac2.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>;</div>
<div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> facReOut = facOut.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>;</div>
<div class="line"><a name="l02836"></a><span class="lineno"> 2836</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> facImOut = facOut.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>;</div>
<div class="line"><a name="l02837"></a><span class="lineno"> 2837</span>  </div>
<div class="line"><a name="l02838"></a><span class="lineno"> 2838</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re1,im1, re2,im2, reOut,imOut;</div>
<div class="line"><a name="l02839"></a><span class="lineno"> 2839</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = ampInd;</div>
<div class="line"><a name="l02840"></a><span class="lineno"> 2840</span>  </div>
<div class="line"><a name="l02841"></a><span class="lineno"> 2841</span>  re1 = vecRe1[index]; im1 = vecIm1[index];</div>
<div class="line"><a name="l02842"></a><span class="lineno"> 2842</span>  re2 = vecRe2[index]; im2 = vecIm2[index];</div>
<div class="line"><a name="l02843"></a><span class="lineno"> 2843</span>  reOut = vecReOut[index];</div>
<div class="line"><a name="l02844"></a><span class="lineno"> 2844</span>  imOut = vecImOut[index];</div>
<div class="line"><a name="l02845"></a><span class="lineno"> 2845</span>  </div>
<div class="line"><a name="l02846"></a><span class="lineno"> 2846</span>  vecReOut[index] = (facReOut*reOut - facImOut*imOut) + (facRe1*re1 - facIm1*im1) + (facRe2*re2 - facIm2*im2);</div>
<div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>  vecImOut[index] = (facReOut*imOut + facImOut*reOut) + (facRe1*im1 + facIm1*re1) + (facRe2*im2 + facIm2*re2);</div>
<div class="line"><a name="l02848"></a><span class="lineno"> 2848</span> }</div>
<div class="line"><a name="l02849"></a><span class="lineno"> 2849</span>  </div>
<div class="line"><a name="l02850"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ad64a23933361fafc1b6b1787759c2663"> 2850</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ad64a23933361fafc1b6b1787759c2663">statevec_setWeightedQureg</a>(<a class="code" href="structComplex.html">Complex</a> fac1, <a class="code" href="structQureg.html">Qureg</a> qureg1, <a class="code" href="structComplex.html">Complex</a> fac2, <a class="code" href="structQureg.html">Qureg</a> qureg2, <a class="code" href="structComplex.html">Complex</a> facOut, <a class="code" href="structQureg.html">Qureg</a> out) {</div>
<div class="line"><a name="l02851"></a><span class="lineno"> 2851</span>  </div>
<div class="line"><a name="l02852"></a><span class="lineno"> 2852</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit = qureg1.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02853"></a><span class="lineno"> 2853</span>  </div>
<div class="line"><a name="l02854"></a><span class="lineno"> 2854</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02855"></a><span class="lineno"> 2855</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02856"></a><span class="lineno"> 2856</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02857"></a><span class="lineno"> 2857</span>  statevec_setWeightedQuregKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02858"></a><span class="lineno"> 2858</span>  fac1, qureg1, fac2, qureg2, facOut, out</div>
<div class="line"><a name="l02859"></a><span class="lineno"> 2859</span>  );</div>
<div class="line"><a name="l02860"></a><span class="lineno"> 2860</span> }</div>
<div class="line"><a name="l02861"></a><span class="lineno"> 2861</span>  </div>
<div class="line"><a name="l02862"></a><span class="lineno"><a class="line" href="group__debug.html#gaa8437ef3bf135231e2916e64dde1c94e"> 2862</a></span> <span class="keywordtype">void</span> <a class="code" href="group__debug.html#gaa8437ef3bf135231e2916e64dde1c94e">seedQuESTDefault</a>(){</div>
<div class="line"><a name="l02863"></a><span class="lineno"> 2863</span>  <span class="comment">// init MT random number generator with three keys -- time and pid</span></div>
<div class="line"><a name="l02864"></a><span class="lineno"> 2864</span>  <span class="comment">// for the MPI version, it is ok that all procs will get the same seed as random numbers will only be </span></div>
<div class="line"><a name="l02865"></a><span class="lineno"> 2865</span>  <span class="comment">// used by the master process</span></div>
<div class="line"><a name="l02866"></a><span class="lineno"> 2866</span>  </div>
<div class="line"><a name="l02867"></a><span class="lineno"> 2867</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> key[2];</div>
<div class="line"><a name="l02868"></a><span class="lineno"> 2868</span>  <a class="code" href="QuEST__common_8c.html#a2b323b65cd6512720e6aa27c182fcea0">getQuESTDefaultSeedKey</a>(key); </div>
<div class="line"><a name="l02869"></a><span class="lineno"> 2869</span>  <a class="code" href="mt19937ar_8c.html#ac1283f9b1ed571332f5ffe53545ffc16">init_by_array</a>(key, 2); </div>
<div class="line"><a name="l02870"></a><span class="lineno"> 2870</span> } </div>
<div class="line"><a name="l02871"></a><span class="lineno"> 2871</span>  </div>
<div class="line"><a name="l02872"></a><span class="lineno"> 2872</span>  </div>
<div class="line"><a name="l02873"></a><span class="lineno"> 2873</span>  </div>
<div class="line"><a name="l02874"></a><span class="lineno"> 2874</span>  </div>
<div class="line"><a name="l02875"></a><span class="lineno"> 2875</span> <span class="preprocessor">#ifdef __cplusplus</span></div>
<div class="line"><a name="l02876"></a><span class="lineno"> 2876</span> }</div>
<div class="line"><a name="l02877"></a><span class="lineno"> 2877</span> <span class="preprocessor">#endif</span></div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="aQuEST__gpu_8cu_html_aaa36e3e86a5b79e676c6268fa2b02222"><div class="ttname"><a href="QuEST__gpu_8cu.html#aaa36e3e86a5b79e676c6268fa2b02222">statevec_initPlusStateKernel</a></div><div class="ttdeci">__global__ void statevec_initPlusStateKernel(long long int stateVecSize, qreal *stateVecReal, qreal *stateVecImag)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00509">QuEST_gpu.cu:509</a></div></div>
<div class="ttc" id="agroup__type_html_gaeff624226629d7063a8a776958a4f991"><div class="ttname"><a href="group__type.html#gaeff624226629d7063a8a776958a4f991">destroyQuESTEnv</a></div><div class="ttdeci">void destroyQuESTEnv(QuESTEnv env)</div><div class="ttdoc">Destroy the QuEST environment.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00377">QuEST_gpu.cu:377</a></div></div>
<div class="ttc" id="amt19937ar_8c_html_ac1283f9b1ed571332f5ffe53545ffc16"><div class="ttname"><a href="mt19937ar_8c.html#ac1283f9b1ed571332f5ffe53545ffc16">init_by_array</a></div><div class="ttdeci">void init_by_array(unsigned long init_key[], int key_length)</div><div class="ttdef"><b>Definition:</b> <a href="mt19937ar_8c_source.html#l00080">mt19937ar.c:80</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a8ce1e311ea72b862a8757dc71082fbf3"><div class="ttname"><a href="QuEST__gpu_8cu.html#a8ce1e311ea72b862a8757dc71082fbf3">log2Int</a></div><div class="ttdeci">__device__ __host__ unsigned int log2Int(unsigned int x)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01725">QuEST_gpu.cu:1725</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a040a1c670457b4b5789c089a3d32bf8f"><div class="ttname"><a href="QuEST__gpu_8cu.html#a040a1c670457b4b5789c089a3d32bf8f">statevec_setWeightedQuregKernel</a></div><div class="ttdeci">__global__ void statevec_setWeightedQuregKernel(Complex fac1, Qureg qureg1, Complex fac2, Qureg qureg2, Complex facOut, Qureg out)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02818">QuEST_gpu.cu:2818</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_afc4dcedaf429d823f4da83d3521d8293"><div class="ttname"><a href="QuEST__gpu_8cu.html#afc4dcedaf429d823f4da83d3521d8293">densmatr_collapseToKnownProbOutcomeKernel</a></div><div class="ttdeci">__global__ void densmatr_collapseToKnownProbOutcomeKernel(qreal outcomeProb, qreal *vecReal, qreal *vecImag, long long int numBasesToVisit, long long int part1, long long int part2, long long int part3, long long int rowBit, long long int colBit, long long int desired, long long int undesired)</div><div class="ttdoc">Maps thread ID to a |..0..><..0..| state and then locates |0><1|, |1><0| and |1><1|.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02454">QuEST_gpu.cu:2454</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a6fb74f09125cd2ce2658824182248c6e"><div class="ttname"><a href="QuEST__gpu_8cu.html#a6fb74f09125cd2ce2658824182248c6e">statevec_multiControlledUnitaryKernel</a></div><div class="ttdeci">__global__ void statevec_multiControlledUnitaryKernel(Qureg qureg, long long int ctrlQubitsMask, long long int ctrlFlipMask, const int targetQubit, ArgMatrix2 u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01123">QuEST_gpu.cu:1123</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ab7478fcaf6357ab202d72853b672e375"><div class="ttname"><a href="QuEST__gpu_8cu.html#ab7478fcaf6357ab202d72853b672e375">statevec_swapQubitAmps</a></div><div class="ttdeci">void statevec_swapQubitAmps(Qureg qureg, int qb1, int qb2)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01613">QuEST_gpu.cu:1613</a></div></div>
<div class="ttc" id="agroup__debug_html_ga924ef2dbda6b733b4041270077c76ece"><div class="ttname"><a href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a></div><div class="ttdeci">void copyStateFromGPU(Qureg qureg)</div><div class="ttdoc">In GPU mode, this copies the state-vector (or density matrix) from GPU memory (qureg....</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00407">QuEST_gpu.cu:407</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a8d88b4ed94ab024e5e7b2f1f4f505b44"><div class="ttname"><a href="QuEST__gpu_8cu.html#a8d88b4ed94ab024e5e7b2f1f4f505b44">statevec_multiRotateZ</a></div><div class="ttdeci">void statevec_multiRotateZ(Qureg qureg, long long int mask, qreal angle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01466">QuEST_gpu.cu:1466</a></div></div>
<div class="ttc" id="astructComplexMatrix4_html_aeadc9893e1b16cdd585dac523e73926c"><div class="ttname"><a href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">ComplexMatrix4::real</a></div><div class="ttdeci">qreal real[4][4]</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00127">QuEST.h:127</a></div></div>
<div class="ttc" id="agroup__debug_html_ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77"><div class="ttname"><a href="group__debug.html#ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77">syncQuESTEnv</a></div><div class="ttdeci">void syncQuESTEnv(QuESTEnv env)</div><div class="ttdoc">Guarantees that all code up to the given point has been executed on all nodes (if running in distribu...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00369">QuEST_gpu.cu:369</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a664339e2afc50b0418a56adfc1bc512e"><div class="ttname"><a href="QuEST__gpu_8cu.html#a664339e2afc50b0418a56adfc1bc512e">densmatr_initPureStateKernel</a></div><div class="ttdeci">__global__ void densmatr_initPureStateKernel(long long int numPureAmps, qreal *targetVecReal, qreal *targetVecImag, qreal *copyVecReal, qreal *copyVecImag)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00186">QuEST_gpu.cu:186</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aa121d55f2ca09c06a96ddcd433c60b0f"><div class="ttname"><a href="QuEST__gpu_8cu.html#aa121d55f2ca09c06a96ddcd433c60b0f">statevec_setAmps</a></div><div class="ttdeci">void statevec_setAmps(Qureg qureg, long long int startInd, qreal *reals, qreal *imags, long long int numAmps)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00153">QuEST_gpu.cu:153</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a5f96311d9094c382074ad70d4b789612"><div class="ttname"><a href="QuEST__gpu_8cu.html#a5f96311d9094c382074ad70d4b789612">densmatr_mixTwoQubitDepolarisingKernel</a></div><div class="ttdeci">__global__ void densmatr_mixTwoQubitDepolarisingKernel(qreal depolLevel, qreal *vecReal, qreal *vecImag, long long int numAmpsToVisit, long long int part1, long long int part2, long long int part3, long long int part4, long long int part5, long long int rowCol1, long long int rowCol2)</div><div class="ttdoc">Called once for every 16 amplitudes.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02751">QuEST_gpu.cu:2751</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a73b56fbac6e464a37805fa9d9657a8f9"><div class="ttname"><a href="QuEST__gpu_8cu.html#a73b56fbac6e464a37805fa9d9657a8f9">statevec_pauliY</a></div><div class="ttdeci">void statevec_pauliY(Qureg qureg, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01271">QuEST_gpu.cu:1271</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a7c0067cb9f243ead20de7392aea328bc"><div class="ttname"><a href="QuEST__gpu_8cu.html#a7c0067cb9f243ead20de7392aea328bc">statevec_controlledPhaseFlip</a></div><div class="ttdeci">void statevec_controlledPhaseFlip(Qureg qureg, const int idQubit1, const int idQubit2)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01552">QuEST_gpu.cu:1552</a></div></div>
<div class="ttc" id="astructQuESTEnv_html_aa648bb336cf8598467cb62db00b9cee8"><div class="ttname"><a href="structQuESTEnv.html#aa648bb336cf8598467cb62db00b9cee8">QuESTEnv::rank</a></div><div class="ttdeci">int rank</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00201">QuEST.h:201</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aa662796ea6e0f471143c53becae8c12c"><div class="ttname"><a href="QuEST__gpu_8cu.html#aa662796ea6e0f471143c53becae8c12c">statevec_multiControlledPhaseShift</a></div><div class="ttdeci">void statevec_multiControlledPhaseShift(Qureg qureg, int *controlQubits, int numControlQubits, qreal angle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01436">QuEST_gpu.cu:1436</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a0aabd5ed69a74e5bc0b46a17af45c886"><div class="ttname"><a href="QuEST__gpu_8cu.html#a0aabd5ed69a74e5bc0b46a17af45c886">GPUExists</a></div><div class="ttdeci">int GPUExists(void)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00336">QuEST_gpu.cu:336</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aea20d173141544e6c5359955a1fbe997"><div class="ttname"><a href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a></div><div class="ttdeci">__global__ void copySharedReduceBlock(qreal *arrayIn, qreal *reducedArray, int length)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01751">QuEST_gpu.cu:1751</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a31772904f024efd8d75a022e84c8207b"><div class="ttname"><a href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a></div><div class="ttdeci">void swapDouble(qreal **a, qreal **b)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01857">QuEST_gpu.cu:1857</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_afd7fc4d67072a80dbc609bf328b5be20"><div class="ttname"><a href="QuEST__gpu_8cu.html#afd7fc4d67072a80dbc609bf328b5be20">statevec_multiControlledMultiQubitUnitaryKernel</a></div><div class="ttdeci">__global__ void statevec_multiControlledMultiQubitUnitaryKernel(Qureg qureg, long long int ctrlMask, int *targs, int numTargs, qreal *uRe, qreal *uIm, long long int *ampInds, qreal *reAmps, qreal *imAmps, long long int numTargAmps)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00858">QuEST_gpu.cu:858</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a9f4bb112d5e95abb8e35bf051a02a06e"><div class="ttname"><a href="QuEST__gpu_8cu.html#a9f4bb112d5e95abb8e35bf051a02a06e">densmatr_initClassicalStateKernel</a></div><div class="ttdeci">__global__ void densmatr_initClassicalStateKernel(long long int densityNumElems, qreal *densityReal, qreal *densityImag, long long int densityInd)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00239">QuEST_gpu.cu:239</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a05756b45f10135bb2eeb07380f806c20"><div class="ttname"><a href="QuEST__gpu_8cu.html#a05756b45f10135bb2eeb07380f806c20">statevec_initStateFromSingleFile</a></div><div class="ttdeci">int statevec_initStateFromSingleFile(Qureg *qureg, char filename[200], QuESTEnv env)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00605">QuEST_gpu.cu:605</a></div></div>
<div class="ttc" id="astructQureg_html_aba97773694870ef35e378c036f486bb7"><div class="ttname"><a href="structQureg.html#aba97773694870ef35e378c036f486bb7">Qureg::pairStateVec</a></div><div class="ttdeci">ComplexArray pairStateVec</div><div class="ttdoc">Temporary storage for a chunk of the state vector received from another process in the MPI version.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00181">QuEST.h:181</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html"><div class="ttname"><a href="QuEST__internal_8h.html">QuEST_internal.h</a></div></div>
<div class="ttc" id="agroup__debug_html_ga2d955c6e51067371eee69795532a2d62"><div class="ttname"><a href="group__debug.html#ga2d955c6e51067371eee69795532a2d62">getEnvironmentString</a></div><div class="ttdeci">void getEnvironmentString(QuESTEnv env, Qureg qureg, char str[200])</div><div class="ttdoc">Sets str to a string containing the number of qubits in qureg, and the hardware facilities used (e....</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00393">QuEST_gpu.cu:393</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a49af21aad0ad254c64a10cb6d39e4a64"><div class="ttname"><a href="QuEST__gpu_8cu.html#a49af21aad0ad254c64a10cb6d39e4a64">statevec_multiControlledTwoQubitUnitary</a></div><div class="ttdeci">void statevec_multiControlledTwoQubitUnitary(Qureg qureg, long long int ctrlMask, const int q1, const int q2, ComplexMatrix4 u)</div><div class="ttdoc">This calls swapQubitAmps only when it would involve a distributed communication; if the qubit chunks ...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01050">QuEST_gpu.cu:1050</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a55fdf6604434dab8a5c0b8522b6cc10c"><div class="ttname"><a href="QuEST__gpu_8cu.html#a55fdf6604434dab8a5c0b8522b6cc10c">statevec_controlledCompactUnitaryKernel</a></div><div class="ttdeci">__global__ void statevec_controlledCompactUnitaryKernel(Qureg qureg, const int controlQubit, const int targetQubit, Complex alpha, Complex beta)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00730">QuEST_gpu.cu:730</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a9c7dfe745a3bb35f18440891d267e963"><div class="ttname"><a href="QuEST__gpu_8cu.html#a9c7dfe745a3bb35f18440891d267e963">statevec_controlledPauliYKernel</a></div><div class="ttdeci">__global__ void statevec_controlledPauliYKernel(Qureg qureg, const int controlQubit, const int targetQubit, const int conjFac)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01287">QuEST_gpu.cu:1287</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a2600999a19c817bfcf7ca14779e33b9a"><div class="ttname"><a href="QuEST__gpu_8cu.html#a2600999a19c817bfcf7ca14779e33b9a">statevec_controlledUnitary</a></div><div class="ttdeci">void statevec_controlledUnitary(Qureg qureg, const int controlQubit, const int targetQubit, ComplexMatrix2 u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01115">QuEST_gpu.cu:1115</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ad72dbcf6d0153db1b8d8a58001feed83"><div class="ttname"><a href="QuEST__gpu_8cu.html#ad72dbcf6d0153db1b8d8a58001feed83">DEBUG</a></div><div class="ttdeci">#define DEBUG</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00020">QuEST_gpu.cu:20</a></div></div>
<div class="ttc" id="aQuEST_8h_html"><div class="ttname"><a href="QuEST_8h.html">QuEST.h</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a754e4531aa159461177751dd12e988ed"><div class="ttname"><a href="QuEST__gpu_8cu.html#a754e4531aa159461177751dd12e988ed">statevec_multiRotateZKernel</a></div><div class="ttdeci">__global__ void statevec_multiRotateZKernel(Qureg qureg, long long int mask, qreal cosAngle, qreal sinAngle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01449">QuEST_gpu.cu:1449</a></div></div>
<div class="ttc" id="astructQureg_html_aa3deb7163aab90a61e755a1f200f5413"><div class="ttname"><a href="structQureg.html#aa3deb7163aab90a61e755a1f200f5413">Qureg::numChunks</a></div><div class="ttdeci">int numChunks</div><div class="ttdoc">Number of chunks the state vector is broken up into – the number of MPI processes used.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00176">QuEST.h:176</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a5f14823d1125e973c4b350bd6ac84552"><div class="ttname"><a href="QuEST__gpu_8cu.html#a5f14823d1125e973c4b350bd6ac84552">insertZeroBits</a></div><div class="ttdeci">__forceinline__ __device__ long long int insertZeroBits(long long int number, int *inds, int numInds)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00112">QuEST_gpu.cu:112</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a303c00c3329a7bf290b68468735b4a8f"><div class="ttname"><a href="QuEST__gpu_8cu.html#a303c00c3329a7bf290b68468735b4a8f">densmatr_oneQubitDegradeOffDiagonal</a></div><div class="ttdeci">void densmatr_oneQubitDegradeOffDiagonal(Qureg qureg, const int targetQubit, qreal dephFac)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02554">QuEST_gpu.cu:2554</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_a2b323b65cd6512720e6aa27c182fcea0"><div class="ttname"><a href="QuEST__common_8c.html#a2b323b65cd6512720e6aa27c182fcea0">getQuESTDefaultSeedKey</a></div><div class="ttdeci">void getQuESTDefaultSeedKey(unsigned long int *key)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00181">QuEST_common.c:181</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a8e15b37c8dd7514a5480381699aa82c2"><div class="ttname"><a href="QuEST__gpu_8cu.html#a8e15b37c8dd7514a5480381699aa82c2">densmatr_calcHilbertSchmidtDistanceSquaredKernel</a></div><div class="ttdeci">__global__ void densmatr_calcHilbertSchmidtDistanceSquaredKernel(qreal *aRe, qreal *aIm, qreal *bRe, qreal *bIm, long long int numAmpsToSum, qreal *reducedArray)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02244">QuEST_gpu.cu:2244</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a14b5999f157b704aced4776c9ccbc982"><div class="ttname"><a href="QuEST__gpu_8cu.html#a14b5999f157b704aced4776c9ccbc982">statevec_hadamardKernel</a></div><div class="ttdeci">__global__ void statevec_hadamardKernel(Qureg qureg, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01621">QuEST_gpu.cu:1621</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a5cb8662afc6c644a46f7339c89bfd226"><div class="ttname"><a href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a></div><div class="ttdeci">__forceinline__ __device__ int extractBit(int locationOfBitFromRight, long long int theEncodedNumber)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00082">QuEST_gpu.cu:82</a></div></div>
<div class="ttc" id="astructQureg_html_ac181d7b3b94fff179dc74d7935ecd9e1"><div class="ttname"><a href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">Qureg::deviceStateVec</a></div><div class="ttdeci">ComplexArray deviceStateVec</div><div class="ttdoc">Storage for wavefunction amplitudes in the GPU version.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00184">QuEST.h:184</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_abc9a9ef4344c7faaaf28ac25c76649b9"><div class="ttname"><a href="QuEST__gpu_8cu.html#abc9a9ef4344c7faaaf28ac25c76649b9">statevec_getRealAmp</a></div><div class="ttdeci">qreal statevec_getRealAmp(Qureg qureg, long long int index)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00447">QuEST_gpu.cu:447</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a365bbb1b80cb00405c8bf1a4fa1ea8e5"><div class="ttname"><a href="QuEST__gpu_8cu.html#a365bbb1b80cb00405c8bf1a4fa1ea8e5">statevec_createQureg</a></div><div class="ttdeci">void statevec_createQureg(Qureg *qureg, int numQubits, QuESTEnv env)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00275">QuEST_gpu.cu:275</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a6ff3dc624b5fafe8edae4fe327c255a0"><div class="ttname"><a href="QuEST__gpu_8cu.html#a6ff3dc624b5fafe8edae4fe327c255a0">densmatr_calcInnerProduct</a></div><div class="ttdeci">qreal densmatr_calcInnerProduct(Qureg a, Qureg b)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01988">QuEST_gpu.cu:1988</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a7e0a6e9de648b33168d7f56eba53aa7b"><div class="ttname"><a href="QuEST__gpu_8cu.html#a7e0a6e9de648b33168d7f56eba53aa7b">densmatr_mixDampingKernel</a></div><div class="ttdeci">__global__ void densmatr_mixDampingKernel(qreal damping, qreal *vecReal, qreal *vecImag, long long int numAmpsToVisit, long long int part1, long long int part2, long long int part3, long long int bothBits)</div><div class="ttdoc">Works like mixDephasing but modifies every other element, and elements are averaged in pairs.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02676">QuEST_gpu.cu:2676</a></div></div>
<div class="ttc" id="astructComplexMatrix4_html"><div class="ttname"><a href="structComplexMatrix4.html">ComplexMatrix4</a></div><div class="ttdoc">Represents a 4x4 matrix of complex numbers.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00125">QuEST.h:125</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ad27d13bcdcbe777e139a90c2e8d52924"><div class="ttname"><a href="QuEST__gpu_8cu.html#ad27d13bcdcbe777e139a90c2e8d52924">densmatr_mixTwoQubitDephasingKernel</a></div><div class="ttdeci">__global__ void densmatr_mixTwoQubitDephasingKernel(qreal fac, qreal *vecReal, qreal *vecImag, long long int numBackgroundStates, long long int numAmpsToVisit, long long int part1, long long int part2, long long int part3, long long int part4, long long int part5, long long int colBit1, long long int rowBit1, long long int colBit2, long long int rowBit2)</div><div class="ttdoc">Called 12 times for every 16 amplitudes in density matrix Each sums from the |..0....</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02589">QuEST_gpu.cu:2589</a></div></div>
<div class="ttc" id="astructQuESTEnv_html"><div class="ttname"><a href="structQuESTEnv.html">QuESTEnv</a></div><div class="ttdoc">Information about the environment the program is running in.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00199">QuEST.h:199</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a288dc4b46bdacd69cbf4a6fd070d26a7"><div class="ttname"><a href="QuEST__gpu_8cu.html#a288dc4b46bdacd69cbf4a6fd070d26a7">statevec_initClassicalState</a></div><div class="ttdeci">void statevec_initClassicalState(Qureg qureg, long long int stateInd)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00546">QuEST_gpu.cu:546</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ae7f25bb40734e18a992403b17355893b"><div class="ttname"><a href="QuEST__gpu_8cu.html#ae7f25bb40734e18a992403b17355893b">statevec_collapseToKnownProbOutcome</a></div><div class="ttdeci">void statevec_collapseToKnownProbOutcome(Qureg qureg, const int measureQubit, int outcome, qreal outcomeProb)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02445">QuEST_gpu.cu:2445</a></div></div>
<div class="ttc" id="astructComplexMatrixN_html"><div class="ttname"><a href="structComplexMatrixN.html">ComplexMatrixN</a></div><div class="ttdoc">Represents a general 2^N by 2^N matrix of complex numbers.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00136">QuEST.h:136</a></div></div>
<div class="ttc" id="amt19937ar_8h_html"><div class="ttname"><a href="mt19937ar_8h.html">mt19937ar.h</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a6153547f245c05874161a105e9a2f02c"><div class="ttname"><a href="QuEST__gpu_8cu.html#a6153547f245c05874161a105e9a2f02c">densmatr_calcTotalProb</a></div><div class="ttdeci">qreal densmatr_calcTotalProb(Qureg qureg)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01476">QuEST_gpu.cu:1476</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ac4ee5979d475e8c729294b8ef7e0270d"><div class="ttname"><a href="QuEST__gpu_8cu.html#ac4ee5979d475e8c729294b8ef7e0270d">statevec_multiControlledPhaseFlip</a></div><div class="ttdeci">void statevec_multiControlledPhaseFlip(Qureg qureg, int *controlQubits, int numControlQubits)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01578">QuEST_gpu.cu:1578</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a47b467a5445c7f15d1a8b0b2ec0ef2de"><div class="ttname"><a href="QuEST__gpu_8cu.html#a47b467a5445c7f15d1a8b0b2ec0ef2de">statevec_controlledCompactUnitary</a></div><div class="ttdeci">void statevec_controlledCompactUnitary(Qureg qureg, const int controlQubit, const int targetQubit, Complex alpha, Complex beta)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00789">QuEST_gpu.cu:789</a></div></div>
<div class="ttc" id="agroup__type_html_ga7740e349b4f8bae6451547680f0ce2d6"><div class="ttname"><a href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a></div><div class="ttdeci">#define qreal</div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a20a155f53efc45c16803d7539c2c199d"><div class="ttname"><a href="QuEST__gpu_8cu.html#a20a155f53efc45c16803d7539c2c199d">densmatr_initClassicalState</a></div><div class="ttdeci">void densmatr_initClassicalState(Qureg qureg, long long int stateInd)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00258">QuEST_gpu.cu:258</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ab1f13b1980ec46bac75e97c578d15e98"><div class="ttname"><a href="QuEST__gpu_8cu.html#ab1f13b1980ec46bac75e97c578d15e98">statevec_multiControlledPhaseFlipKernel</a></div><div class="ttdeci">__global__ void statevec_multiControlledPhaseFlipKernel(Qureg qureg, long long int mask)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01560">QuEST_gpu.cu:1560</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a2ca0c6ba07ab2b4b437321bf17efc966"><div class="ttname"><a href="QuEST__gpu_8cu.html#a2ca0c6ba07ab2b4b437321bf17efc966">statevec_initZeroState</a></div><div class="ttdeci">void statevec_initZeroState(Qureg qureg)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00498">QuEST_gpu.cu:498</a></div></div>
<div class="ttc" id="astructQureg_html_a0a86e8a50ea8c998b4a0a6640c5a1218"><div class="ttname"><a href="structQureg.html#a0a86e8a50ea8c998b4a0a6640c5a1218">Qureg::numQubitsInStateVec</a></div><div class="ttdeci">int numQubitsInStateVec</div><div class="ttdoc">Number of qubits in the state-vector - this is double the number represented for mixed states.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00167">QuEST.h:167</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_afbb044d76bf22d5c81a2a70a977f29bc"><div class="ttname"><a href="QuEST__gpu_8cu.html#afbb044d76bf22d5c81a2a70a977f29bc">densmatr_findProbabilityOfZero</a></div><div class="ttdeci">qreal densmatr_findProbabilityOfZero(Qureg qureg, const int measureQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01864">QuEST_gpu.cu:1864</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a47dcab9a0e6b07ddde264ed924add26c"><div class="ttname"><a href="QuEST__gpu_8cu.html#a47dcab9a0e6b07ddde264ed924add26c">statevec_multiControlledMultiQubitUnitary</a></div><div class="ttdeci">void statevec_multiControlledMultiQubitUnitary(Qureg qureg, long long int ctrlMask, int *targs, const int numTargs, ComplexMatrixN u)</div><div class="ttdoc">This calls swapQubitAmps only when it would involve a distributed communication; if the qubit chunks ...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00917">QuEST_gpu.cu:917</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ab2ade4284b49f76631d51845ae54abdb"><div class="ttname"><a href="QuEST__gpu_8cu.html#ab2ade4284b49f76631d51845ae54abdb">statevec_unitaryKernel</a></div><div class="ttdeci">__global__ void statevec_unitaryKernel(Qureg qureg, const int targetQubit, ArgMatrix2 u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00797">QuEST_gpu.cu:797</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aca8a32f46dbaabdbffc38d7b8023bf20"><div class="ttname"><a href="QuEST__gpu_8cu.html#aca8a32f46dbaabdbffc38d7b8023bf20">statevec_controlledNotKernel</a></div><div class="ttdeci">__global__ void statevec_controlledNotKernel(Qureg qureg, const int controlQubit, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01678">QuEST_gpu.cu:1678</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a2116805f30cb063a0e7c0341583d1550"><div class="ttname"><a href="QuEST__gpu_8cu.html#a2116805f30cb063a0e7c0341583d1550">statevec_initBlankStateKernel</a></div><div class="ttdeci">__global__ void statevec_initBlankStateKernel(long long int stateVecSize, qreal *stateVecReal, qreal *stateVecImag)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00461">QuEST_gpu.cu:461</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a60b4893613de0cd6595f60cdec24999a"><div class="ttname"><a href="QuEST__gpu_8cu.html#a60b4893613de0cd6595f60cdec24999a">insertTwoZeroBits</a></div><div class="ttdeci">__forceinline__ __device__ long long int insertTwoZeroBits(long long int number, int bit1, int bit2)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00106">QuEST_gpu.cu:106</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_abd1285091450c7c2806cc26c71eb5df2"><div class="ttname"><a href="QuEST__common_8c.html#abd1285091450c7c2806cc26c71eb5df2">getQubitBitMask</a></div><div class="ttdeci">long long int getQubitBitMask(int *qubits, const int numQubits)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00043">QuEST_common.c:43</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ad65ad1b5ea6f30b0c6b4ffda96e1a8e6"><div class="ttname"><a href="QuEST__gpu_8cu.html#ad65ad1b5ea6f30b0c6b4ffda96e1a8e6">statevec_calcTotalProb</a></div><div class="ttdeci">qreal statevec_calcTotalProb(Qureg qureg)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01499">QuEST_gpu.cu:1499</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a4bea7ed7967083cbabd8a8e5acdd48c0"><div class="ttname"><a href="QuEST__gpu_8cu.html#a4bea7ed7967083cbabd8a8e5acdd48c0">statevec_unitary</a></div><div class="ttdeci">void statevec_unitary(Qureg qureg, const int targetQubit, ComplexMatrix2 u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00850">QuEST_gpu.cu:850</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a24d53b07592f424e5cc3dcd12f51bf32"><div class="ttname"><a href="QuEST__gpu_8cu.html#a24d53b07592f424e5cc3dcd12f51bf32">densmatr_calcInnerProductKernel</a></div><div class="ttdeci">__global__ void densmatr_calcInnerProductKernel(Qureg a, Qureg b, long long int numTermsToSum, qreal *reducedArray)</div><div class="ttdoc">computes Tr(conjTrans(a) b) = sum of (a_ij^* b_ij), which is a real number</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01967">QuEST_gpu.cu:1967</a></div></div>
<div class="ttc" id="astructQureg_html_ac2929e681d3d95591c18cf168dbbe4f0"><div class="ttname"><a href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">Qureg::chunkId</a></div><div class="ttdeci">int chunkId</div><div class="ttdoc">The position of the chunk of the state vector held by this process in the full state vector.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00174">QuEST.h:174</a></div></div>
<div class="ttc" id="astructComplexMatrix2_html_a3a2b60a9e00ccef054a6de3b9307c1be"><div class="ttname"><a href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">ComplexMatrix2::imag</a></div><div class="ttdeci">qreal imag[2][2]</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00117">QuEST.h:117</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ae6cecbad32a03416138b321cdc1a2c33"><div class="ttname"><a href="QuEST__gpu_8cu.html#ae6cecbad32a03416138b321cdc1a2c33">statevec_compareStates</a></div><div class="ttdeci">int statevec_compareStates(Qureg mq1, Qureg mq2, qreal precision)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00649">QuEST_gpu.cu:649</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a8adaba9dbdad6f7ab41ae4b8db0abefe"><div class="ttname"><a href="QuEST__gpu_8cu.html#a8adaba9dbdad6f7ab41ae4b8db0abefe">densmatr_mixDensityMatrix</a></div><div class="ttdeci">void densmatr_mixDensityMatrix(Qureg combineQureg, qreal otherProb, Qureg otherQureg)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02521">QuEST_gpu.cu:2521</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a1775b7abce55ccfd036bd5f55707877c"><div class="ttname"><a href="QuEST__gpu_8cu.html#a1775b7abce55ccfd036bd5f55707877c">getBitMaskParity</a></div><div class="ttdeci">__forceinline__ __device__ int getBitMaskParity(long long int mask)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00086">QuEST_gpu.cu:86</a></div></div>
<div class="ttc" id="astructQureg_html_ab0ea0358482b62f43fdd781469607d97"><div class="ttname"><a href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">Qureg::numAmpsPerChunk</a></div><div class="ttdeci">long long int numAmpsPerChunk</div><div class="ttdoc">Number of probability amplitudes held in stateVec by this process In the non-MPI version,...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00170">QuEST.h:170</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ae5ad68d054875913d0f7ec654840a9ec"><div class="ttname"><a href="QuEST__gpu_8cu.html#ae5ad68d054875913d0f7ec654840a9ec">densmatr_initPureState</a></div><div class="ttdeci">void densmatr_initPureState(Qureg targetQureg, Qureg copyQureg)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00205">QuEST_gpu.cu:205</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a43b35abfab0d6093b052e2c2e4b15064"><div class="ttname"><a href="QuEST__gpu_8cu.html#a43b35abfab0d6093b052e2c2e4b15064">statevec_initZeroStateKernel</a></div><div class="ttdeci">__global__ void statevec_initZeroStateKernel(long long int stateVecSize, qreal *stateVecReal, qreal *stateVecImag)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00482">QuEST_gpu.cu:482</a></div></div>
<div class="ttc" id="agroup__debug_html_ga11448560006dd165128e404b54ebb2f7"><div class="ttname"><a href="group__debug.html#ga11448560006dd165128e404b54ebb2f7">copyStateToGPU</a></div><div class="ttdeci">void copyStateToGPU(Qureg qureg)</div><div class="ttdoc">In GPU mode, this copies the state-vector (or density matrix) from RAM (qureg.stateVec) to VRAM / GPU...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00397">QuEST_gpu.cu:397</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aa57d77a0903e334e963c66ddc5ed3f53"><div class="ttname"><a href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a></div><div class="ttdeci">#define REDUCE_SHARED_SIZE</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00019">QuEST_gpu.cu:19</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_afe005f9f69319901bb56c4d022359ad5"><div class="ttname"><a href="QuEST__gpu_8cu.html#afe005f9f69319901bb56c4d022359ad5">densmatr_calcPurityKernel</a></div><div class="ttdeci">__global__ void densmatr_calcPurityKernel(qreal *vecReal, qreal *vecImag, long long int numAmpsToSum, qreal *reducedArray)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02320">QuEST_gpu.cu:2320</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_abd509244d57657e148e4084c5ab5d28f"><div class="ttname"><a href="QuEST__gpu_8cu.html#abd509244d57657e148e4084c5ab5d28f">statevec_getImagAmp</a></div><div class="ttdeci">qreal statevec_getImagAmp(Qureg qureg, long long int index)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00454">QuEST_gpu.cu:454</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ad4ec89e571c55b3d0dee1413a2fd1d43"><div class="ttname"><a href="QuEST__gpu_8cu.html#ad4ec89e571c55b3d0dee1413a2fd1d43">statevec_multiControlledTwoQubitUnitaryKernel</a></div><div class="ttdeci">__global__ void statevec_multiControlledTwoQubitUnitaryKernel(Qureg qureg, long long int ctrlMask, const int q1, const int q2, ArgMatrix4 u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00974">QuEST_gpu.cu:974</a></div></div>
<div class="ttc" id="astructQuESTEnv_html_af22aacd7c9905accae28484785c193b4"><div class="ttname"><a href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">QuESTEnv::numRanks</a></div><div class="ttdeci">int numRanks</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00202">QuEST.h:202</a></div></div>
<div class="ttc" id="astructComplexMatrix4_html_a1f6bb840b5a9e6252980cab7a14f1a35"><div class="ttname"><a href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">ComplexMatrix4::imag</a></div><div class="ttdeci">qreal imag[4][4]</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00128">QuEST.h:128</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aae568d73d0de878acffe3798779de474"><div class="ttname"><a href="QuEST__gpu_8cu.html#aae568d73d0de878acffe3798779de474">statevec_findProbabilityOfZeroKernel</a></div><div class="ttdeci">__global__ void statevec_findProbabilityOfZeroKernel(Qureg qureg, const int measureQubit, qreal *reducedArray)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01798">QuEST_gpu.cu:1798</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_abdb6e0ee1e407755e1b944086cedd90e"><div class="ttname"><a href="QuEST__gpu_8cu.html#abdb6e0ee1e407755e1b944086cedd90e">statevec_pauliX</a></div><div class="ttdeci">void statevec_pauliX(Qureg qureg, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01238">QuEST_gpu.cu:1238</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a3414d9307ecfd0caa2be560a00eb7c61"><div class="ttname"><a href="QuEST__gpu_8cu.html#a3414d9307ecfd0caa2be560a00eb7c61">densmatr_findProbabilityOfZeroKernel</a></div><div class="ttdeci">__global__ void densmatr_findProbabilityOfZeroKernel(Qureg qureg, const int measureQubit, qreal *reducedArray)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01760">QuEST_gpu.cu:1760</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a37c6a59b2dd008d235474cb7248df952"><div class="ttname"><a href="QuEST__gpu_8cu.html#a37c6a59b2dd008d235474cb7248df952">densmatr_mixDephasingKernel</a></div><div class="ttdeci">__global__ void densmatr_mixDephasingKernel(qreal fac, qreal *vecReal, qreal *vecImag, long long int numAmpsToVisit, long long int part1, long long int part2, long long int part3, long long int colBit, long long int rowBit)</div><div class="ttdoc">Called once for every 4 amplitudes in density matrix Works by establishing the |.....</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02538">QuEST_gpu.cu:2538</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a112c74b3365bda6697813d9931b55377"><div class="ttname"><a href="QuEST__gpu_8cu.html#a112c74b3365bda6697813d9931b55377">getNumReductionLevels</a></div><div class="ttdeci">int getNumReductionLevels(long long int numValuesToReduce, int numReducedPerLevel)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01848">QuEST_gpu.cu:1848</a></div></div>
<div class="ttc" id="astructComplexMatrixN_html_a446e8a077597e4f76049d547df0c9738"><div class="ttname"><a href="structComplexMatrixN.html#a446e8a077597e4f76049d547df0c9738">ComplexMatrixN::real</a></div><div class="ttdeci">qreal ** real</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00139">QuEST.h:139</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_abf9e7eae332bbbd2e8b7b9c3ca3bad92"><div class="ttname"><a href="QuEST__gpu_8cu.html#abf9e7eae332bbbd2e8b7b9c3ca3bad92">statevec_controlledPhaseFlipKernel</a></div><div class="ttdeci">__global__ void statevec_controlledPhaseFlipKernel(Qureg qureg, const int idQubit1, const int idQubit2)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01531">QuEST_gpu.cu:1531</a></div></div>
<div class="ttc" id="astructQureg_html_a8bb9f7517470a0cc406951935f37b64f"><div class="ttname"><a href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">Qureg::secondLevelReduction</a></div><div class="ttdeci">qreal * secondLevelReduction</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00186">QuEST.h:186</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a4cf98d55602d1138a2101c158095afdc"><div class="ttname"><a href="QuEST__gpu_8cu.html#a4cf98d55602d1138a2101c158095afdc">densmatr_initPlusStateKernel</a></div><div class="ttdeci">__global__ void densmatr_initPlusStateKernel(long long int stateVecSize, qreal probFactor, qreal *stateVecReal, qreal *stateVecImag)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00216">QuEST_gpu.cu:216</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aeb0039eccca94ba644a8728d91eff5bb"><div class="ttname"><a href="QuEST__gpu_8cu.html#aeb0039eccca94ba644a8728d91eff5bb">densmatr_mixDepolarisingKernel</a></div><div class="ttdeci">__global__ void densmatr_mixDepolarisingKernel(qreal depolLevel, qreal *vecReal, qreal *vecImag, long long int numAmpsToVisit, long long int part1, long long int part2, long long int part3, long long int bothBits)</div><div class="ttdoc">Works like mixDephasing but modifies every other element, and elements are averaged in pairs.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02650">QuEST_gpu.cu:2650</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a43afa97e300b87bce7f3eb1213eb05f6"><div class="ttname"><a href="QuEST__gpu_8cu.html#a43afa97e300b87bce7f3eb1213eb05f6">densmatr_mixTwoQubitDepolarising</a></div><div class="ttdeci">void densmatr_mixTwoQubitDepolarising(Qureg qureg, int qubit1, int qubit2, qreal depolLevel)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02783">QuEST_gpu.cu:2783</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ad405e3fac20997043e0236b751e44270"><div class="ttname"><a href="QuEST__gpu_8cu.html#ad405e3fac20997043e0236b751e44270">densmatr_calcProbOfOutcome</a></div><div class="ttdeci">qreal densmatr_calcProbOfOutcome(Qureg qureg, const int measureQubit, int outcome)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01958">QuEST_gpu.cu:1958</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a8c9da88f734b0862f4cce7d819e6d3b5"><div class="ttname"><a href="QuEST__gpu_8cu.html#a8c9da88f734b0862f4cce7d819e6d3b5">densmatr_calcHilbertSchmidtDistance</a></div><div class="ttdeci">qreal densmatr_calcHilbertSchmidtDistance(Qureg a, Qureg b)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02268">QuEST_gpu.cu:2268</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a6aea6cf9c06d05a5765ad01311531627"><div class="ttname"><a href="QuEST__gpu_8cu.html#a6aea6cf9c06d05a5765ad01311531627">flipBit</a></div><div class="ttdeci">__forceinline__ __device__ long long int flipBit(long long int number, int bitInd)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00095">QuEST_gpu.cu:95</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a623e577b7230f3c8dc202be6185b4289"><div class="ttname"><a href="QuEST__gpu_8cu.html#a623e577b7230f3c8dc202be6185b4289">densmatr_mixTwoQubitDephasing</a></div><div class="ttdeci">void densmatr_mixTwoQubitDephasing(Qureg qureg, int qubit1, int qubit2, qreal dephase)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02613">QuEST_gpu.cu:2613</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a758bad4237ff0bf3b4ff5be626a982ae"><div class="ttname"><a href="QuEST__gpu_8cu.html#a758bad4237ff0bf3b4ff5be626a982ae">statevec_initBlankState</a></div><div class="ttdeci">void statevec_initBlankState(Qureg qureg)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00471">QuEST_gpu.cu:471</a></div></div>
<div class="ttc" id="astructQureg_html"><div class="ttname"><a href="structQureg.html">Qureg</a></div><div class="ttdoc">Represents a system of qubits.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00160">QuEST.h:160</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ad947613d4d62b0b659a0be1e9c736427"><div class="ttname"><a href="QuEST__gpu_8cu.html#ad947613d4d62b0b659a0be1e9c736427">statevec_initDebugStateKernel</a></div><div class="ttdeci">__global__ void statevec_initDebugStateKernel(long long int stateVecSize, qreal *stateVecReal, qreal *stateVecImag)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00557">QuEST_gpu.cu:557</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a7ebd3198a198f4cd20840f64fd8b84d0"><div class="ttname"><a href="QuEST__gpu_8cu.html#a7ebd3198a198f4cd20840f64fd8b84d0">statevec_calcInnerProduct</a></div><div class="ttdeci">Complex statevec_calcInnerProduct(Qureg bra, Qureg ket)</div><div class="ttdoc">Terrible code which unnecessarily individually computes and sums the real and imaginary components of...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02068">QuEST_gpu.cu:2068</a></div></div>
<div class="ttc" id="astructComplexMatrixN_html_afde13e469a3b4f179f45e53d1ec0a7cf"><div class="ttname"><a href="structComplexMatrixN.html#afde13e469a3b4f179f45e53d1ec0a7cf">ComplexMatrixN::imag</a></div><div class="ttdeci">qreal ** imag</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00140">QuEST.h:140</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a4295d3add539f787362b56adf5d155f0"><div class="ttname"><a href="QuEST__gpu_8cu.html#a4295d3add539f787362b56adf5d155f0">statevec_controlledUnitaryKernel</a></div><div class="ttdeci">__global__ void statevec_controlledUnitaryKernel(Qureg qureg, const int controlQubit, const int targetQubit, ArgMatrix2 u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01057">QuEST_gpu.cu:1057</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a1e57230c7995447039e62a84c0a36524"><div class="ttname"><a href="QuEST__gpu_8cu.html#a1e57230c7995447039e62a84c0a36524">statevec_reportStateToScreen</a></div><div class="ttdeci">void statevec_reportStateToScreen(Qureg qureg, QuESTEnv env, int reportRank)</div><div class="ttdoc">Print the current state vector of probability amplitudes for a set of qubits to standard out.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00421">QuEST_gpu.cu:421</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a0f1817fe73e2911937af3979b6506ebd"><div class="ttname"><a href="QuEST__gpu_8cu.html#a0f1817fe73e2911937af3979b6506ebd">statevec_initClassicalStateKernel</a></div><div class="ttdeci">__global__ void statevec_initClassicalStateKernel(long long int stateVecSize, qreal *stateVecReal, qreal *stateVecImag, long long int stateInd)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00531">QuEST_gpu.cu:531</a></div></div>
<div class="ttc" id="aQuEST__precision_8h_html"><div class="ttname"><a href="QuEST__precision_8h.html">QuEST_precision.h</a></div></div>
<div class="ttc" id="astructQureg_html_a441e4cacef6bd17adb9813c7442d42fe"><div class="ttname"><a href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">Qureg::stateVec</a></div><div class="ttdeci">ComplexArray stateVec</div><div class="ttdoc">Computational state amplitudes - a subset thereof in the MPI version.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00179">QuEST.h:179</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aee97816cfabeea7874cd837a8d105412"><div class="ttname"><a href="QuEST__gpu_8cu.html#aee97816cfabeea7874cd837a8d105412">statevec_pauliYConj</a></div><div class="ttdeci">void statevec_pauliYConj(Qureg qureg, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01279">QuEST_gpu.cu:1279</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a4f3c49fa4904bb120bbb6ae2e6395dfd"><div class="ttname"><a href="QuEST__gpu_8cu.html#a4f3c49fa4904bb120bbb6ae2e6395dfd">statevec_calcInnerProductKernel</a></div><div class="ttdeci">__global__ void statevec_calcInnerProductKernel(int getRealComp, qreal *vecReal1, qreal *vecImag1, qreal *vecReal2, qreal *vecImag2, long long int numTermsToSum, qreal *reducedArray)</div><div class="ttdoc">computes either a real or imag term in the inner product</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02038">QuEST_gpu.cu:2038</a></div></div>
<div class="ttc" id="astructComplexMatrix2_html_a3ea98d545b67a190ee6abe936c72076f"><div class="ttname"><a href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">ComplexMatrix2::real</a></div><div class="ttdeci">qreal real[2][2]</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00116">QuEST.h:116</a></div></div>
<div class="ttc" id="agroup__debug_html_gaa8437ef3bf135231e2916e64dde1c94e"><div class="ttname"><a href="group__debug.html#gaa8437ef3bf135231e2916e64dde1c94e">seedQuESTDefault</a></div><div class="ttdeci">void seedQuESTDefault()</div><div class="ttdoc">Seed the Mersenne Twister used for random number generation in the QuEST environment with an example ...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02862">QuEST_gpu.cu:2862</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a94ee4df9faba286ad7a5bc829ef5174d"><div class="ttname"><a href="QuEST__gpu_8cu.html#a94ee4df9faba286ad7a5bc829ef5174d">statevec_compactUnitary</a></div><div class="ttdeci">void statevec_compactUnitary(Qureg qureg, const int targetQubit, Complex alpha, Complex beta)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00722">QuEST_gpu.cu:722</a></div></div>
<div class="ttc" id="astructQureg_html_acf78445e9435d09f44f0cc832c6aee79"><div class="ttname"><a href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">Qureg::isDensityMatrix</a></div><div class="ttdeci">int isDensityMatrix</div><div class="ttdoc">Whether this instance is a density-state representation.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00163">QuEST.h:163</a></div></div>
<div class="ttc" id="agroup__debug_html_gaf8a14ae79c3fb2c0b5f6255cc37bebf9"><div class="ttname"><a href="group__debug.html#gaf8a14ae79c3fb2c0b5f6255cc37bebf9">reportQuESTEnv</a></div><div class="ttdeci">void reportQuESTEnv(QuESTEnv env)</div><div class="ttdoc">Report information about the QuEST environment.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00381">QuEST_gpu.cu:381</a></div></div>
<div class="ttc" id="astructComplexMatrixN_html_a606f7afbc3f65a596bdca21cb43be6a8"><div class="ttname"><a href="structComplexMatrixN.html#a606f7afbc3f65a596bdca21cb43be6a8">ComplexMatrixN::numQubits</a></div><div class="ttdeci">int numQubits</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00138">QuEST.h:138</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a5ef71ca3bb26774d7317253128a4aeab"><div class="ttname"><a href="QuEST__gpu_8cu.html#a5ef71ca3bb26774d7317253128a4aeab">statevec_phaseShiftByTermKernel</a></div><div class="ttdeci">__global__ void statevec_phaseShiftByTermKernel(Qureg qureg, const int targetQubit, qreal cosAngle, qreal sinAngle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01341">QuEST_gpu.cu:1341</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ab33cdf01831c4545e51299178acf7f27"><div class="ttname"><a href="QuEST__gpu_8cu.html#ab33cdf01831c4545e51299178acf7f27">statevec_calcProbOfOutcome</a></div><div class="ttdeci">qreal statevec_calcProbOfOutcome(Qureg qureg, const int measureQubit, int outcome)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01950">QuEST_gpu.cu:1950</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ad5b2ac0b00afa495f385520b2c5fa839"><div class="ttname"><a href="QuEST__gpu_8cu.html#ad5b2ac0b00afa495f385520b2c5fa839">densmatr_initPlusState</a></div><div class="ttdeci">void densmatr_initPlusState(Qureg qureg)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00226">QuEST_gpu.cu:226</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a067da9fba487d5821fbd689718b19de2"><div class="ttname"><a href="QuEST__gpu_8cu.html#a067da9fba487d5821fbd689718b19de2">statevec_findProbabilityOfZero</a></div><div class="ttdeci">qreal statevec_findProbabilityOfZero(Qureg qureg, const int measureQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01912">QuEST_gpu.cu:1912</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a9e647339720bf82b30c6331fad544ec5"><div class="ttname"><a href="QuEST__gpu_8cu.html#a9e647339720bf82b30c6331fad544ec5">statevec_controlledPauliYConj</a></div><div class="ttdeci">void statevec_controlledPauliYConj(Qureg qureg, const int controlQubit, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01332">QuEST_gpu.cu:1332</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a72b26b971531dbdc64de20501f368545"><div class="ttname"><a href="QuEST__gpu_8cu.html#a72b26b971531dbdc64de20501f368545">densmatr_mixDamping</a></div><div class="ttdeci">void densmatr_mixDamping(Qureg qureg, const int targetQubit, qreal damping)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02723">QuEST_gpu.cu:2723</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a9226f386d010aaa85efc0e8889d341d5"><div class="ttname"><a href="QuEST__gpu_8cu.html#a9226f386d010aaa85efc0e8889d341d5">statevec_hadamard</a></div><div class="ttdeci">void statevec_hadamard(Qureg qureg, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01670">QuEST_gpu.cu:1670</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a1338d7ca4e83bbb81da02aca456c53e6"><div class="ttname"><a href="QuEST__gpu_8cu.html#a1338d7ca4e83bbb81da02aca456c53e6">statevec_compactUnitaryKernel</a></div><div class="ttdeci">__global__ void statevec_compactUnitaryKernel(Qureg qureg, const int rotQubit, Complex alpha, Complex beta)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00667">QuEST_gpu.cu:667</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a2a52ad9f9ad9b2fd6a76f6d433b3b217"><div class="ttname"><a href="QuEST__gpu_8cu.html#a2a52ad9f9ad9b2fd6a76f6d433b3b217">statevec_destroyQureg</a></div><div class="ttdeci">void statevec_destroyQureg(Qureg qureg, QuESTEnv env)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00321">QuEST_gpu.cu:321</a></div></div>
<div class="ttc" id="astructQureg_html_ad08dff5316b8937f4b2a1417591543dc"><div class="ttname"><a href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">Qureg::numQubitsRepresented</a></div><div class="ttdeci">int numQubitsRepresented</div><div class="ttdoc">The number of qubits represented in either the state-vector or density matrix.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00165">QuEST.h:165</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aa4b77089145184d990848cd66993aa8b"><div class="ttname"><a href="QuEST__gpu_8cu.html#aa4b77089145184d990848cd66993aa8b">statevec_cloneQureg</a></div><div class="ttdeci">void statevec_cloneQureg(Qureg targetQureg, Qureg copyQureg)</div><div class="ttdoc">works for both statevectors and density matrices</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00170">QuEST_gpu.cu:170</a></div></div>
<div class="ttc" id="astructQureg_html_adef4935cac95763c29164cf99b144ed4"><div class="ttname"><a href="structQureg.html#adef4935cac95763c29164cf99b144ed4">Qureg::numAmpsTotal</a></div><div class="ttdeci">long long int numAmpsTotal</div><div class="ttdoc">Total number of amplitudes, which are possibly distributed among machines.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00172">QuEST.h:172</a></div></div>
<div class="ttc" id="agroup__debug_html_gac7e38d768a1bd79019f88cc1e6295092"><div class="ttname"><a href="group__debug.html#gac7e38d768a1bd79019f88cc1e6295092">syncQuESTSuccess</a></div><div class="ttdeci">int syncQuESTSuccess(int successCode)</div><div class="ttdoc">Performs a logical AND on all successCodes held by all processes.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00373">QuEST_gpu.cu:373</a></div></div>
<div class="ttc" id="astructComplex_html_ab5b2e2eca02131fc74b289a83636cbe3"><div class="ttname"><a href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">Complex::real</a></div><div class="ttdeci">qreal real</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00105">QuEST.h:105</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ac82f3dbf68f877f57d4abbb72fae1254"><div class="ttname"><a href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a></div><div class="ttdeci">__device__ void reduceBlock(qreal *arrayIn, qreal *reducedArray, int length)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01732">QuEST_gpu.cu:1732</a></div></div>
<div class="ttc" id="astructComplex_html_a84f5439aad0ef495efdd3b4c1c02d27e"><div class="ttname"><a href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">Complex::imag</a></div><div class="ttdeci">qreal imag</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00106">QuEST.h:106</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ace807c2089e172363db9ffe083f60f71"><div class="ttname"><a href="QuEST__gpu_8cu.html#ace807c2089e172363db9ffe083f60f71">statevec_initStateOfSingleQubitKernel</a></div><div class="ttdeci">__global__ void statevec_initStateOfSingleQubitKernel(long long int stateVecSize, qreal *stateVecReal, qreal *stateVecImag, int qubitId, int outcome)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00578">QuEST_gpu.cu:578</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a4536acc227ff24e63aaf47b2b42e765f"><div class="ttname"><a href="QuEST__gpu_8cu.html#a4536acc227ff24e63aaf47b2b42e765f">insertZeroBit</a></div><div class="ttdeci">__forceinline__ __device__ long long int insertZeroBit(long long int number, int index)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00099">QuEST_gpu.cu:99</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a5d2202221eed63dc9b003d716a46e879"><div class="ttname"><a href="QuEST__gpu_8cu.html#a5d2202221eed63dc9b003d716a46e879">statevec_collapseToKnownProbOutcomeKernel</a></div><div class="ttdeci">__global__ void statevec_collapseToKnownProbOutcomeKernel(Qureg qureg, int measureQubit, int outcome, qreal totalProbability)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02388">QuEST_gpu.cu:2388</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ad9fd3017ea40cf63fd04b39e03494972"><div class="ttname"><a href="QuEST__gpu_8cu.html#ad9fd3017ea40cf63fd04b39e03494972">statevec_initDebugState</a></div><div class="ttdeci">void statevec_initDebugState(Qureg qureg)</div><div class="ttdoc">Initialise the state vector of probability amplitudes to an (unphysical) state with each component of...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00567">QuEST_gpu.cu:567</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a708246b16236c492094c2633da0c08ff"><div class="ttname"><a href="QuEST__gpu_8cu.html#a708246b16236c492094c2633da0c08ff">statevec_controlledPauliY</a></div><div class="ttdeci">void statevec_controlledPauliY(Qureg qureg, const int controlQubit, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01323">QuEST_gpu.cu:1323</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ae45eefa65f4ecd37bab84fade7cf7f1f"><div class="ttname"><a href="QuEST__gpu_8cu.html#ae45eefa65f4ecd37bab84fade7cf7f1f">densmatr_calcPurity</a></div><div class="ttdeci">qreal densmatr_calcPurity(Qureg qureg)</div><div class="ttdoc">Computes the trace of the density matrix squared.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02339">QuEST_gpu.cu:2339</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ab321af37fe3490253e12b7c70b8d2a98"><div class="ttname"><a href="QuEST__gpu_8cu.html#ab321af37fe3490253e12b7c70b8d2a98">densmatr_collapseToKnownProbOutcome</a></div><div class="ttdeci">void densmatr_collapseToKnownProbOutcome(Qureg qureg, const int measureQubit, int outcome, qreal outcomeProb)</div><div class="ttdoc">This involves finding |...i...><...j...| states and killing those where i!=j.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02480">QuEST_gpu.cu:2480</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a3765e92c79d4c2a0df6761a0e7da2676"><div class="ttname"><a href="QuEST__gpu_8cu.html#a3765e92c79d4c2a0df6761a0e7da2676">densmatr_mixDepolarising</a></div><div class="ttdeci">void densmatr_mixDepolarising(Qureg qureg, const int targetQubit, qreal depolLevel)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02697">QuEST_gpu.cu:2697</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_adeb715f3f2c167f9bfbe92b75f5988ce"><div class="ttname"><a href="QuEST__gpu_8cu.html#adeb715f3f2c167f9bfbe92b75f5988ce">statevec_controlledPhaseShift</a></div><div class="ttdeci">void statevec_controlledPhaseShift(Qureg qureg, const int idQubit1, const int idQubit2, qreal angle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01405">QuEST_gpu.cu:1405</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ab1662a828dc725610a71168a58430fae"><div class="ttname"><a href="QuEST__gpu_8cu.html#ab1662a828dc725610a71168a58430fae">statevec_pauliXKernel</a></div><div class="ttdeci">__global__ void statevec_pauliXKernel(Qureg qureg, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01194">QuEST_gpu.cu:1194</a></div></div>
<div class="ttc" id="astructComplex_html"><div class="ttname"><a href="structComplex.html">Complex</a></div><div class="ttdoc">Represents one complex number.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00103">QuEST.h:103</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a7ec46b4b96cda399095a2488ceff69b6"><div class="ttname"><a href="QuEST__gpu_8cu.html#a7ec46b4b96cda399095a2488ceff69b6">statevec_multiControlledUnitary</a></div><div class="ttdeci">void statevec_multiControlledUnitary(Qureg qureg, long long int ctrlQubitsMask, long long int ctrlFlipMask, const int targetQubit, ComplexMatrix2 u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01183">QuEST_gpu.cu:1183</a></div></div>
<div class="ttc" id="agroup__type_html_ga8ba2c3388dd64d9348c3b091852d36d4"><div class="ttname"><a href="group__type.html#ga8ba2c3388dd64d9348c3b091852d36d4">createQuESTEnv</a></div><div class="ttdeci">QuESTEnv createQuESTEnv(void)</div><div class="ttdoc">Create the QuEST execution environment.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00353">QuEST_gpu.cu:353</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a923906770cac0da9e3459bae58de9e64"><div class="ttname"><a href="QuEST__gpu_8cu.html#a923906770cac0da9e3459bae58de9e64">statevec_initStateOfSingleQubit</a></div><div class="ttdeci">void statevec_initStateOfSingleQubit(Qureg *qureg, int qubitId, int outcome)</div><div class="ttdoc">Initialise the state vector of probability amplitudes such that one qubit is set to 'outcome' and all...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00596">QuEST_gpu.cu:596</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ad64a23933361fafc1b6b1787759c2663"><div class="ttname"><a href="QuEST__gpu_8cu.html#ad64a23933361fafc1b6b1787759c2663">statevec_setWeightedQureg</a></div><div class="ttdeci">void statevec_setWeightedQureg(Complex fac1, Qureg qureg1, Complex fac2, Qureg qureg2, Complex facOut, Qureg out)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02850">QuEST_gpu.cu:2850</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aa6c3f86010ad398f42b0577ea3bb5bcf"><div class="ttname"><a href="QuEST__gpu_8cu.html#aa6c3f86010ad398f42b0577ea3bb5bcf">densmatr_calcFidelity</a></div><div class="ttdeci">qreal densmatr_calcFidelity(Qureg qureg, Qureg pureState)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02194">QuEST_gpu.cu:2194</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a1f5b1f46708a7c96275e379b873ba2f6"><div class="ttname"><a href="QuEST__gpu_8cu.html#a1f5b1f46708a7c96275e379b873ba2f6">statevec_pauliYKernel</a></div><div class="ttdeci">__global__ void statevec_pauliYKernel(Qureg qureg, const int targetQubit, const int conjFac)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01246">QuEST_gpu.cu:1246</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a482fc361fd5f08075404c72e536316a0"><div class="ttname"><a href="QuEST__gpu_8cu.html#a482fc361fd5f08075404c72e536316a0">statevec_initPlusState</a></div><div class="ttdeci">void statevec_initPlusState(Qureg qureg)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00520">QuEST_gpu.cu:520</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a8972669148af60d7e1c09687f69673d4"><div class="ttname"><a href="QuEST__gpu_8cu.html#a8972669148af60d7e1c09687f69673d4">statevec_phaseShiftByTerm</a></div><div class="ttdeci">void statevec_phaseShiftByTerm(Qureg qureg, const int targetQubit, Complex term)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01369">QuEST_gpu.cu:1369</a></div></div>
<div class="ttc" id="astructQureg_html_a2d0007a026a4231b338a5037c4e861b2"><div class="ttname"><a href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">Qureg::firstLevelReduction</a></div><div class="ttdeci">qreal * firstLevelReduction</div><div class="ttdoc">Storage for reduction of probabilities on GPU.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00186">QuEST.h:186</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a515b6a920b1715d4eae25dcf29f39b95"><div class="ttname"><a href="QuEST__gpu_8cu.html#a515b6a920b1715d4eae25dcf29f39b95">densmatr_mixDephasing</a></div><div class="ttdeci">void densmatr_mixDephasing(Qureg qureg, const int targetQubit, qreal dephase)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02574">QuEST_gpu.cu:2574</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_af7723faf3f94342480a54fc2137522ce"><div class="ttname"><a href="QuEST__gpu_8cu.html#af7723faf3f94342480a54fc2137522ce">statevec_controlledPhaseShiftKernel</a></div><div class="ttdeci">__global__ void statevec_controlledPhaseShiftKernel(Qureg qureg, const int idQubit1, const int idQubit2, qreal cosAngle, qreal sinAngle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01380">QuEST_gpu.cu:1380</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a7f1cf14dd4820a59eb8a9874c2062bef"><div class="ttname"><a href="QuEST__gpu_8cu.html#a7f1cf14dd4820a59eb8a9874c2062bef">densmatr_mixDensityMatrixKernel</a></div><div class="ttdeci">__global__ void densmatr_mixDensityMatrixKernel(Qureg combineQureg, qreal otherProb, Qureg otherQureg, long long int numAmpsToVisit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02509">QuEST_gpu.cu:2509</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a114038296eb404b9b8a66aaad7b48800"><div class="ttname"><a href="QuEST__gpu_8cu.html#a114038296eb404b9b8a66aaad7b48800">statevec_controlledNot</a></div><div class="ttdeci">void statevec_controlledNot(Qureg qureg, const int controlQubit, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01717">QuEST_gpu.cu:1717</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a89a450a1932e4f4f94cf1487af9d263b"><div class="ttname"><a href="QuEST__gpu_8cu.html#a89a450a1932e4f4f94cf1487af9d263b">statevec_swapQubitAmpsKernel</a></div><div class="ttdeci">__global__ void statevec_swapQubitAmpsKernel(Qureg qureg, int qb1, int qb2)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01587">QuEST_gpu.cu:1587</a></div></div>
<div class="ttc" id="astructComplexMatrix2_html"><div class="ttname"><a href="structComplexMatrix2.html">ComplexMatrix2</a></div><div class="ttdoc">Represents a 2x2 matrix of complex numbers.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00114">QuEST.h:114</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a090901670793c53a1b08629712b2cdae"><div class="ttname"><a href="QuEST__gpu_8cu.html#a090901670793c53a1b08629712b2cdae">densmatr_calcFidelityKernel</a></div><div class="ttdeci">__global__ void densmatr_calcFidelityKernel(Qureg dens, Qureg vec, long long int dim, qreal *reducedArray)</div><div class="ttdoc">computes one term of (vec^*T) dens * vec</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02156">QuEST_gpu.cu:2156</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a11dc3581b1efe1332854eac7594bc647"><div class="ttname"><a href="QuEST__gpu_8cu.html#a11dc3581b1efe1332854eac7594bc647">statevec_multiControlledPhaseShiftKernel</a></div><div class="ttdeci">__global__ void statevec_multiControlledPhaseShiftKernel(Qureg qureg, long long int mask, qreal cosAngle, qreal sinAngle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01416">QuEST_gpu.cu:1416</a></div></div>
<!-- HTML footer for doxygen 1.8.8-->
<!-- start footer part -->
</div>
</div>
</div>
</div>
</div>
</body>
<script type="text/javascript" src="boot.js"></script>
</html>