<!-- 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 File Reference</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.4.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_e145b6391efe0b6e575fd5bb5f76dbf8.html">QuEST</a></li><li class="navelem"><a class="el" href="dir_aaf4e0c86438000dc030ca371e863336.html">QuEST</a></li><li class="navelem"><a class="el" href="dir_288db1ec25fc0ec29a6dc915511dd336.html">src</a></li><li class="navelem"><a class="el" href="dir_ab07507df26ab10c8d894f4336a7987b.html">GPU</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#define-members">Macros</a> |
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">QuEST_gpu.cu File Reference</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><code>#include "<a class="el" href="QuEST_8h_source.html">QuEST.h</a>"</code><br />
<code>#include "<a class="el" href="QuEST__precision_8h_source.html">QuEST_precision.h</a>"</code><br />
<code>#include "<a class="el" href="QuEST__internal_8h_source.html">QuEST_internal.h</a>"</code><br />
<code>#include "<a class="el" href="mt19937ar_8h_source.html">mt19937ar.h</a>"</code><br />
<code>#include <stdlib.h></code><br />
<code>#include <stdio.h></code><br />
<code>#include <math.h></code><br />
</div>
<p><a href="QuEST__gpu_8cu_source.html">Go to the source code of this file.</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
Macros</h2></td></tr>
<tr class="memitem:ad72dbcf6d0153db1b8d8a58001feed83"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ad72dbcf6d0153db1b8d8a58001feed83">DEBUG</a>   0</td></tr>
<tr class="separator:ad72dbcf6d0153db1b8d8a58001feed83"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aa57d77a0903e334e963c66ddc5ed3f53"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>   512</td></tr>
<tr class="separator:aa57d77a0903e334e963c66ddc5ed3f53"><td class="memSeparator" colspan="2"> </td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:a0b84e6766bd682708e6211276ff0a5bb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structDiagonalOp.html">DiagonalOp</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a0b84e6766bd682708e6211276ff0a5bb">agnostic_createDiagonalOp</a> (int numQubits, <a class="el" href="structQuESTEnv.html">QuESTEnv</a> env)</td></tr>
<tr class="separator:a0b84e6766bd682708e6211276ff0a5bb"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:af798bb01f922804016c4c5bc8d0a580f"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#af798bb01f922804016c4c5bc8d0a580f">agnostic_destroyDiagonalOp</a> (<a class="el" href="structDiagonalOp.html">DiagonalOp</a> op)</td></tr>
<tr class="separator:af798bb01f922804016c4c5bc8d0a580f"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a81a87bb0f0805c9dfcb691f6cb15a1b5"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a81a87bb0f0805c9dfcb691f6cb15a1b5">agnostic_initDiagonalOpFromPauliHamil</a> (<a class="el" href="structDiagonalOp.html">DiagonalOp</a> op, <a class="el" href="structPauliHamil.html">PauliHamil</a> hamil)</td></tr>
<tr class="separator:a81a87bb0f0805c9dfcb691f6cb15a1b5"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a9bf24d5da6a5e78888c393a73fe45f0a"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a9bf24d5da6a5e78888c393a73fe45f0a">agnostic_initDiagonalOpFromPauliHamilKernel</a> (<a class="el" href="structDiagonalOp.html">DiagonalOp</a> op, enum <a class="el" href="group__type.html#ga1c703cf89629e4e9c7023cd402d67028">pauliOpType</a> *pauliCodes, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *termCoeffs, int numSumTerms)</td></tr>
<tr class="separator:a9bf24d5da6a5e78888c393a73fe45f0a"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ab58d6d599c7a729255b1f8eeded663f3"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ab58d6d599c7a729255b1f8eeded663f3">agnostic_setDiagonalOpElems</a> (<a class="el" href="structDiagonalOp.html">DiagonalOp</a> op, long long int startInd, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *real, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *imag, long long int numElems)</td></tr>
<tr class="separator:ab58d6d599c7a729255b1f8eeded663f3"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a1e8f917ab42d38d8c37ba6816b24f2f5"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a1e8f917ab42d38d8c37ba6816b24f2f5">agnostic_syncDiagonalOp</a> (<a class="el" href="structDiagonalOp.html">DiagonalOp</a> op)</td></tr>
<tr class="separator:a1e8f917ab42d38d8c37ba6816b24f2f5"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aea20d173141544e6c5359955a1fbe997"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *arrayIn, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray, int length)</td></tr>
<tr class="separator:aea20d173141544e6c5359955a1fbe997"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga924ef2dbda6b733b4041270077c76ece"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="memdesc:ga924ef2dbda6b733b4041270077c76ece"><td class="mdescLeft"> </td><td class="mdescRight">In GPU mode, this copies the state-vector (or density matrix) from GPU memory (qureg.deviceStateVec) to RAM (qureg.stateVec), where it can be accessed/modified by the user. <a href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">More...</a><br /></td></tr>
<tr class="separator:ga924ef2dbda6b733b4041270077c76ece"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga11448560006dd165128e404b54ebb2f7"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__debug.html#ga11448560006dd165128e404b54ebb2f7">copyStateToGPU</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="memdesc:ga11448560006dd165128e404b54ebb2f7"><td class="mdescLeft"> </td><td class="mdescRight">In GPU mode, this copies the state-vector (or density matrix) from RAM (qureg.stateVec) to VRAM / GPU-memory (qureg.deviceStateVec), which is the version operated upon by other calls to the API. <a href="group__debug.html#ga11448560006dd165128e404b54ebb2f7">More...</a><br /></td></tr>
<tr class="separator:ga11448560006dd165128e404b54ebb2f7"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga8ba2c3388dd64d9348c3b091852d36d4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structQuESTEnv.html">QuESTEnv</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__type.html#ga8ba2c3388dd64d9348c3b091852d36d4">createQuESTEnv</a> (void)</td></tr>
<tr class="memdesc:ga8ba2c3388dd64d9348c3b091852d36d4"><td class="mdescLeft"> </td><td class="mdescRight">Create the QuEST execution environment. <a href="group__type.html#ga8ba2c3388dd64d9348c3b091852d36d4">More...</a><br /></td></tr>
<tr class="separator:ga8ba2c3388dd64d9348c3b091852d36d4"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aedd7ecccf2f09dd2f1c5d191950b51e6"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aedd7ecccf2f09dd2f1c5d191950b51e6">densmatr_applyDiagonalOp</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, <a class="el" href="structDiagonalOp.html">DiagonalOp</a> op)</td></tr>
<tr class="separator:aedd7ecccf2f09dd2f1c5d191950b51e6"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ac26cd978b61d5c9a23be9f0aceb96ced"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ac26cd978b61d5c9a23be9f0aceb96ced">densmatr_applyDiagonalOpKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, <a class="el" href="structDiagonalOp.html">DiagonalOp</a> op)</td></tr>
<tr class="separator:ac26cd978b61d5c9a23be9f0aceb96ced"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a70e3b0a2297c186d5c779af31459b4ca"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structComplex.html">Complex</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a70e3b0a2297c186d5c779af31459b4ca">densmatr_calcExpecDiagonalOp</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, <a class="el" href="structDiagonalOp.html">DiagonalOp</a> op)</td></tr>
<tr class="separator:a70e3b0a2297c186d5c779af31459b4ca"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aecc4bcc79c74153d924edfd2edb930cf"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aecc4bcc79c74153d924edfd2edb930cf">densmatr_calcExpecDiagonalOpKernel</a> (int getRealComp, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *matReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *matImag, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *opReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *opImag, int numQubits, long long int numTermsToSum, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray)</td></tr>
<tr class="separator:aecc4bcc79c74153d924edfd2edb930cf"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aa6c3f86010ad398f42b0577ea3bb5bcf"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aa6c3f86010ad398f42b0577ea3bb5bcf">densmatr_calcFidelity</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, <a class="el" href="structQureg.html">Qureg</a> pureState)</td></tr>
<tr class="separator:aa6c3f86010ad398f42b0577ea3bb5bcf"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a090901670793c53a1b08629712b2cdae"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a090901670793c53a1b08629712b2cdae">densmatr_calcFidelityKernel</a> (<a class="el" href="structQureg.html">Qureg</a> dens, <a class="el" href="structQureg.html">Qureg</a> vec, long long int dim, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray)</td></tr>
<tr class="memdesc:a090901670793c53a1b08629712b2cdae"><td class="mdescLeft"> </td><td class="mdescRight">computes one term of (vec^*T) dens * vec <a href="QuEST__gpu_8cu.html#a090901670793c53a1b08629712b2cdae">More...</a><br /></td></tr>
<tr class="separator:a090901670793c53a1b08629712b2cdae"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a8c9da88f734b0862f4cce7d819e6d3b5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a8c9da88f734b0862f4cce7d819e6d3b5">densmatr_calcHilbertSchmidtDistance</a> (<a class="el" href="structQureg.html">Qureg</a> a, <a class="el" href="structQureg.html">Qureg</a> b)</td></tr>
<tr class="separator:a8c9da88f734b0862f4cce7d819e6d3b5"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a8e15b37c8dd7514a5480381699aa82c2"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a8e15b37c8dd7514a5480381699aa82c2">densmatr_calcHilbertSchmidtDistanceSquaredKernel</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *aRe, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *aIm, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *bRe, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *bIm, long long int numAmpsToSum, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray)</td></tr>
<tr class="separator:a8e15b37c8dd7514a5480381699aa82c2"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a6ff3dc624b5fafe8edae4fe327c255a0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a6ff3dc624b5fafe8edae4fe327c255a0">densmatr_calcInnerProduct</a> (<a class="el" href="structQureg.html">Qureg</a> a, <a class="el" href="structQureg.html">Qureg</a> b)</td></tr>
<tr class="separator:a6ff3dc624b5fafe8edae4fe327c255a0"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a24d53b07592f424e5cc3dcd12f51bf32"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a24d53b07592f424e5cc3dcd12f51bf32">densmatr_calcInnerProductKernel</a> (<a class="el" href="structQureg.html">Qureg</a> a, <a class="el" href="structQureg.html">Qureg</a> b, long long int numTermsToSum, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray)</td></tr>
<tr class="memdesc:a24d53b07592f424e5cc3dcd12f51bf32"><td class="mdescLeft"> </td><td class="mdescRight">computes Tr(conjTrans(a) b) = sum of (a_ij^* b_ij), which is a real number <a href="QuEST__gpu_8cu.html#a24d53b07592f424e5cc3dcd12f51bf32">More...</a><br /></td></tr>
<tr class="separator:a24d53b07592f424e5cc3dcd12f51bf32"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a96460613669152314d4680a8603af650"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a96460613669152314d4680a8603af650">densmatr_calcProbOfAllOutcomes</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *outcomeProbs, <a class="el" href="structQureg.html">Qureg</a> qureg, int *qubits, int numQubits)</td></tr>
<tr class="separator:a96460613669152314d4680a8603af650"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:afcb85940a9f204f77006c3644bd8c13e"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#afcb85940a9f204f77006c3644bd8c13e">densmatr_calcProbOfAllOutcomesKernel</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *outcomeProbs, <a class="el" href="structQureg.html">Qureg</a> qureg, int *qubits, int numQubits)</td></tr>
<tr class="separator:afcb85940a9f204f77006c3644bd8c13e"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ae37b3eff5d3affbc1edfe216cabc1c53"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ae37b3eff5d3affbc1edfe216cabc1c53">densmatr_calcProbOfOutcome</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int measureQubit, int outcome)</td></tr>
<tr class="separator:ae37b3eff5d3affbc1edfe216cabc1c53"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ae45eefa65f4ecd37bab84fade7cf7f1f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ae45eefa65f4ecd37bab84fade7cf7f1f">densmatr_calcPurity</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="memdesc:ae45eefa65f4ecd37bab84fade7cf7f1f"><td class="mdescLeft"> </td><td class="mdescRight">Computes the trace of the density matrix squared. <a href="QuEST__gpu_8cu.html#ae45eefa65f4ecd37bab84fade7cf7f1f">More...</a><br /></td></tr>
<tr class="separator:ae45eefa65f4ecd37bab84fade7cf7f1f"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:afe005f9f69319901bb56c4d022359ad5"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#afe005f9f69319901bb56c4d022359ad5">densmatr_calcPurityKernel</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag, long long int numAmpsToSum, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray)</td></tr>
<tr class="separator:afe005f9f69319901bb56c4d022359ad5"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a6153547f245c05874161a105e9a2f02c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a6153547f245c05874161a105e9a2f02c">densmatr_calcTotalProb</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="separator:a6153547f245c05874161a105e9a2f02c"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a5658f2ecbbd4ea425db5f7dc7fc4ba92"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a5658f2ecbbd4ea425db5f7dc7fc4ba92">densmatr_collapseToKnownProbOutcome</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int measureQubit, int outcome, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb)</td></tr>
<tr class="memdesc:a5658f2ecbbd4ea425db5f7dc7fc4ba92"><td class="mdescLeft"> </td><td class="mdescRight">This involves finding |...i...><...j...| states and killing those where i!=j. <a href="QuEST__gpu_8cu.html#a5658f2ecbbd4ea425db5f7dc7fc4ba92">More...</a><br /></td></tr>
<tr class="separator:a5658f2ecbbd4ea425db5f7dc7fc4ba92"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:afc4dcedaf429d823f4da83d3521d8293"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#afc4dcedaf429d823f4da83d3521d8293">densmatr_collapseToKnownProbOutcomeKernel</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *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)</td></tr>
<tr class="memdesc:afc4dcedaf429d823f4da83d3521d8293"><td class="mdescLeft"> </td><td class="mdescRight">Maps thread ID to a |..0..><..0..| state and then locates |0><1|, |1><0| and |1><1|. <a href="QuEST__gpu_8cu.html#afc4dcedaf429d823f4da83d3521d8293">More...</a><br /></td></tr>
<tr class="separator:afc4dcedaf429d823f4da83d3521d8293"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a73167d054e4e8e7bfce4e3e8480c292d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a73167d054e4e8e7bfce4e3e8480c292d">densmatr_findProbabilityOfZero</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int measureQubit)</td></tr>
<tr class="separator:a73167d054e4e8e7bfce4e3e8480c292d"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ab558d79a6d1caa98999255246db6dcf2"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ab558d79a6d1caa98999255246db6dcf2">densmatr_findProbabilityOfZeroKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int measureQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray)</td></tr>
<tr class="separator:ab558d79a6d1caa98999255246db6dcf2"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a20a155f53efc45c16803d7539c2c199d"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a20a155f53efc45c16803d7539c2c199d">densmatr_initClassicalState</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int stateInd)</td></tr>
<tr class="separator:a20a155f53efc45c16803d7539c2c199d"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a9f4bb112d5e95abb8e35bf051a02a06e"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a9f4bb112d5e95abb8e35bf051a02a06e">densmatr_initClassicalStateKernel</a> (long long int densityNumElems, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *densityReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *densityImag, long long int densityInd)</td></tr>
<tr class="separator:a9f4bb112d5e95abb8e35bf051a02a06e"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ad5b2ac0b00afa495f385520b2c5fa839"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ad5b2ac0b00afa495f385520b2c5fa839">densmatr_initPlusState</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="separator:ad5b2ac0b00afa495f385520b2c5fa839"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a4cf98d55602d1138a2101c158095afdc"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a4cf98d55602d1138a2101c158095afdc">densmatr_initPlusStateKernel</a> (long long int stateVecSize, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> probFactor, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag)</td></tr>
<tr class="separator:a4cf98d55602d1138a2101c158095afdc"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ae5ad68d054875913d0f7ec654840a9ec"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ae5ad68d054875913d0f7ec654840a9ec">densmatr_initPureState</a> (<a class="el" href="structQureg.html">Qureg</a> targetQureg, <a class="el" href="structQureg.html">Qureg</a> copyQureg)</td></tr>
<tr class="separator:ae5ad68d054875913d0f7ec654840a9ec"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a664339e2afc50b0418a56adfc1bc512e"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a664339e2afc50b0418a56adfc1bc512e">densmatr_initPureStateKernel</a> (long long int numPureAmps, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *targetVecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *targetVecImag, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *copyVecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *copyVecImag)</td></tr>
<tr class="separator:a664339e2afc50b0418a56adfc1bc512e"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ac501fe7b9d331be48359ce1546348f97"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ac501fe7b9d331be48359ce1546348f97">densmatr_mixDamping</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> damping)</td></tr>
<tr class="separator:ac501fe7b9d331be48359ce1546348f97"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a7e0a6e9de648b33168d7f56eba53aa7b"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a7e0a6e9de648b33168d7f56eba53aa7b">densmatr_mixDampingKernel</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> damping, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag, long long int numAmpsToVisit, long long int part1, long long int part2, long long int part3, long long int bothBits)</td></tr>
<tr class="memdesc:a7e0a6e9de648b33168d7f56eba53aa7b"><td class="mdescLeft"> </td><td class="mdescRight">Works like mixDephasing but modifies every other element, and elements are averaged in pairs. <a href="QuEST__gpu_8cu.html#a7e0a6e9de648b33168d7f56eba53aa7b">More...</a><br /></td></tr>
<tr class="separator:a7e0a6e9de648b33168d7f56eba53aa7b"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a8adaba9dbdad6f7ab41ae4b8db0abefe"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a8adaba9dbdad6f7ab41ae4b8db0abefe">densmatr_mixDensityMatrix</a> (<a class="el" href="structQureg.html">Qureg</a> combineQureg, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> otherProb, <a class="el" href="structQureg.html">Qureg</a> otherQureg)</td></tr>
<tr class="separator:a8adaba9dbdad6f7ab41ae4b8db0abefe"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a7f1cf14dd4820a59eb8a9874c2062bef"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a7f1cf14dd4820a59eb8a9874c2062bef">densmatr_mixDensityMatrixKernel</a> (<a class="el" href="structQureg.html">Qureg</a> combineQureg, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> otherProb, <a class="el" href="structQureg.html">Qureg</a> otherQureg, long long int numAmpsToVisit)</td></tr>
<tr class="separator:a7f1cf14dd4820a59eb8a9874c2062bef"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aa31f0ef43a921c3ac73545d1d3670fa1"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aa31f0ef43a921c3ac73545d1d3670fa1">densmatr_mixDephasing</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephase)</td></tr>
<tr class="separator:aa31f0ef43a921c3ac73545d1d3670fa1"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a37c6a59b2dd008d235474cb7248df952"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a37c6a59b2dd008d235474cb7248df952">densmatr_mixDephasingKernel</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> fac, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *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)</td></tr>
<tr class="memdesc:a37c6a59b2dd008d235474cb7248df952"><td class="mdescLeft"> </td><td class="mdescRight">Called once for every 4 amplitudes in density matrix Works by establishing the |..0..><..0..| state (for its given index) then visiting |..1..><..0..| and |..0..><..1..|. <a href="QuEST__gpu_8cu.html#a37c6a59b2dd008d235474cb7248df952">More...</a><br /></td></tr>
<tr class="separator:a37c6a59b2dd008d235474cb7248df952"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a398b60c4cb4fa2cf2ffc126de6c08da0"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a398b60c4cb4fa2cf2ffc126de6c08da0">densmatr_mixDepolarising</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> depolLevel)</td></tr>
<tr class="separator:a398b60c4cb4fa2cf2ffc126de6c08da0"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aeb0039eccca94ba644a8728d91eff5bb"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aeb0039eccca94ba644a8728d91eff5bb">densmatr_mixDepolarisingKernel</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> depolLevel, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag, long long int numAmpsToVisit, long long int part1, long long int part2, long long int part3, long long int bothBits)</td></tr>
<tr class="memdesc:aeb0039eccca94ba644a8728d91eff5bb"><td class="mdescLeft"> </td><td class="mdescRight">Works like mixDephasing but modifies every other element, and elements are averaged in pairs. <a href="QuEST__gpu_8cu.html#aeb0039eccca94ba644a8728d91eff5bb">More...</a><br /></td></tr>
<tr class="separator:aeb0039eccca94ba644a8728d91eff5bb"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a623e577b7230f3c8dc202be6185b4289"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a623e577b7230f3c8dc202be6185b4289">densmatr_mixTwoQubitDephasing</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int qubit1, int qubit2, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephase)</td></tr>
<tr class="separator:a623e577b7230f3c8dc202be6185b4289"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ad27d13bcdcbe777e139a90c2e8d52924"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ad27d13bcdcbe777e139a90c2e8d52924">densmatr_mixTwoQubitDephasingKernel</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> fac, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *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)</td></tr>
<tr class="memdesc:ad27d13bcdcbe777e139a90c2e8d52924"><td class="mdescLeft"> </td><td class="mdescRight">Called 12 times for every 16 amplitudes in density matrix Each sums from the |..0..0..><..0..0..| index to visit either |..0..0..><..0..1..|, |..0..0..><..1..0..|, |..0..0..><..1..1..|, |..0..1..><..0..0..| etc and so on to |..1..1..><..1..0|. <a href="QuEST__gpu_8cu.html#ad27d13bcdcbe777e139a90c2e8d52924">More...</a><br /></td></tr>
<tr class="separator:ad27d13bcdcbe777e139a90c2e8d52924"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a43afa97e300b87bce7f3eb1213eb05f6"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a43afa97e300b87bce7f3eb1213eb05f6">densmatr_mixTwoQubitDepolarising</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int qubit1, int qubit2, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> depolLevel)</td></tr>
<tr class="separator:a43afa97e300b87bce7f3eb1213eb05f6"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a5f96311d9094c382074ad70d4b789612"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a5f96311d9094c382074ad70d4b789612">densmatr_mixTwoQubitDepolarisingKernel</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> depolLevel, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *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)</td></tr>
<tr class="memdesc:a5f96311d9094c382074ad70d4b789612"><td class="mdescLeft"> </td><td class="mdescRight">Called once for every 16 amplitudes. <a href="QuEST__gpu_8cu.html#a5f96311d9094c382074ad70d4b789612">More...</a><br /></td></tr>
<tr class="separator:a5f96311d9094c382074ad70d4b789612"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a01be2e229994aaffd9f73e966e515fd5"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a01be2e229994aaffd9f73e966e515fd5">densmatr_oneQubitDegradeOffDiagonal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephFac)</td></tr>
<tr class="separator:a01be2e229994aaffd9f73e966e515fd5"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:gaeff624226629d7063a8a776958a4f991"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__type.html#gaeff624226629d7063a8a776958a4f991">destroyQuESTEnv</a> (<a class="el" href="structQuESTEnv.html">QuESTEnv</a> env)</td></tr>
<tr class="memdesc:gaeff624226629d7063a8a776958a4f991"><td class="mdescLeft"> </td><td class="mdescRight">Destroy the QuEST environment. <a href="group__type.html#gaeff624226629d7063a8a776958a4f991">More...</a><br /></td></tr>
<tr class="separator:gaeff624226629d7063a8a776958a4f991"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aec1852e1a8e70d3690919ce8ab551ba0"><td class="memItemLeft" align="right" valign="top">__forceinline__ __device__ int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a> (const int locationOfBitFromRight, const long long int theEncodedNumber)</td></tr>
<tr class="separator:aec1852e1a8e70d3690919ce8ab551ba0"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ae1b7788cf504ec3d79de3855f97929c7"><td class="memItemLeft" align="right" valign="top">__forceinline__ __device__ long long int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a> (const long long int number, const int bitInd)</td></tr>
<tr class="separator:ae1b7788cf504ec3d79de3855f97929c7"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a1775b7abce55ccfd036bd5f55707877c"><td class="memItemLeft" align="right" valign="top">__forceinline__ __device__ int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a1775b7abce55ccfd036bd5f55707877c">getBitMaskParity</a> (long long int mask)</td></tr>
<tr class="separator:a1775b7abce55ccfd036bd5f55707877c"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:gadc5c01d8ea32e28c188db52be26116b6"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__debug.html#gadc5c01d8ea32e28c188db52be26116b6">getEnvironmentString</a> (<a class="el" href="structQuESTEnv.html">QuESTEnv</a> env, char str[200])</td></tr>
<tr class="memdesc:gadc5c01d8ea32e28c188db52be26116b6"><td class="mdescLeft"> </td><td class="mdescRight">Sets <code>str</code> to a string containing information about the runtime environment, including whether simulation is using CUDA (for GPU), OpenMP (for multithreading) and/or MPI (for distribution). <a href="group__debug.html#gadc5c01d8ea32e28c188db52be26116b6">More...</a><br /></td></tr>
<tr class="separator:gadc5c01d8ea32e28c188db52be26116b6"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a112c74b3365bda6697813d9931b55377"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a112c74b3365bda6697813d9931b55377">getNumReductionLevels</a> (long long int numValuesToReduce, int numReducedPerLevel)</td></tr>
<tr class="separator:a112c74b3365bda6697813d9931b55377"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a0aabd5ed69a74e5bc0b46a17af45c886"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a0aabd5ed69a74e5bc0b46a17af45c886">GPUExists</a> (void)</td></tr>
<tr class="separator:a0aabd5ed69a74e5bc0b46a17af45c886"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a4760109974e9b52c60e9d60ccded3138"><td class="memItemLeft" align="right" valign="top">__forceinline__ __device__ long long int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a4760109974e9b52c60e9d60ccded3138">insertTwoZeroBits</a> (const long long int number, const int bit1, const int bit2)</td></tr>
<tr class="separator:a4760109974e9b52c60e9d60ccded3138"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a5c6f1b2c71f43e57de4a1f818ddfbfd0"><td class="memItemLeft" align="right" valign="top">__forceinline__ __device__ long long int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a5c6f1b2c71f43e57de4a1f818ddfbfd0">insertZeroBit</a> (const long long int number, const int index)</td></tr>
<tr class="separator:a5c6f1b2c71f43e57de4a1f818ddfbfd0"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a9bac39238e100b0f845dc6e4deafc1c9"><td class="memItemLeft" align="right" valign="top">__forceinline__ __device__ long long int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a9bac39238e100b0f845dc6e4deafc1c9">insertZeroBits</a> (long long int number, int *inds, const int numInds)</td></tr>
<tr class="separator:a9bac39238e100b0f845dc6e4deafc1c9"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a8ce1e311ea72b862a8757dc71082fbf3"><td class="memItemLeft" align="right" valign="top">__device__ __host__ unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a8ce1e311ea72b862a8757dc71082fbf3">log2Int</a> (unsigned int x)</td></tr>
<tr class="separator:a8ce1e311ea72b862a8757dc71082fbf3"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ac82f3dbf68f877f57d4abbb72fae1254"><td class="memItemLeft" align="right" valign="top">__device__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *arrayIn, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray, int length)</td></tr>
<tr class="separator:ac82f3dbf68f877f57d4abbb72fae1254"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:gaf8a14ae79c3fb2c0b5f6255cc37bebf9"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__debug.html#gaf8a14ae79c3fb2c0b5f6255cc37bebf9">reportQuESTEnv</a> (<a class="el" href="structQuESTEnv.html">QuESTEnv</a> env)</td></tr>
<tr class="memdesc:gaf8a14ae79c3fb2c0b5f6255cc37bebf9"><td class="mdescLeft"> </td><td class="mdescRight">Report information about the QuEST environment. <a href="group__debug.html#gaf8a14ae79c3fb2c0b5f6255cc37bebf9">More...</a><br /></td></tr>
<tr class="separator:gaf8a14ae79c3fb2c0b5f6255cc37bebf9"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga555451c697ea4a9d27389155f68fdabc"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__debug.html#ga555451c697ea4a9d27389155f68fdabc">seedQuEST</a> (<a class="el" href="structQuESTEnv.html">QuESTEnv</a> *env, unsigned long int *seedArray, int numSeeds)</td></tr>
<tr class="memdesc:ga555451c697ea4a9d27389155f68fdabc"><td class="mdescLeft"> </td><td class="mdescRight">Seeds the random number generator with a custom array of key(s), overriding the default keys. <a href="group__debug.html#ga555451c697ea4a9d27389155f68fdabc">More...</a><br /></td></tr>
<tr class="separator:ga555451c697ea4a9d27389155f68fdabc"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a27294e3065ebe42a65b3b9e0f85551dd"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a27294e3065ebe42a65b3b9e0f85551dd">statevec_applyDiagonalOp</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, <a class="el" href="structDiagonalOp.html">DiagonalOp</a> op)</td></tr>
<tr class="separator:a27294e3065ebe42a65b3b9e0f85551dd"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a0ac752f618123ed417cf0e6358c07fde"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a0ac752f618123ed417cf0e6358c07fde">statevec_applyDiagonalOpKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, <a class="el" href="structDiagonalOp.html">DiagonalOp</a> op)</td></tr>
<tr class="separator:a0ac752f618123ed417cf0e6358c07fde"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ab33437d10c1ce1c4b034c7c411db553f"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ab33437d10c1ce1c4b034c7c411db553f">statevec_applyMultiVarPhaseFuncOverrides</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int *qubits, int *numQubitsPerReg, int numRegs, enum <a class="el" href="group__type.html#ga9c91c41aa42ae537995e89ffc616afe1">bitEncoding</a> encoding, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *coeffs, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *exponents, int *numTermsPerReg, long long int *overrideInds, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *overridePhases, int numOverrides, int conj)</td></tr>
<tr class="separator:ab33437d10c1ce1c4b034c7c411db553f"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a5224b64ff81ca7b205c26f01bb704241"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a5224b64ff81ca7b205c26f01bb704241">statevec_applyMultiVarPhaseFuncOverridesKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int *qubits, int *numQubitsPerReg, int numRegs, enum <a class="el" href="group__type.html#ga9c91c41aa42ae537995e89ffc616afe1">bitEncoding</a> encoding, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *coeffs, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *exponents, int *numTermsPerReg, long long int *overrideInds, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *overridePhases, int numOverrides, long long int *phaseInds, int conj)</td></tr>
<tr class="separator:a5224b64ff81ca7b205c26f01bb704241"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ad5b7e25e42427dfa7f19fd950264bb16"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ad5b7e25e42427dfa7f19fd950264bb16">statevec_applyParamNamedPhaseFuncOverrides</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int *qubits, int *numQubitsPerReg, int numRegs, enum <a class="el" href="group__type.html#ga9c91c41aa42ae537995e89ffc616afe1">bitEncoding</a> encoding, enum <a class="el" href="group__type.html#gaa7d869b117ba5024d6b84938e8cdfc65">phaseFunc</a> phaseFuncName, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *params, int numParams, long long int *overrideInds, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *overridePhases, int numOverrides, int conj)</td></tr>
<tr class="separator:ad5b7e25e42427dfa7f19fd950264bb16"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a0ab7d9b8126b7074f21ba3e2316dd246"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a0ab7d9b8126b7074f21ba3e2316dd246">statevec_applyParamNamedPhaseFuncOverridesKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int *qubits, int *numQubitsPerReg, int numRegs, enum <a class="el" href="group__type.html#ga9c91c41aa42ae537995e89ffc616afe1">bitEncoding</a> encoding, enum <a class="el" href="group__type.html#gaa7d869b117ba5024d6b84938e8cdfc65">phaseFunc</a> phaseFuncName, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *params, int numParams, long long int *overrideInds, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *overridePhases, int numOverrides, long long int *phaseInds, int conj)</td></tr>
<tr class="separator:a0ab7d9b8126b7074f21ba3e2316dd246"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a9d7928473aca695a614e9c24d903e578"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a9d7928473aca695a614e9c24d903e578">statevec_applyPhaseFuncOverrides</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int *qubits, int numQubits, enum <a class="el" href="group__type.html#ga9c91c41aa42ae537995e89ffc616afe1">bitEncoding</a> encoding, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *coeffs, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *exponents, int numTerms, long long int *overrideInds, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *overridePhases, int numOverrides, int conj)</td></tr>
<tr class="separator:a9d7928473aca695a614e9c24d903e578"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:af6f0087743a115ed303cd4733b9f9494"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#af6f0087743a115ed303cd4733b9f9494">statevec_applyPhaseFuncOverridesKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int *qubits, int numQubits, enum <a class="el" href="group__type.html#ga9c91c41aa42ae537995e89ffc616afe1">bitEncoding</a> encoding, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *coeffs, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *exponents, int numTerms, long long int *overrideInds, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *overridePhases, int numOverrides, int conj)</td></tr>
<tr class="separator:af6f0087743a115ed303cd4733b9f9494"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a0fb948ddab4ca210e523aa3c52639df4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structComplex.html">Complex</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a0fb948ddab4ca210e523aa3c52639df4">statevec_calcExpecDiagonalOp</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, <a class="el" href="structDiagonalOp.html">DiagonalOp</a> op)</td></tr>
<tr class="separator:a0fb948ddab4ca210e523aa3c52639df4"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a34c5af075a18c7d6513a3d41284f1ab3"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a34c5af075a18c7d6513a3d41284f1ab3">statevec_calcExpecDiagonalOpKernel</a> (int getRealComp, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *opReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *opImag, long long int numTermsToSum, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray)</td></tr>
<tr class="memdesc:a34c5af075a18c7d6513a3d41284f1ab3"><td class="mdescLeft"> </td><td class="mdescRight">computes either a real or imag term of |vec_i|^2 op_i <a href="QuEST__gpu_8cu.html#a34c5af075a18c7d6513a3d41284f1ab3">More...</a><br /></td></tr>
<tr class="separator:a34c5af075a18c7d6513a3d41284f1ab3"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a7ebd3198a198f4cd20840f64fd8b84d0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structComplex.html">Complex</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a7ebd3198a198f4cd20840f64fd8b84d0">statevec_calcInnerProduct</a> (<a class="el" href="structQureg.html">Qureg</a> bra, <a class="el" href="structQureg.html">Qureg</a> ket)</td></tr>
<tr class="memdesc:a7ebd3198a198f4cd20840f64fd8b84d0"><td class="mdescLeft"> </td><td class="mdescRight">Terrible code which unnecessarily individually computes and sums the real and imaginary components of the inner product, so as to not have to worry about keeping the sums separated during reduction. <a href="QuEST__gpu_8cu.html#a7ebd3198a198f4cd20840f64fd8b84d0">More...</a><br /></td></tr>
<tr class="separator:a7ebd3198a198f4cd20840f64fd8b84d0"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a4f3c49fa4904bb120bbb6ae2e6395dfd"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a4f3c49fa4904bb120bbb6ae2e6395dfd">statevec_calcInnerProductKernel</a> (int getRealComp, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReal1, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag1, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReal2, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag2, long long int numTermsToSum, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray)</td></tr>
<tr class="memdesc:a4f3c49fa4904bb120bbb6ae2e6395dfd"><td class="mdescLeft"> </td><td class="mdescRight">computes either a real or imag term in the inner product <a href="QuEST__gpu_8cu.html#a4f3c49fa4904bb120bbb6ae2e6395dfd">More...</a><br /></td></tr>
<tr class="separator:a4f3c49fa4904bb120bbb6ae2e6395dfd"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:afd14cca643241a991ac172a826311eca"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#afd14cca643241a991ac172a826311eca">statevec_calcProbOfAllOutcomes</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *outcomeProbs, <a class="el" href="structQureg.html">Qureg</a> qureg, int *qubits, int numQubits)</td></tr>
<tr class="separator:afd14cca643241a991ac172a826311eca"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ab2ffd422f8c4e334277263bb4efe2a61"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ab2ffd422f8c4e334277263bb4efe2a61">statevec_calcProbOfAllOutcomesKernel</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *outcomeProbs, <a class="el" href="structQureg.html">Qureg</a> qureg, int *qubits, int numQubits)</td></tr>
<tr class="separator:ab2ffd422f8c4e334277263bb4efe2a61"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a63cb88a5f4eb12fef087435b8db3f8eb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a63cb88a5f4eb12fef087435b8db3f8eb">statevec_calcProbOfOutcome</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int measureQubit, int outcome)</td></tr>
<tr class="separator:a63cb88a5f4eb12fef087435b8db3f8eb"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ad65ad1b5ea6f30b0c6b4ffda96e1a8e6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ad65ad1b5ea6f30b0c6b4ffda96e1a8e6">statevec_calcTotalProb</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="separator:ad65ad1b5ea6f30b0c6b4ffda96e1a8e6"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aa4b77089145184d990848cd66993aa8b"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aa4b77089145184d990848cd66993aa8b">statevec_cloneQureg</a> (<a class="el" href="structQureg.html">Qureg</a> targetQureg, <a class="el" href="structQureg.html">Qureg</a> copyQureg)</td></tr>
<tr class="memdesc:aa4b77089145184d990848cd66993aa8b"><td class="mdescLeft"> </td><td class="mdescRight">works for both statevectors and density matrices <a href="QuEST__gpu_8cu.html#aa4b77089145184d990848cd66993aa8b">More...</a><br /></td></tr>
<tr class="separator:aa4b77089145184d990848cd66993aa8b"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a008becc4a18f868340836e0ab9fd6df6"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a008becc4a18f868340836e0ab9fd6df6">statevec_collapseToKnownProbOutcome</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int measureQubit, int outcome, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb)</td></tr>
<tr class="separator:a008becc4a18f868340836e0ab9fd6df6"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a5d2202221eed63dc9b003d716a46e879"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a5d2202221eed63dc9b003d716a46e879">statevec_collapseToKnownProbOutcomeKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int measureQubit, int outcome, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> totalProbability)</td></tr>
<tr class="separator:a5d2202221eed63dc9b003d716a46e879"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aec63559e8b9ab0e17efe18d64d2ceca6"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aec63559e8b9ab0e17efe18d64d2ceca6">statevec_compactUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, <a class="el" href="structComplex.html">Complex</a> alpha, <a class="el" href="structComplex.html">Complex</a> beta)</td></tr>
<tr class="separator:aec63559e8b9ab0e17efe18d64d2ceca6"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a4d5c3bc20e1fe6f36e1f92e6d030afc7"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a4d5c3bc20e1fe6f36e1f92e6d030afc7">statevec_compactUnitaryKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int rotQubit, <a class="el" href="structComplex.html">Complex</a> alpha, <a class="el" href="structComplex.html">Complex</a> beta)</td></tr>
<tr class="separator:a4d5c3bc20e1fe6f36e1f92e6d030afc7"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ae6cecbad32a03416138b321cdc1a2c33"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ae6cecbad32a03416138b321cdc1a2c33">statevec_compareStates</a> (<a class="el" href="structQureg.html">Qureg</a> mq1, <a class="el" href="structQureg.html">Qureg</a> mq2, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> precision)</td></tr>
<tr class="separator:ae6cecbad32a03416138b321cdc1a2c33"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a1275d604674224d87a173fb5bac78835"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a1275d604674224d87a173fb5bac78835">statevec_controlledCompactUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int controlQubit, int targetQubit, <a class="el" href="structComplex.html">Complex</a> alpha, <a class="el" href="structComplex.html">Complex</a> beta)</td></tr>
<tr class="separator:a1275d604674224d87a173fb5bac78835"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ab1bc0bf471c4459dd845adbfac5ef857"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ab1bc0bf471c4459dd845adbfac5ef857">statevec_controlledCompactUnitaryKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int controlQubit, int targetQubit, <a class="el" href="structComplex.html">Complex</a> alpha, <a class="el" href="structComplex.html">Complex</a> beta)</td></tr>
<tr class="separator:ab1bc0bf471c4459dd845adbfac5ef857"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:abb2eab4af99adcc59be24f4c91c6f6ad"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#abb2eab4af99adcc59be24f4c91c6f6ad">statevec_controlledNot</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int controlQubit, int targetQubit)</td></tr>
<tr class="separator:abb2eab4af99adcc59be24f4c91c6f6ad"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ac15269559c1759a1a44971451874cea9"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ac15269559c1759a1a44971451874cea9">statevec_controlledNotKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int controlQubit, int targetQubit)</td></tr>
<tr class="separator:ac15269559c1759a1a44971451874cea9"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a4e19ef93d01d7acea32ca646d623aedd"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a4e19ef93d01d7acea32ca646d623aedd">statevec_controlledPauliY</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int controlQubit, int targetQubit)</td></tr>
<tr class="separator:a4e19ef93d01d7acea32ca646d623aedd"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a4a2fa262d3f0dba372797b9bd35d9fa5"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a4a2fa262d3f0dba372797b9bd35d9fa5">statevec_controlledPauliYConj</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int controlQubit, int targetQubit)</td></tr>
<tr class="separator:a4a2fa262d3f0dba372797b9bd35d9fa5"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ac65fd6109f08a191a7811ddf72886d55"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ac65fd6109f08a191a7811ddf72886d55">statevec_controlledPauliYKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int controlQubit, int targetQubit, int conjFac)</td></tr>
<tr class="separator:ac65fd6109f08a191a7811ddf72886d55"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aaf78491e35d165edfd57387f9fffecbd"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aaf78491e35d165edfd57387f9fffecbd">statevec_controlledPhaseFlip</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int idQubit1, int idQubit2)</td></tr>
<tr class="separator:aaf78491e35d165edfd57387f9fffecbd"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a1653a2901d0a843e00127e7150c31384"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a1653a2901d0a843e00127e7150c31384">statevec_controlledPhaseFlipKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int idQubit1, int idQubit2)</td></tr>
<tr class="separator:a1653a2901d0a843e00127e7150c31384"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a63df1ec14ff7cc81c3f392ac10fcc744"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a63df1ec14ff7cc81c3f392ac10fcc744">statevec_controlledPhaseShift</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int idQubit1, int idQubit2, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</td></tr>
<tr class="separator:a63df1ec14ff7cc81c3f392ac10fcc744"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a2f95208e214543c15c3e16cc2e091d5c"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a2f95208e214543c15c3e16cc2e091d5c">statevec_controlledPhaseShiftKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int idQubit1, int idQubit2, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle)</td></tr>
<tr class="separator:a2f95208e214543c15c3e16cc2e091d5c"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:add9ca9956cdd81ed5d0b0f66168c04a3"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#add9ca9956cdd81ed5d0b0f66168c04a3">statevec_controlledUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int controlQubit, int targetQubit, <a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> u)</td></tr>
<tr class="separator:add9ca9956cdd81ed5d0b0f66168c04a3"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ae4ee10f6db39b2634c82159322181826"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ae4ee10f6db39b2634c82159322181826">statevec_controlledUnitaryKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int controlQubit, int targetQubit, ArgMatrix2 u)</td></tr>
<tr class="separator:ae4ee10f6db39b2634c82159322181826"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a365bbb1b80cb00405c8bf1a4fa1ea8e5"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a365bbb1b80cb00405c8bf1a4fa1ea8e5">statevec_createQureg</a> (<a class="el" href="structQureg.html">Qureg</a> *qureg, int numQubits, <a class="el" href="structQuESTEnv.html">QuESTEnv</a> env)</td></tr>
<tr class="separator:a365bbb1b80cb00405c8bf1a4fa1ea8e5"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a2a52ad9f9ad9b2fd6a76f6d433b3b217"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a2a52ad9f9ad9b2fd6a76f6d433b3b217">statevec_destroyQureg</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, <a class="el" href="structQuESTEnv.html">QuESTEnv</a> env)</td></tr>
<tr class="separator:a2a52ad9f9ad9b2fd6a76f6d433b3b217"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a5a34c2468f9c21c35ccca1b5e491e238"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a5a34c2468f9c21c35ccca1b5e491e238">statevec_findProbabilityOfZero</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int measureQubit)</td></tr>
<tr class="separator:a5a34c2468f9c21c35ccca1b5e491e238"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:acd94d5e3794824e757731e50d3d018c6"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#acd94d5e3794824e757731e50d3d018c6">statevec_findProbabilityOfZeroKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int measureQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray)</td></tr>
<tr class="separator:acd94d5e3794824e757731e50d3d018c6"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:abd509244d57657e148e4084c5ab5d28f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#abd509244d57657e148e4084c5ab5d28f">statevec_getImagAmp</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int index)</td></tr>
<tr class="separator:abd509244d57657e148e4084c5ab5d28f"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:abc9a9ef4344c7faaaf28ac25c76649b9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#abc9a9ef4344c7faaaf28ac25c76649b9">statevec_getRealAmp</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int index)</td></tr>
<tr class="separator:abc9a9ef4344c7faaaf28ac25c76649b9"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:af3fc7bd149c70f083b149050242cd55e"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#af3fc7bd149c70f083b149050242cd55e">statevec_hadamard</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit)</td></tr>
<tr class="separator:af3fc7bd149c70f083b149050242cd55e"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:afcf7b425ab92924c15b0b95b0d64c307"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#afcf7b425ab92924c15b0b95b0d64c307">statevec_hadamardKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit)</td></tr>
<tr class="separator:afcf7b425ab92924c15b0b95b0d64c307"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a758bad4237ff0bf3b4ff5be626a982ae"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a758bad4237ff0bf3b4ff5be626a982ae">statevec_initBlankState</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="separator:a758bad4237ff0bf3b4ff5be626a982ae"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a2116805f30cb063a0e7c0341583d1550"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a2116805f30cb063a0e7c0341583d1550">statevec_initBlankStateKernel</a> (long long int stateVecSize, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag)</td></tr>
<tr class="separator:a2116805f30cb063a0e7c0341583d1550"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a288dc4b46bdacd69cbf4a6fd070d26a7"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a288dc4b46bdacd69cbf4a6fd070d26a7">statevec_initClassicalState</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int stateInd)</td></tr>
<tr class="separator:a288dc4b46bdacd69cbf4a6fd070d26a7"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a0f1817fe73e2911937af3979b6506ebd"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a0f1817fe73e2911937af3979b6506ebd">statevec_initClassicalStateKernel</a> (long long int stateVecSize, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag, long long int stateInd)</td></tr>
<tr class="separator:a0f1817fe73e2911937af3979b6506ebd"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ad9fd3017ea40cf63fd04b39e03494972"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ad9fd3017ea40cf63fd04b39e03494972">statevec_initDebugState</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="memdesc:ad9fd3017ea40cf63fd04b39e03494972"><td class="mdescLeft"> </td><td class="mdescRight">Initialise the state vector of probability amplitudes to an (unphysical) state with each component of each probability amplitude a unique floating point value. <a href="QuEST__gpu_8cu.html#ad9fd3017ea40cf63fd04b39e03494972">More...</a><br /></td></tr>
<tr class="separator:ad9fd3017ea40cf63fd04b39e03494972"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ad947613d4d62b0b659a0be1e9c736427"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ad947613d4d62b0b659a0be1e9c736427">statevec_initDebugStateKernel</a> (long long int stateVecSize, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag)</td></tr>
<tr class="separator:ad947613d4d62b0b659a0be1e9c736427"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a482fc361fd5f08075404c72e536316a0"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a482fc361fd5f08075404c72e536316a0">statevec_initPlusState</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="separator:a482fc361fd5f08075404c72e536316a0"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aaa36e3e86a5b79e676c6268fa2b02222"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aaa36e3e86a5b79e676c6268fa2b02222">statevec_initPlusStateKernel</a> (long long int stateVecSize, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag)</td></tr>
<tr class="separator:aaa36e3e86a5b79e676c6268fa2b02222"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a05756b45f10135bb2eeb07380f806c20"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a05756b45f10135bb2eeb07380f806c20">statevec_initStateFromSingleFile</a> (<a class="el" href="structQureg.html">Qureg</a> *qureg, char filename[200], <a class="el" href="structQuESTEnv.html">QuESTEnv</a> env)</td></tr>
<tr class="separator:a05756b45f10135bb2eeb07380f806c20"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a923906770cac0da9e3459bae58de9e64"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a923906770cac0da9e3459bae58de9e64">statevec_initStateOfSingleQubit</a> (<a class="el" href="structQureg.html">Qureg</a> *qureg, int qubitId, int outcome)</td></tr>
<tr class="memdesc:a923906770cac0da9e3459bae58de9e64"><td class="mdescLeft"> </td><td class="mdescRight">Initialise the state vector of probability amplitudes such that one qubit is set to 'outcome' and all other qubits are in an equal superposition of zero and one. <a href="QuEST__gpu_8cu.html#a923906770cac0da9e3459bae58de9e64">More...</a><br /></td></tr>
<tr class="separator:a923906770cac0da9e3459bae58de9e64"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ace807c2089e172363db9ffe083f60f71"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ace807c2089e172363db9ffe083f60f71">statevec_initStateOfSingleQubitKernel</a> (long long int stateVecSize, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag, int qubitId, int outcome)</td></tr>
<tr class="separator:ace807c2089e172363db9ffe083f60f71"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a2ca0c6ba07ab2b4b437321bf17efc966"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a2ca0c6ba07ab2b4b437321bf17efc966">statevec_initZeroState</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="separator:a2ca0c6ba07ab2b4b437321bf17efc966"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a43b35abfab0d6093b052e2c2e4b15064"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a43b35abfab0d6093b052e2c2e4b15064">statevec_initZeroStateKernel</a> (long long int stateVecSize, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag)</td></tr>
<tr class="separator:a43b35abfab0d6093b052e2c2e4b15064"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a13ecc24b355a5213d745651cde56bd71"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a13ecc24b355a5213d745651cde56bd71">statevec_multiControlledMultiQubitNot</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int ctrlMask, int targMask)</td></tr>
<tr class="separator:a13ecc24b355a5213d745651cde56bd71"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ac2d127c660168c2462601e4eca100740"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ac2d127c660168c2462601e4eca100740">statevec_multiControlledMultiQubitNotKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int ctrlMask, int targMask)</td></tr>
<tr class="separator:ac2d127c660168c2462601e4eca100740"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a0acfe30083d0bc2a84da196378a36122"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a0acfe30083d0bc2a84da196378a36122">statevec_multiControlledMultiQubitUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int ctrlMask, int *targs, int numTargs, <a class="el" href="structComplexMatrixN.html">ComplexMatrixN</a> u)</td></tr>
<tr class="memdesc:a0acfe30083d0bc2a84da196378a36122"><td class="mdescLeft"> </td><td class="mdescRight">This calls swapQubitAmps only when it would involve a distributed communication; if the qubit chunks already fit in the node, it operates the unitary direct. <a href="QuEST__gpu_8cu.html#a0acfe30083d0bc2a84da196378a36122">More...</a><br /></td></tr>
<tr class="separator:a0acfe30083d0bc2a84da196378a36122"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:afd7fc4d67072a80dbc609bf328b5be20"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#afd7fc4d67072a80dbc609bf328b5be20">statevec_multiControlledMultiQubitUnitaryKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int ctrlMask, int *targs, int numTargs, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *uRe, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *uIm, long long int *ampInds, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reAmps, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *imAmps, long long int numTargAmps)</td></tr>
<tr class="separator:afd7fc4d67072a80dbc609bf328b5be20"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a3ed30f823a59890be17441d97ce90c5c"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a3ed30f823a59890be17441d97ce90c5c">statevec_multiControlledMultiRotateZ</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int ctrlMask, long long int targMask, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</td></tr>
<tr class="separator:a3ed30f823a59890be17441d97ce90c5c"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aac71aef8fca67e5a0547ea2d3426d40d"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aac71aef8fca67e5a0547ea2d3426d40d">statevec_multiControlledMultiRotateZKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int ctrlMask, long long int targMask, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle)</td></tr>
<tr class="separator:aac71aef8fca67e5a0547ea2d3426d40d"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ac4ee5979d475e8c729294b8ef7e0270d"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ac4ee5979d475e8c729294b8ef7e0270d">statevec_multiControlledPhaseFlip</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int *controlQubits, int numControlQubits)</td></tr>
<tr class="separator:ac4ee5979d475e8c729294b8ef7e0270d"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ab1f13b1980ec46bac75e97c578d15e98"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ab1f13b1980ec46bac75e97c578d15e98">statevec_multiControlledPhaseFlipKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int mask)</td></tr>
<tr class="separator:ab1f13b1980ec46bac75e97c578d15e98"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aa662796ea6e0f471143c53becae8c12c"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aa662796ea6e0f471143c53becae8c12c">statevec_multiControlledPhaseShift</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int *controlQubits, int numControlQubits, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</td></tr>
<tr class="separator:aa662796ea6e0f471143c53becae8c12c"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a11dc3581b1efe1332854eac7594bc647"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a11dc3581b1efe1332854eac7594bc647">statevec_multiControlledPhaseShiftKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int mask, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle)</td></tr>
<tr class="separator:a11dc3581b1efe1332854eac7594bc647"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:affbd18d7c2ed8d5bd5edb67116501145"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#affbd18d7c2ed8d5bd5edb67116501145">statevec_multiControlledTwoQubitUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int ctrlMask, int q1, int q2, <a class="el" href="structComplexMatrix4.html">ComplexMatrix4</a> u)</td></tr>
<tr class="memdesc:affbd18d7c2ed8d5bd5edb67116501145"><td class="mdescLeft"> </td><td class="mdescRight">This calls swapQubitAmps only when it would involve a distributed communication; if the qubit chunks already fit in the node, it operates the unitary direct. <a href="QuEST__gpu_8cu.html#affbd18d7c2ed8d5bd5edb67116501145">More...</a><br /></td></tr>
<tr class="separator:affbd18d7c2ed8d5bd5edb67116501145"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aed40f77bf851930363897f3d28a5093b"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aed40f77bf851930363897f3d28a5093b">statevec_multiControlledTwoQubitUnitaryKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int ctrlMask, int q1, int q2, ArgMatrix4 u)</td></tr>
<tr class="separator:aed40f77bf851930363897f3d28a5093b"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a600bda10463e2078ce746ec28f2d39c9"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a600bda10463e2078ce746ec28f2d39c9">statevec_multiControlledUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int ctrlQubitsMask, long long int ctrlFlipMask, int targetQubit, <a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> u)</td></tr>
<tr class="separator:a600bda10463e2078ce746ec28f2d39c9"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a6d0bd05cfccc67102864429f1046ecc3"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a6d0bd05cfccc67102864429f1046ecc3">statevec_multiControlledUnitaryKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int ctrlQubitsMask, long long int ctrlFlipMask, int targetQubit, ArgMatrix2 u)</td></tr>
<tr class="separator:a6d0bd05cfccc67102864429f1046ecc3"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a8d88b4ed94ab024e5e7b2f1f4f505b44"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a8d88b4ed94ab024e5e7b2f1f4f505b44">statevec_multiRotateZ</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int mask, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</td></tr>
<tr class="separator:a8d88b4ed94ab024e5e7b2f1f4f505b44"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a754e4531aa159461177751dd12e988ed"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a754e4531aa159461177751dd12e988ed">statevec_multiRotateZKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int mask, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle)</td></tr>
<tr class="separator:a754e4531aa159461177751dd12e988ed"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a1c82b5e914a8a39c5c7b782dbc16fa76"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a1c82b5e914a8a39c5c7b782dbc16fa76">statevec_pauliX</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit)</td></tr>
<tr class="separator:a1c82b5e914a8a39c5c7b782dbc16fa76"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a61f547009235f367c6f983f8768dae19"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a61f547009235f367c6f983f8768dae19">statevec_pauliXKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit)</td></tr>
<tr class="separator:a61f547009235f367c6f983f8768dae19"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:af1cca787f3b0e0c91ffb2495f9ad8d5a"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#af1cca787f3b0e0c91ffb2495f9ad8d5a">statevec_pauliY</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit)</td></tr>
<tr class="separator:af1cca787f3b0e0c91ffb2495f9ad8d5a"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a81fbd2eccd0d0e5a3cece4df2f96cb92"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a81fbd2eccd0d0e5a3cece4df2f96cb92">statevec_pauliYConj</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit)</td></tr>
<tr class="separator:a81fbd2eccd0d0e5a3cece4df2f96cb92"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a2b9beefe0873d2c2e8fec68f86e057fc"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a2b9beefe0873d2c2e8fec68f86e057fc">statevec_pauliYKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, int conjFac)</td></tr>
<tr class="separator:a2b9beefe0873d2c2e8fec68f86e057fc"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a535cc3c9962d511078691e4d64b4e272"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a535cc3c9962d511078691e4d64b4e272">statevec_phaseShiftByTerm</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, <a class="el" href="structComplex.html">Complex</a> term)</td></tr>
<tr class="separator:a535cc3c9962d511078691e4d64b4e272"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ad2c5cb1c21c9d6cab081b820d1ba4995"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ad2c5cb1c21c9d6cab081b820d1ba4995">statevec_phaseShiftByTermKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle)</td></tr>
<tr class="separator:ad2c5cb1c21c9d6cab081b820d1ba4995"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a1e57230c7995447039e62a84c0a36524"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a1e57230c7995447039e62a84c0a36524">statevec_reportStateToScreen</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, <a class="el" href="structQuESTEnv.html">QuESTEnv</a> env, int reportRank)</td></tr>
<tr class="memdesc:a1e57230c7995447039e62a84c0a36524"><td class="mdescLeft"> </td><td class="mdescRight">Print the current state vector of probability amplitudes for a set of qubits to standard out. <a href="QuEST__gpu_8cu.html#a1e57230c7995447039e62a84c0a36524">More...</a><br /></td></tr>
<tr class="separator:a1e57230c7995447039e62a84c0a36524"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aa121d55f2ca09c06a96ddcd433c60b0f"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aa121d55f2ca09c06a96ddcd433c60b0f">statevec_setAmps</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int startInd, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reals, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *imags, long long int numAmps)</td></tr>
<tr class="separator:aa121d55f2ca09c06a96ddcd433c60b0f"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ad64a23933361fafc1b6b1787759c2663"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ad64a23933361fafc1b6b1787759c2663">statevec_setWeightedQureg</a> (<a class="el" href="structComplex.html">Complex</a> fac1, <a class="el" href="structQureg.html">Qureg</a> qureg1, <a class="el" href="structComplex.html">Complex</a> fac2, <a class="el" href="structQureg.html">Qureg</a> qureg2, <a class="el" href="structComplex.html">Complex</a> facOut, <a class="el" href="structQureg.html">Qureg</a> out)</td></tr>
<tr class="separator:ad64a23933361fafc1b6b1787759c2663"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a040a1c670457b4b5789c089a3d32bf8f"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a040a1c670457b4b5789c089a3d32bf8f">statevec_setWeightedQuregKernel</a> (<a class="el" href="structComplex.html">Complex</a> fac1, <a class="el" href="structQureg.html">Qureg</a> qureg1, <a class="el" href="structComplex.html">Complex</a> fac2, <a class="el" href="structQureg.html">Qureg</a> qureg2, <a class="el" href="structComplex.html">Complex</a> facOut, <a class="el" href="structQureg.html">Qureg</a> out)</td></tr>
<tr class="separator:a040a1c670457b4b5789c089a3d32bf8f"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ab7478fcaf6357ab202d72853b672e375"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ab7478fcaf6357ab202d72853b672e375">statevec_swapQubitAmps</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int qb1, int qb2)</td></tr>
<tr class="separator:ab7478fcaf6357ab202d72853b672e375"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a89a450a1932e4f4f94cf1487af9d263b"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a89a450a1932e4f4f94cf1487af9d263b">statevec_swapQubitAmpsKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int qb1, int qb2)</td></tr>
<tr class="separator:a89a450a1932e4f4f94cf1487af9d263b"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ac3735bd959600e57b2ee3a105666cddf"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ac3735bd959600e57b2ee3a105666cddf">statevec_unitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, <a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> u)</td></tr>
<tr class="separator:ac3735bd959600e57b2ee3a105666cddf"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a19e364fb77ebe56afd7cd7cc6de12449"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a19e364fb77ebe56afd7cd7cc6de12449">statevec_unitaryKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, ArgMatrix2 u)</td></tr>
<tr class="separator:a19e364fb77ebe56afd7cd7cc6de12449"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a31772904f024efd8d75a022e84c8207b"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> **a, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> **b)</td></tr>
<tr class="separator:a31772904f024efd8d75a022e84c8207b"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__debug.html#ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77">syncQuESTEnv</a> (<a class="el" href="structQuESTEnv.html">QuESTEnv</a> env)</td></tr>
<tr class="memdesc:ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77"><td class="mdescLeft"> </td><td class="mdescRight">Guarantees that all code up to the given point has been executed on all nodes (if running in distributed mode) <a href="group__debug.html#ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77">More...</a><br /></td></tr>
<tr class="separator:ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:gac7e38d768a1bd79019f88cc1e6295092"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__debug.html#gac7e38d768a1bd79019f88cc1e6295092">syncQuESTSuccess</a> (int successCode)</td></tr>
<tr class="memdesc:gac7e38d768a1bd79019f88cc1e6295092"><td class="mdescLeft"> </td><td class="mdescRight">Performs a logical AND on all successCodes held by all processes. <a href="group__debug.html#gac7e38d768a1bd79019f88cc1e6295092">More...</a><br /></td></tr>
<tr class="separator:gac7e38d768a1bd79019f88cc1e6295092"><td class="memSeparator" colspan="2"> </td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>An implementation of the backend in ../QuEST_internal.h for a GPU environment.</p>
<dl class="section author"><dt>Author</dt><dd>Ania Brown </dd>
<dd>
Tyson Jones </dd></dl>
<p class="definition">Definition in file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
</div><h2 class="groupheader">Macro Definition Documentation</h2>
<a id="ad72dbcf6d0153db1b8d8a58001feed83"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad72dbcf6d0153db1b8d8a58001feed83">◆ </a></span>DEBUG</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define DEBUG   0</td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00020">20</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
</div>
</div>
<a id="aa57d77a0903e334e963c66ddc5ed3f53"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa57d77a0903e334e963c66ddc5ed3f53">◆ </a></span>REDUCE_SHARED_SIZE</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define REDUCE_SHARED_SIZE   512</td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00019">19</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
</div>
</div>
<h2 class="groupheader">Function Documentation</h2>
<a id="a0b84e6766bd682708e6211276ff0a5bb"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0b84e6766bd682708e6211276ff0a5bb">◆ </a></span>agnostic_createDiagonalOp()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="structDiagonalOp.html">DiagonalOp</a> agnostic_createDiagonalOp </td>
<td>(</td>
<td class="paramtype">int </td>
<td class="paramname"><em>numQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQuESTEnv.html">QuESTEnv</a> </td>
<td class="paramname"><em>env</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00338">338</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  {</div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  </div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <a class="code" href="structDiagonalOp.html">DiagonalOp</a> op;</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  op.<a class="code" href="structDiagonalOp.html#a5131eeb67aafb4c19ac98270c3266742">numQubits</a> = numQubits;</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  op.<a class="code" href="structDiagonalOp.html#a2c6eab631ef48b4978db026c98180eee">numElemsPerChunk</a> = (1LL << numQubits) / env.<a class="code" href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">numRanks</a>;</div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  op.<a class="code" href="structDiagonalOp.html#aa91713a22c95a383bba55e56c4a4e37a">chunkId</a> = env.<a class="code" href="structQuESTEnv.html#aa648bb336cf8598467cb62db00b9cee8">rank</a>;</div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  op.<a class="code" href="structDiagonalOp.html#ada3bffa8e414f883e415dd74e46cd879">numChunks</a> = env.<a class="code" href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">numRanks</a>;</div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  </div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  <span class="comment">// allocate CPU memory (initialised to zero)</span></div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  op.<a class="code" href="structDiagonalOp.html#a1d66088bed235d524cd452b107694d5c">real</a> = (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*) calloc(op.<a class="code" href="structDiagonalOp.html#a2c6eab631ef48b4978db026c98180eee">numElemsPerChunk</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>));</div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  op.<a class="code" href="structDiagonalOp.html#a85c3f52533efe831bbe40b9a48602388">imag</a> = (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*) calloc(op.<a class="code" href="structDiagonalOp.html#a2c6eab631ef48b4978db026c98180eee">numElemsPerChunk</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>));</div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <span class="comment">// @TODO no handling of rank>1 allocation (no distributed GPU)</span></div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  </div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  <span class="comment">// check cpu memory allocation was successful</span></div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  <span class="keywordflow">if</span> ( !op.<a class="code" href="structDiagonalOp.html#a1d66088bed235d524cd452b107694d5c">real</a> || !op.<a class="code" href="structDiagonalOp.html#a85c3f52533efe831bbe40b9a48602388">imag</a> ) {</div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  printf(<span class="stringliteral">"Could not allocate memory!\n"</span>);</div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  exit(EXIT_FAILURE);</div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  }</div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  </div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <span class="comment">// allocate GPU memory</span></div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  <span class="keywordtype">size_t</span> arrSize = op.<a class="code" href="structDiagonalOp.html#a2c6eab631ef48b4978db026c98180eee">numElemsPerChunk</a> * <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  cudaMalloc(&(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real), arrSize);</div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  cudaMalloc(&(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag), arrSize);</div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  </div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  <span class="comment">// check gpu memory allocation was successful</span></div>
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <span class="keywordflow">if</span> (!op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real || !op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag) {</div>
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  printf(<span class="stringliteral">"Could not allocate memory on GPU!\n"</span>);</div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  exit(EXIT_FAILURE);</div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  }</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>  <span class="comment">// initialise GPU memory to zero</span></div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  cudaMemset(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real, 0, arrSize);</div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  cudaMemset(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag, 0, arrSize);</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>  <span class="keywordflow">return</span> op;</div>
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00306">DiagonalOp::chunkId</a>, <a class="el" href="QuEST_8h_source.html#l00312">DiagonalOp::deviceOperator</a>, <a class="el" href="QuEST_8h_source.html#l00310">DiagonalOp::imag</a>, <a class="el" href="QuEST_8h_source.html#l00304">DiagonalOp::numChunks</a>, <a class="el" href="QuEST_8h_source.html#l00302">DiagonalOp::numElemsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00300">DiagonalOp::numQubits</a>, <a class="el" href="QuEST_8h_source.html#l00365">QuESTEnv::numRanks</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST_8h_source.html#l00364">QuESTEnv::rank</a>, and <a class="el" href="QuEST_8h_source.html#l00308">DiagonalOp::real</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01518">createDiagonalOp()</a>, and <a class="el" href="QuEST_8c_source.html#l01558">createDiagonalOpFromPauliHamilFile()</a>.</p>
</div>
</div>
<a id="af798bb01f922804016c4c5bc8d0a580f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af798bb01f922804016c4c5bc8d0a580f">◆ </a></span>agnostic_destroyDiagonalOp()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void agnostic_destroyDiagonalOp </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structDiagonalOp.html">DiagonalOp</a> </td>
<td class="paramname"><em>op</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00375">375</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  free(op.<a class="code" href="structDiagonalOp.html#a1d66088bed235d524cd452b107694d5c">real</a>);</div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  free(op.<a class="code" href="structDiagonalOp.html#a85c3f52533efe831bbe40b9a48602388">imag</a>);</div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  cudaFree(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real);</div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  cudaFree(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag);</div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00312">DiagonalOp::deviceOperator</a>, <a class="el" href="QuEST_8h_source.html#l00310">DiagonalOp::imag</a>, and <a class="el" href="QuEST_8h_source.html#l00308">DiagonalOp::real</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01524">destroyDiagonalOp()</a>.</p>
</div>
</div>
<a id="a81a87bb0f0805c9dfcb691f6cb15a1b5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a81a87bb0f0805c9dfcb691f6cb15a1b5">◆ </a></span>agnostic_initDiagonalOpFromPauliHamil()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void agnostic_initDiagonalOpFromPauliHamil </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structDiagonalOp.html">DiagonalOp</a> </td>
<td class="paramname"><em>op</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structPauliHamil.html">PauliHamil</a> </td>
<td class="paramname"><em>hamil</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00418">418</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  {</div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  </div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <span class="comment">// copy args intop GPU memory</span></div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  <span class="keyword">enum</span> <a class="code" href="group__type.html#ga1c703cf89629e4e9c7023cd402d67028">pauliOpType</a>* d_pauliCodes;</div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  <span class="keywordtype">size_t</span> mem_pauliCodes = hamil.<a class="code" href="structPauliHamil.html#a737e46b40ef8990cf004d22eb9dbe2e4">numSumTerms</a> * op.<a class="code" href="structDiagonalOp.html#a5131eeb67aafb4c19ac98270c3266742">numQubits</a> * <span class="keyword">sizeof</span> *d_pauliCodes;</div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  cudaMalloc(&d_pauliCodes, mem_pauliCodes);</div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  cudaMemcpy(d_pauliCodes, hamil.<a class="code" href="structPauliHamil.html#a4b8d38c403553c07ceddcd40c46ce6c8">pauliCodes</a>, mem_pauliCodes, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  </div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_termCoeffs;</div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <span class="keywordtype">size_t</span> mem_termCoeffs = hamil.<a class="code" href="structPauliHamil.html#a737e46b40ef8990cf004d22eb9dbe2e4">numSumTerms</a> * <span class="keyword">sizeof</span> *d_termCoeffs;</div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  cudaMalloc(&d_termCoeffs, mem_termCoeffs);</div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  cudaMemcpy(d_termCoeffs, hamil.<a class="code" href="structPauliHamil.html#ac1c6c9f6299cf83bbba88123216c3cac">termCoeffs</a>, mem_termCoeffs, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  </div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  <span class="keywordtype">int</span> numThreadsPerBlock = 128;</div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <span class="keywordtype">int</span> numBlocks = ceil(op.<a class="code" href="structDiagonalOp.html#a2c6eab631ef48b4978db026c98180eee">numElemsPerChunk</a> / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) numThreadsPerBlock);</div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  agnostic_initDiagonalOpFromPauliHamilKernel<<<numBlocks, numThreadsPerBlock>>>(</div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  op, d_pauliCodes, d_termCoeffs, hamil.<a class="code" href="structPauliHamil.html#a737e46b40ef8990cf004d22eb9dbe2e4">numSumTerms</a>);</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>  <span class="comment">// copy populated operator into to RAM</span></div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  cudaDeviceSynchronize();</div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  <span class="keywordtype">size_t</span> mem_elems = op.numElemsPerChunk * <span class="keyword">sizeof</span> *op.real;</div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  cudaMemcpy(op.real, op.deviceOperator.real, mem_elems, cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  cudaMemcpy(op.imag, op.deviceOperator.imag, mem_elems, cudaMemcpyDeviceToHost);</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>  cudaFree(d_pauliCodes);</div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  cudaFree(d_termCoeffs);</div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00302">DiagonalOp::numElemsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00300">DiagonalOp::numQubits</a>, <a class="el" href="QuEST_8h_source.html#l00285">PauliHamil::numSumTerms</a>, <a class="el" href="QuEST_8h_source.html#l00281">PauliHamil::pauliCodes</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00283">PauliHamil::termCoeffs</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01558">createDiagonalOpFromPauliHamilFile()</a>, and <a class="el" href="QuEST_8c_source.html#l01550">initDiagonalOpFromPauliHamil()</a>.</p>
</div>
</div>
<a id="a9bf24d5da6a5e78888c393a73fe45f0a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9bf24d5da6a5e78888c393a73fe45f0a">◆ </a></span>agnostic_initDiagonalOpFromPauliHamilKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void agnostic_initDiagonalOpFromPauliHamilKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structDiagonalOp.html">DiagonalOp</a> </td>
<td class="paramname"><em>op</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">enum <a class="el" href="group__type.html#ga1c703cf89629e4e9c7023cd402d67028">pauliOpType</a> * </td>
<td class="paramname"><em>pauliCodes</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>termCoeffs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numSumTerms</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00389">389</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  <span class="comment">// each thread processes one diagonal element</span></div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> elemInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <span class="keywordflow">if</span> (elemInd >= op.<a class="code" href="structDiagonalOp.html#a2c6eab631ef48b4978db026c98180eee">numElemsPerChunk</a>)</div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  <span class="keywordflow">return</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"> 397</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> elem = 0;</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="comment">// elem is (+-) every coefficient, with sign determined by parity</span></div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t=0; t<numSumTerms; t++) {</div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  </div>
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  <span class="comment">// determine the parity of the Z-targeted qubits in the element's corresponding state</span></div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  <span class="keywordtype">int</span> isOddNumOnes = 0;</div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> q=0; q<op.<a class="code" href="structDiagonalOp.html#a5131eeb67aafb4c19ac98270c3266742">numQubits</a>; q++)</div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  <span class="keywordflow">if</span> (pauliCodes[q + t*op.<a class="code" href="structDiagonalOp.html#a5131eeb67aafb4c19ac98270c3266742">numQubits</a>] == <a class="code" href="group__type.html#gga1c703cf89629e4e9c7023cd402d67028a085c85cff6ba79c52d8b1e61c42ddddf">PAULI_Z</a>)</div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(q, elemInd))</div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  isOddNumOnes = !isOddNumOnes;</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>  <span class="comment">// avoid warp divergence</span></div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <span class="keywordtype">int</span> sign = 1 - 2*isOddNumOnes; <span class="comment">// (-1 if isOddNumOnes, else +1)</span></div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  elem += termCoeffs[t] * sign;</div>
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  }</div>
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  </div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real[elemInd] = elem;</div>
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag[elemInd] = 0;</div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00312">DiagonalOp::deviceOperator</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00302">DiagonalOp::numElemsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00300">DiagonalOp::numQubits</a>, <a class="el" href="QuEST_8h_source.html#l00096">PAULI_Z</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="ab58d6d599c7a729255b1f8eeded663f3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab58d6d599c7a729255b1f8eeded663f3">◆ </a></span>agnostic_setDiagonalOpElems()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void agnostic_setDiagonalOpElems </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structDiagonalOp.html">DiagonalOp</a> </td>
<td class="paramname"><em>op</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>startInd</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>real</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>imag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numElems</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03503">3503</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03503"></a><span class="lineno"> 3503</span>  {</div>
<div class="line"><a name="l03504"></a><span class="lineno"> 3504</span>  </div>
<div class="line"><a name="l03505"></a><span class="lineno"> 3505</span>  <span class="comment">// update both RAM and VRAM, for consistency</span></div>
<div class="line"><a name="l03506"></a><span class="lineno"> 3506</span>  memcpy(&op.<a class="code" href="structDiagonalOp.html#a1d66088bed235d524cd452b107694d5c">real</a>[startInd], real, numElems * <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>));</div>
<div class="line"><a name="l03507"></a><span class="lineno"> 3507</span>  memcpy(&op.<a class="code" href="structDiagonalOp.html#a85c3f52533efe831bbe40b9a48602388">imag</a>[startInd], imag, numElems * <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>));</div>
<div class="line"><a name="l03508"></a><span class="lineno"> 3508</span>  </div>
<div class="line"><a name="l03509"></a><span class="lineno"> 3509</span>  cudaDeviceSynchronize();</div>
<div class="line"><a name="l03510"></a><span class="lineno"> 3510</span>  cudaMemcpy(</div>
<div class="line"><a name="l03511"></a><span class="lineno"> 3511</span>  op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real + startInd, </div>
<div class="line"><a name="l03512"></a><span class="lineno"> 3512</span>  real,</div>
<div class="line"><a name="l03513"></a><span class="lineno"> 3513</span>  numElems * <span class="keyword">sizeof</span>(*(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real)), </div>
<div class="line"><a name="l03514"></a><span class="lineno"> 3514</span>  cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03515"></a><span class="lineno"> 3515</span>  cudaMemcpy(</div>
<div class="line"><a name="l03516"></a><span class="lineno"> 3516</span>  op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag + startInd,</div>
<div class="line"><a name="l03517"></a><span class="lineno"> 3517</span>  imag,</div>
<div class="line"><a name="l03518"></a><span class="lineno"> 3518</span>  numElems * <span class="keyword">sizeof</span>(*(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag)), </div>
<div class="line"><a name="l03519"></a><span class="lineno"> 3519</span>  cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03520"></a><span class="lineno"> 3520</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00312">DiagonalOp::deviceOperator</a>, <a class="el" href="QuEST_8h_source.html#l00310">DiagonalOp::imag</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00308">DiagonalOp::real</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01537">initDiagonalOp()</a>, and <a class="el" href="QuEST_8c_source.html#l01543">setDiagonalOpElems()</a>.</p>
</div>
</div>
<a id="a1e8f917ab42d38d8c37ba6816b24f2f5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1e8f917ab42d38d8c37ba6816b24f2f5">◆ </a></span>agnostic_syncDiagonalOp()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void agnostic_syncDiagonalOp </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structDiagonalOp.html">DiagonalOp</a> </td>
<td class="paramname"><em>op</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00382">382</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  {</div>
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  cudaDeviceSynchronize();</div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  <span class="keywordtype">size_t</span> mem_elems = op.<a class="code" href="structDiagonalOp.html#a2c6eab631ef48b4978db026c98180eee">numElemsPerChunk</a> * <span class="keyword">sizeof</span> *op.<a class="code" href="structDiagonalOp.html#a1d66088bed235d524cd452b107694d5c">real</a>;</div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  cudaMemcpy(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real, op.<a class="code" href="structDiagonalOp.html#a1d66088bed235d524cd452b107694d5c">real</a>, mem_elems, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  cudaMemcpy(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag, op.<a class="code" href="structDiagonalOp.html#a85c3f52533efe831bbe40b9a48602388">imag</a>, mem_elems, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00312">DiagonalOp::deviceOperator</a>, <a class="el" href="QuEST_8h_source.html#l00310">DiagonalOp::imag</a>, <a class="el" href="QuEST_8h_source.html#l00302">DiagonalOp::numElemsPerChunk</a>, and <a class="el" href="QuEST_8h_source.html#l00308">DiagonalOp::real</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01531">syncDiagonalOp()</a>.</p>
</div>
</div>
<a id="aea20d173141544e6c5359955a1fbe997"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aea20d173141544e6c5359955a1fbe997">◆ </a></span>copySharedReduceBlock()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void copySharedReduceBlock </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>arrayIn</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>length</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01951">1951</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>  <span class="keywordtype">int</span> blockOffset = blockIdx.x*length;</div>
<div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>  tempReductionArray[threadIdx.x*2] = arrayIn[blockOffset + threadIdx.x*2];</div>
<div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>  tempReductionArray[threadIdx.x*2+1] = arrayIn[blockOffset + threadIdx.x*2+1];</div>
<div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>  __syncthreads();</div>
<div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, length);</div>
<div class="line"><a name="l01958"></a><span class="lineno"> 1958</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01932">reduceBlock()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l03412">densmatr_calcExpecDiagonalOp()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02519">densmatr_calcFidelity()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02593">densmatr_calcHilbertSchmidtDistance()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02313">densmatr_calcInnerProduct()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02664">densmatr_calcPurity()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02064">densmatr_findProbabilityOfZero()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l03276">statevec_calcExpecDiagonalOp()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02393">statevec_calcInnerProduct()</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l02112">statevec_findProbabilityOfZero()</a>.</p>
</div>
</div>
<a id="aedd7ecccf2f09dd2f1c5d191950b51e6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aedd7ecccf2f09dd2f1c5d191950b51e6">◆ </a></span>densmatr_applyDiagonalOp()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_applyDiagonalOp </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structDiagonalOp.html">DiagonalOp</a> </td>
<td class="paramname"><em>op</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03240">3240</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03240"></a><span class="lineno"> 3240</span>  {</div>
<div class="line"><a name="l03241"></a><span class="lineno"> 3241</span>  </div>
<div class="line"><a name="l03242"></a><span class="lineno"> 3242</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l03243"></a><span class="lineno"> 3243</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l03244"></a><span class="lineno"> 3244</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="l03245"></a><span class="lineno"> 3245</span>  densmatr_applyDiagonalOpKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, op);</div>
<div class="line"><a name="l03246"></a><span class="lineno"> 3246</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01127">applyDiagonalOp()</a>.</p>
</div>
</div>
<a id="ac26cd978b61d5c9a23be9f0aceb96ced"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac26cd978b61d5c9a23be9f0aceb96ced">◆ </a></span>densmatr_applyDiagonalOpKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_applyDiagonalOpKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structDiagonalOp.html">DiagonalOp</a> </td>
<td class="paramname"><em>op</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03217">3217</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03217"></a><span class="lineno"> 3217</span>  {</div>
<div class="line"><a name="l03218"></a><span class="lineno"> 3218</span>  </div>
<div class="line"><a name="l03219"></a><span class="lineno"> 3219</span>  <span class="comment">// each thread modifies one value; a wasteful and inefficient strategy</span></div>
<div class="line"><a name="l03220"></a><span class="lineno"> 3220</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>;</div>
<div class="line"><a name="l03221"></a><span class="lineno"> 3221</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="l03222"></a><span class="lineno"> 3222</span>  <span class="keywordflow">if</span> (thisTask >= numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03223"></a><span class="lineno"> 3223</span>  </div>
<div class="line"><a name="l03224"></a><span class="lineno"> 3224</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateRe = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l03225"></a><span class="lineno"> 3225</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateIm = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l03226"></a><span class="lineno"> 3226</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* opRe = op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real;</div>
<div class="line"><a name="l03227"></a><span class="lineno"> 3227</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* opIm = op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag;</div>
<div class="line"><a name="l03228"></a><span class="lineno"> 3228</span>  </div>
<div class="line"><a name="l03229"></a><span class="lineno"> 3229</span>  <span class="keywordtype">int</span> opDim = (1 << op.<a class="code" href="structDiagonalOp.html#a5131eeb67aafb4c19ac98270c3266742">numQubits</a>);</div>
<div class="line"><a name="l03230"></a><span class="lineno"> 3230</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> a = stateRe[thisTask];</div>
<div class="line"><a name="l03231"></a><span class="lineno"> 3231</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> b = stateIm[thisTask];</div>
<div class="line"><a name="l03232"></a><span class="lineno"> 3232</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> c = opRe[thisTask % opDim];</div>
<div class="line"><a name="l03233"></a><span class="lineno"> 3233</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> d = opIm[thisTask % opDim];</div>
<div class="line"><a name="l03234"></a><span class="lineno"> 3234</span>  </div>
<div class="line"><a name="l03235"></a><span class="lineno"> 3235</span>  <span class="comment">// (a + b i)(c + d i) = (a c - b d) + i (a d + b c)</span></div>
<div class="line"><a name="l03236"></a><span class="lineno"> 3236</span>  stateRe[thisTask] = a*c - b*d;</div>
<div class="line"><a name="l03237"></a><span class="lineno"> 3237</span>  stateIm[thisTask] = a*d + b*c;</div>
<div class="line"><a name="l03238"></a><span class="lineno"> 3238</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00312">DiagonalOp::deviceOperator</a>, <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00300">DiagonalOp::numQubits</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a70e3b0a2297c186d5c779af31459b4ca"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a70e3b0a2297c186d5c779af31459b4ca">◆ </a></span>densmatr_calcExpecDiagonalOp()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="structComplex.html">Complex</a> densmatr_calcExpecDiagonalOp </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structDiagonalOp.html">DiagonalOp</a> </td>
<td class="paramname"><em>op</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03412">3412</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03412"></a><span class="lineno"> 3412</span>  {</div>
<div class="line"><a name="l03413"></a><span class="lineno"> 3413</span>  </div>
<div class="line"><a name="l03414"></a><span class="lineno"> 3414</span>  <span class="comment">/* @TODO: remove all this reduction boilerplate from QuEST GPU </span></div>
<div class="line"><a name="l03415"></a><span class="lineno"> 3415</span> <span class="comment"> * (e.g. a func which accepts a pointer to do every-value reduction?)</span></div>
<div class="line"><a name="l03416"></a><span class="lineno"> 3416</span> <span class="comment"> */</span></div>
<div class="line"><a name="l03417"></a><span class="lineno"> 3417</span>  </div>
<div class="line"><a name="l03418"></a><span class="lineno"> 3418</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> expecReal, expecImag;</div>
<div class="line"><a name="l03419"></a><span class="lineno"> 3419</span>  </div>
<div class="line"><a name="l03420"></a><span class="lineno"> 3420</span>  <span class="keywordtype">int</span> getRealComp;</div>
<div class="line"><a name="l03421"></a><span class="lineno"> 3421</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce;</div>
<div class="line"><a name="l03422"></a><span class="lineno"> 3422</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l03423"></a><span class="lineno"> 3423</span>  <span class="keywordtype">int</span> maxReducedPerLevel;</div>
<div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>  <span class="keywordtype">int</span> firstTime;</div>
<div class="line"><a name="l03425"></a><span class="lineno"> 3425</span>  </div>
<div class="line"><a name="l03426"></a><span class="lineno"> 3426</span>  <span class="comment">// compute real component of inner product</span></div>
<div class="line"><a name="l03427"></a><span class="lineno"> 3427</span>  getRealComp = 1;</div>
<div class="line"><a name="l03428"></a><span class="lineno"> 3428</span>  numValuesToReduce = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03429"></a><span class="lineno"> 3429</span>  maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l03430"></a><span class="lineno"> 3430</span>  firstTime = 1;</div>
<div class="line"><a name="l03431"></a><span class="lineno"> 3431</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l03432"></a><span class="lineno"> 3432</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l03433"></a><span class="lineno"> 3433</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l03434"></a><span class="lineno"> 3434</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l03435"></a><span class="lineno"> 3435</span>  }</div>
<div class="line"><a name="l03436"></a><span class="lineno"> 3436</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03437"></a><span class="lineno"> 3437</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l03438"></a><span class="lineno"> 3438</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l03439"></a><span class="lineno"> 3439</span>  }</div>
<div class="line"><a name="l03440"></a><span class="lineno"> 3440</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l03441"></a><span class="lineno"> 3441</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l03442"></a><span class="lineno"> 3442</span>  densmatr_calcExpecDiagonalOpKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l03443"></a><span class="lineno"> 3443</span>  getRealComp,</div>
<div class="line"><a name="l03444"></a><span class="lineno"> 3444</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="l03445"></a><span class="lineno"> 3445</span>  op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real, op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag, </div>
<div class="line"><a name="l03446"></a><span class="lineno"> 3446</span>  op.<a class="code" href="structDiagonalOp.html#a5131eeb67aafb4c19ac98270c3266742">numQubits</a>, numValuesToReduce, </div>
<div class="line"><a name="l03447"></a><span class="lineno"> 3447</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l03448"></a><span class="lineno"> 3448</span>  firstTime = 0;</div>
<div class="line"><a name="l03449"></a><span class="lineno"> 3449</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03450"></a><span class="lineno"> 3450</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l03451"></a><span class="lineno"> 3451</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l03452"></a><span class="lineno"> 3452</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l03453"></a><span class="lineno"> 3453</span>  qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l03454"></a><span class="lineno"> 3454</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l03455"></a><span class="lineno"> 3455</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="l03456"></a><span class="lineno"> 3456</span>  }</div>
<div class="line"><a name="l03457"></a><span class="lineno"> 3457</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l03458"></a><span class="lineno"> 3458</span>  }</div>
<div class="line"><a name="l03459"></a><span class="lineno"> 3459</span>  cudaMemcpy(&expecReal, 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="l03460"></a><span class="lineno"> 3460</span>  </div>
<div class="line"><a name="l03461"></a><span class="lineno"> 3461</span>  <span class="comment">// compute imag component of inner product</span></div>
<div class="line"><a name="l03462"></a><span class="lineno"> 3462</span>  getRealComp = 0;</div>
<div class="line"><a name="l03463"></a><span class="lineno"> 3463</span>  numValuesToReduce = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03464"></a><span class="lineno"> 3464</span>  maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l03465"></a><span class="lineno"> 3465</span>  firstTime = 1;</div>
<div class="line"><a name="l03466"></a><span class="lineno"> 3466</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l03467"></a><span class="lineno"> 3467</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l03468"></a><span class="lineno"> 3468</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l03469"></a><span class="lineno"> 3469</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l03470"></a><span class="lineno"> 3470</span>  }</div>
<div class="line"><a name="l03471"></a><span class="lineno"> 3471</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03472"></a><span class="lineno"> 3472</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l03473"></a><span class="lineno"> 3473</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l03474"></a><span class="lineno"> 3474</span>  }</div>
<div class="line"><a name="l03475"></a><span class="lineno"> 3475</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l03476"></a><span class="lineno"> 3476</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l03477"></a><span class="lineno"> 3477</span>  densmatr_calcExpecDiagonalOpKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l03478"></a><span class="lineno"> 3478</span>  getRealComp,</div>
<div class="line"><a name="l03479"></a><span class="lineno"> 3479</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="l03480"></a><span class="lineno"> 3480</span>  op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real, op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag, </div>
<div class="line"><a name="l03481"></a><span class="lineno"> 3481</span>  op.<a class="code" href="structDiagonalOp.html#a5131eeb67aafb4c19ac98270c3266742">numQubits</a>, numValuesToReduce, </div>
<div class="line"><a name="l03482"></a><span class="lineno"> 3482</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l03483"></a><span class="lineno"> 3483</span>  firstTime = 0;</div>
<div class="line"><a name="l03484"></a><span class="lineno"> 3484</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03485"></a><span class="lineno"> 3485</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l03486"></a><span class="lineno"> 3486</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l03487"></a><span class="lineno"> 3487</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l03488"></a><span class="lineno"> 3488</span>  qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l03489"></a><span class="lineno"> 3489</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l03490"></a><span class="lineno"> 3490</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="l03491"></a><span class="lineno"> 3491</span>  }</div>
<div class="line"><a name="l03492"></a><span class="lineno"> 3492</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l03493"></a><span class="lineno"> 3493</span>  }</div>
<div class="line"><a name="l03494"></a><span class="lineno"> 3494</span>  cudaMemcpy(&expecImag, 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="l03495"></a><span class="lineno"> 3495</span>  </div>
<div class="line"><a name="l03496"></a><span class="lineno"> 3496</span>  <span class="comment">// return complex</span></div>
<div class="line"><a name="l03497"></a><span class="lineno"> 3497</span>  <a class="code" href="structComplex.html">Complex</a> expecVal;</div>
<div class="line"><a name="l03498"></a><span class="lineno"> 3498</span>  expecVal.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a> = expecReal;</div>
<div class="line"><a name="l03499"></a><span class="lineno"> 3499</span>  expecVal.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a> = expecImag;</div>
<div class="line"><a name="l03500"></a><span class="lineno"> 3500</span>  <span class="keywordflow">return</span> expecVal;</div>
<div class="line"><a name="l03501"></a><span class="lineno"> 3501</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l01951">copySharedReduceBlock()</a>, <a class="el" href="QuEST_8h_source.html#l00312">DiagonalOp::deviceOperator</a>, <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::firstLevelReduction</a>, <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00300">DiagonalOp::numQubits</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00019">REDUCE_SHARED_SIZE</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::secondLevelReduction</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l02057">swapDouble()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01228">calcExpecDiagonalOp()</a>.</p>
</div>
</div>
<a id="aecc4bcc79c74153d924edfd2edb930cf"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aecc4bcc79c74153d924edfd2edb930cf">◆ </a></span>densmatr_calcExpecDiagonalOpKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_calcExpecDiagonalOpKernel </td>
<td>(</td>
<td class="paramtype">int </td>
<td class="paramname"><em>getRealComp</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>matReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>matImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>opReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>opImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numTermsToSum</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>if the thread represents a diagonal op, then it computes either a real or imag term of matr_{ii} op_i. Otherwise, it writes a 0 to the reduction array</p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03367">3367</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03371"></a><span class="lineno"> 3371</span> {</div>
<div class="line"><a name="l03377"></a><span class="lineno"> 3377</span>  <span class="comment">// index will identy one of the 2^Q diagonals to be summed</span></div>
<div class="line"><a name="l03378"></a><span class="lineno"> 3378</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> matInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l03379"></a><span class="lineno"> 3379</span>  <span class="keywordflow">if</span> (matInd >= numTermsToSum) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03380"></a><span class="lineno"> 3380</span>  </div>
<div class="line"><a name="l03381"></a><span class="lineno"> 3381</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> diagSpacing = (1LL << numQubits) + 1LL;</div>
<div class="line"><a name="l03382"></a><span class="lineno"> 3382</span>  <span class="keywordtype">int</span> isDiag = ((matInd % diagSpacing) == 0);</div>
<div class="line"><a name="l03383"></a><span class="lineno"> 3383</span>  </div>
<div class="line"><a name="l03384"></a><span class="lineno"> 3384</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> opInd = matInd / diagSpacing;</div>
<div class="line"><a name="l03385"></a><span class="lineno"> 3385</span>  </div>
<div class="line"><a name="l03386"></a><span class="lineno"> 3386</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> val = 0;</div>
<div class="line"><a name="l03387"></a><span class="lineno"> 3387</span>  <span class="keywordflow">if</span> (isDiag) {</div>
<div class="line"><a name="l03388"></a><span class="lineno"> 3388</span>  </div>
<div class="line"><a name="l03389"></a><span class="lineno"> 3389</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> matRe = matReal[matInd];</div>
<div class="line"><a name="l03390"></a><span class="lineno"> 3390</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> matIm = matImag[matInd];</div>
<div class="line"><a name="l03391"></a><span class="lineno"> 3391</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> opRe = opReal[opInd];</div>
<div class="line"><a name="l03392"></a><span class="lineno"> 3392</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> opIm = opImag[opInd];</div>
<div class="line"><a name="l03393"></a><span class="lineno"> 3393</span>  </div>
<div class="line"><a name="l03394"></a><span class="lineno"> 3394</span>  <span class="comment">// (matRe + matIm i)(opRe + opIm i) = </span></div>
<div class="line"><a name="l03395"></a><span class="lineno"> 3395</span>  <span class="comment">// (matRe opRe - matIm opIm) + i (matRe opIm + matIm opRe)</span></div>
<div class="line"><a name="l03396"></a><span class="lineno"> 3396</span>  <span class="keywordflow">if</span> (getRealComp)</div>
<div class="line"><a name="l03397"></a><span class="lineno"> 3397</span>  val = matRe * opRe - matIm * opIm;</div>
<div class="line"><a name="l03398"></a><span class="lineno"> 3398</span>  <span class="keywordflow">else</span> </div>
<div class="line"><a name="l03399"></a><span class="lineno"> 3399</span>  val = matRe * opIm + matIm * opRe;</div>
<div class="line"><a name="l03400"></a><span class="lineno"> 3400</span>  }</div>
<div class="line"><a name="l03401"></a><span class="lineno"> 3401</span>  </div>
<div class="line"><a name="l03402"></a><span class="lineno"> 3402</span>  <span class="comment">// array of each thread's collected sum term, to be summed</span></div>
<div class="line"><a name="l03403"></a><span class="lineno"> 3403</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l03404"></a><span class="lineno"> 3404</span>  tempReductionArray[threadIdx.x] = val;</div>
<div class="line"><a name="l03405"></a><span class="lineno"> 3405</span>  __syncthreads();</div>
<div class="line"><a name="l03406"></a><span class="lineno"> 3406</span>  </div>
<div class="line"><a name="l03407"></a><span class="lineno"> 3407</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l03408"></a><span class="lineno"> 3408</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l03409"></a><span class="lineno"> 3409</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l03410"></a><span class="lineno"> 3410</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01932">reduceBlock()</a>.</p>
</div>
</div>
<a id="aa6c3f86010ad398f42b0577ea3bb5bcf"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa6c3f86010ad398f42b0577ea3bb5bcf">◆ </a></span>densmatr_calcFidelity()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densmatr_calcFidelity </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>pureState</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02519">2519</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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"> 2521</span>  <span class="comment">// we're summing the square of every term in the density matrix</span></div>
<div class="line"><a name="l02522"></a><span class="lineno"> 2522</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="l02523"></a><span class="lineno"> 2523</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce = densityDim;</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> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02526"></a><span class="lineno"> 2526</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="l02527"></a><span class="lineno"> 2527</span>  <span class="keywordtype">int</span> firstTime = 1;</div>
<div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>  </div>
<div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</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>  <span class="comment">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02533"></a><span class="lineno"> 2533</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02534"></a><span class="lineno"> 2534</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>  }</div>
<div class="line"><a name="l02536"></a><span class="lineno"> 2536</span>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02538"></a><span class="lineno"> 2538</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l02539"></a><span class="lineno"> 2539</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02540"></a><span class="lineno"> 2540</span>  }</div>
<div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>  <span class="comment">// dictates size of reduction array</span></div>
<div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>  </div>
<div class="line"><a name="l02544"></a><span class="lineno"> 2544</span>  <span class="comment">// spawn threads to sum the probs in each block</span></div>
<div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>  <span class="comment">// store the reduction in the pureState array</span></div>
<div class="line"><a name="l02546"></a><span class="lineno"> 2546</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02547"></a><span class="lineno"> 2547</span>  densmatr_calcFidelityKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02548"></a><span class="lineno"> 2548</span>  qureg, pureState, densityDim, pureState.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>  firstTime = 0;</div>
<div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>  </div>
<div class="line"><a name="l02551"></a><span class="lineno"> 2551</span>  <span class="comment">// sum the block probs</span></div>
<div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02555"></a><span class="lineno"> 2555</span>  pureState.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02556"></a><span class="lineno"> 2556</span>  pureState.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02557"></a><span class="lineno"> 2557</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02558"></a><span class="lineno"> 2558</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="l02559"></a><span class="lineno"> 2559</span>  }</div>
<div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>  </div>
<div class="line"><a name="l02561"></a><span class="lineno"> 2561</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02562"></a><span class="lineno"> 2562</span>  }</div>
<div class="line"><a name="l02563"></a><span class="lineno"> 2563</span>  </div>
<div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> fidelity;</div>
<div class="line"><a name="l02565"></a><span class="lineno"> 2565</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="l02566"></a><span class="lineno"> 2566</span>  <span class="keywordflow">return</span> fidelity;</div>
<div class="line"><a name="l02567"></a><span class="lineno"> 2567</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l01951">copySharedReduceBlock()</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::firstLevelReduction</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00019">REDUCE_SHARED_SIZE</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::secondLevelReduction</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l02057">swapDouble()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01191">calcFidelity()</a>.</p>
</div>
</div>
<a id="a090901670793c53a1b08629712b2cdae"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a090901670793c53a1b08629712b2cdae">◆ </a></span>densmatr_calcFidelityKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_calcFidelityKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>dens</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>vec</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>dim</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>computes one term of (vec^*T) dens * vec </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02481">2481</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  </div>
<div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>  <span class="comment">// figure out which density matrix row to consider</span></div>
<div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> col;</div>
<div class="line"><a name="l02485"></a><span class="lineno"> 2485</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="l02486"></a><span class="lineno"> 2486</span>  <span class="keywordflow">if</span> (row >= dim) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>  </div>
<div class="line"><a name="l02488"></a><span class="lineno"> 2488</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="l02489"></a><span class="lineno"> 2489</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="l02490"></a><span class="lineno"> 2490</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="l02491"></a><span class="lineno"> 2491</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="l02492"></a><span class="lineno"> 2492</span>  </div>
<div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>  <span class="comment">// compute the row-th element of the product dens*vec</span></div>
<div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prodReal = 0;</div>
<div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prodImag = 0;</div>
<div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>  <span class="keywordflow">for</span> (col=0LL; col < dim; col++) {</div>
<div class="line"><a name="l02497"></a><span class="lineno"> 2497</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densElemReal = densReal[dim*col + row];</div>
<div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densElemImag = densImag[dim*col + row];</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>  prodReal += densElemReal*vecReal[col] - densElemImag*vecImag[col];</div>
<div class="line"><a name="l02501"></a><span class="lineno"> 2501</span>  prodImag += densElemReal*vecImag[col] + densElemImag*vecReal[col];</div>
<div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>  }</div>
<div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>  </div>
<div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>  <span class="comment">// multiply with row-th elem of (vec^*)</span></div>
<div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> termReal = prodImag*vecImag[row] + prodReal*vecReal[row];</div>
<div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>  </div>
<div class="line"><a name="l02507"></a><span class="lineno"> 2507</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="l02508"></a><span class="lineno"> 2508</span>  <span class="comment">//qreal termImag = prodImag*vecReal[row] - prodReal*vecImag[row];</span></div>
<div class="line"><a name="l02509"></a><span class="lineno"> 2509</span>  </div>
<div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>  tempReductionArray[threadIdx.x] = termReal;</div>
<div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>  __syncthreads();</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>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l02517"></a><span class="lineno"> 2517</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01932">reduceBlock()</a>.</p>
</div>
</div>
<a id="a8c9da88f734b0862f4cce7d819e6d3b5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8c9da88f734b0862f4cce7d819e6d3b5">◆ </a></span>densmatr_calcHilbertSchmidtDistance()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densmatr_calcHilbertSchmidtDistance </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>b</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02593">2593</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  </div>
<div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>  <span class="comment">// we're summing the square of every term in (a-b)</span></div>
<div class="line"><a name="l02596"></a><span class="lineno"> 2596</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="l02597"></a><span class="lineno"> 2597</span>  </div>
<div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02599"></a><span class="lineno"> 2599</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="l02600"></a><span class="lineno"> 2600</span>  <span class="keywordtype">int</span> firstTime = 1;</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="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>  </div>
<div class="line"><a name="l02604"></a><span class="lineno"> 2604</span>  <span class="comment">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l02605"></a><span class="lineno"> 2605</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02606"></a><span class="lineno"> 2606</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02607"></a><span class="lineno"> 2607</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02608"></a><span class="lineno"> 2608</span>  }</div>
<div class="line"><a name="l02609"></a><span class="lineno"> 2609</span>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l02610"></a><span class="lineno"> 2610</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02611"></a><span class="lineno"> 2611</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l02612"></a><span class="lineno"> 2612</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>  }</div>
<div class="line"><a name="l02614"></a><span class="lineno"> 2614</span>  <span class="comment">// dictates size of reduction array</span></div>
<div class="line"><a name="l02615"></a><span class="lineno"> 2615</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02616"></a><span class="lineno"> 2616</span>  </div>
<div class="line"><a name="l02617"></a><span class="lineno"> 2617</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="l02618"></a><span class="lineno"> 2618</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02619"></a><span class="lineno"> 2619</span>  densmatr_calcHilbertSchmidtDistanceSquaredKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02620"></a><span class="lineno"> 2620</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="l02621"></a><span class="lineno"> 2621</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="l02622"></a><span class="lineno"> 2622</span>  numValuesToReduce, a.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02623"></a><span class="lineno"> 2623</span>  firstTime = 0;</div>
<div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>  </div>
<div class="line"><a name="l02625"></a><span class="lineno"> 2625</span>  <span class="comment">// sum the block probs</span></div>
<div class="line"><a name="l02626"></a><span class="lineno"> 2626</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02627"></a><span class="lineno"> 2627</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02628"></a><span class="lineno"> 2628</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02629"></a><span class="lineno"> 2629</span>  a.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02630"></a><span class="lineno"> 2630</span>  a.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02631"></a><span class="lineno"> 2631</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02632"></a><span class="lineno"> 2632</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="l02633"></a><span class="lineno"> 2633</span>  }</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>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02636"></a><span class="lineno"> 2636</span>  }</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>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> trace;</div>
<div class="line"><a name="l02639"></a><span class="lineno"> 2639</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="l02640"></a><span class="lineno"> 2640</span>  </div>
<div class="line"><a name="l02641"></a><span class="lineno"> 2641</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sqrtTrace = sqrt(trace);</div>
<div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>  <span class="keywordflow">return</span> sqrtTrace;</div>
<div class="line"><a name="l02643"></a><span class="lineno"> 2643</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l01951">copySharedReduceBlock()</a>, <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::firstLevelReduction</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00019">REDUCE_SHARED_SIZE</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::secondLevelReduction</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l02057">swapDouble()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01237">calcHilbertSchmidtDistance()</a>.</p>
</div>
</div>
<a id="a8e15b37c8dd7514a5480381699aa82c2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8e15b37c8dd7514a5480381699aa82c2">◆ </a></span>densmatr_calcHilbertSchmidtDistanceSquaredKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_calcHilbertSchmidtDistanceSquaredKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>aRe</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>aIm</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>bRe</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>bIm</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numAmpsToSum</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02569">2569</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  <span class="comment">// figure out which density matrix term this thread is assigned</span></div>
<div class="line"><a name="l02574"></a><span class="lineno"> 2574</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="l02575"></a><span class="lineno"> 2575</span>  <span class="keywordflow">if</span> (index >= numAmpsToSum) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>  </div>
<div class="line"><a name="l02577"></a><span class="lineno"> 2577</span>  <span class="comment">// compute this thread's sum term</span></div>
<div class="line"><a name="l02578"></a><span class="lineno"> 2578</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> difRe = aRe[index] - bRe[index];</div>
<div class="line"><a name="l02579"></a><span class="lineno"> 2579</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> difIm = aIm[index] - bIm[index];</div>
<div class="line"><a name="l02580"></a><span class="lineno"> 2580</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> term = difRe*difRe + difIm*difIm;</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>  <span class="comment">// array of each thread's collected term, to be summed</span></div>
<div class="line"><a name="l02583"></a><span class="lineno"> 2583</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02584"></a><span class="lineno"> 2584</span>  tempReductionArray[threadIdx.x] = term;</div>
<div class="line"><a name="l02585"></a><span class="lineno"> 2585</span>  __syncthreads();</div>
<div class="line"><a name="l02586"></a><span class="lineno"> 2586</span>  </div>
<div class="line"><a name="l02587"></a><span class="lineno"> 2587</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l02588"></a><span class="lineno"> 2588</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l02589"></a><span class="lineno"> 2589</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l02590"></a><span class="lineno"> 2590</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01932">reduceBlock()</a>.</p>
</div>
</div>
<a id="a6ff3dc624b5fafe8edae4fe327c255a0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6ff3dc624b5fafe8edae4fe327c255a0">◆ </a></span>densmatr_calcInnerProduct()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densmatr_calcInnerProduct </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>b</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02313">2313</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>  {</div>
<div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>  </div>
<div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>  <span class="comment">// we're summing the square of every term in the density matrix</span></div>
<div class="line"><a name="l02316"></a><span class="lineno"> 2316</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="l02317"></a><span class="lineno"> 2317</span>  </div>
<div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02319"></a><span class="lineno"> 2319</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="l02320"></a><span class="lineno"> 2320</span>  <span class="keywordtype">int</span> firstTime = 1;</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="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>  </div>
<div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>  <span class="comment">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>  }</div>
<div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>  }</div>
<div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>  <span class="comment">// dictates size of reduction array</span></div>
<div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</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>  <span class="comment">// spawn threads to sum the terms in each block</span></div>
<div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>  <span class="comment">// arbitrarily store the reduction in the b qureg's array</span></div>
<div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>  densmatr_calcInnerProductKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>  a, b, a.<a class="code" href="structQureg.html#adef4935cac95763c29164cf99b144ed4">numAmpsTotal</a>, b.firstLevelReduction);</div>
<div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>  firstTime = 0;</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="comment">// sum the block terms</span></div>
<div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>  b.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>  b.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02351"></a><span class="lineno"> 2351</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="l02352"></a><span class="lineno"> 2352</span>  }</div>
<div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>  </div>
<div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>  }</div>
<div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>  </div>
<div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> innerprod;</div>
<div class="line"><a name="l02358"></a><span class="lineno"> 2358</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="l02359"></a><span class="lineno"> 2359</span>  <span class="keywordflow">return</span> innerprod;</div>
<div class="line"><a name="l02360"></a><span class="lineno"> 2360</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l01951">copySharedReduceBlock()</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::firstLevelReduction</a>, <a class="el" href="QuEST_8h_source.html#l00334">Qureg::numAmpsTotal</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00019">REDUCE_SHARED_SIZE</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::secondLevelReduction</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l02057">swapDouble()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01158">calcDensityInnerProduct()</a>.</p>
</div>
</div>
<a id="a24d53b07592f424e5cc3dcd12f51bf32"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a24d53b07592f424e5cc3dcd12f51bf32">◆ </a></span>densmatr_calcInnerProductKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_calcInnerProductKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>b</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numTermsToSum</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>computes Tr(conjTrans(a) b) = sum of (a_ij^* b_ij), which is a real number </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02292">2292</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>  { </div>
<div class="line"><a name="l02295"></a><span class="lineno"> 2295</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="l02296"></a><span class="lineno"> 2296</span>  <span class="keywordflow">if</span> (index >= numTermsToSum) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>  </div>
<div class="line"><a name="l02298"></a><span class="lineno"> 2298</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="l02299"></a><span class="lineno"> 2299</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prod = (</div>
<div class="line"><a name="l02300"></a><span class="lineno"> 2300</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="l02301"></a><span class="lineno"> 2301</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="l02302"></a><span class="lineno"> 2302</span>  </div>
<div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>  <span class="comment">// array of each thread's collected sum term, to be summed</span></div>
<div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>  tempReductionArray[threadIdx.x] = prod;</div>
<div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>  __syncthreads();</div>
<div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>  </div>
<div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l02311"></a><span class="lineno"> 2311</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01932">reduceBlock()</a>.</p>
</div>
</div>
<a id="a96460613669152314d4680a8603af650"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a96460613669152314d4680a8603af650">◆ </a></span>densmatr_calcProbOfAllOutcomes()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_calcProbOfAllOutcomes </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>outcomeProbs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>qubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numQubits</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02259">2259</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>  {</div>
<div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>  </div>
<div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>  <span class="comment">// copy qubits to GPU memory</span></div>
<div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>  <span class="keywordtype">int</span>* d_qubits;</div>
<div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>  <span class="keywordtype">size_t</span> mem_qubits = numQubits * <span class="keyword">sizeof</span> *d_qubits;</div>
<div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>  cudaMalloc(&d_qubits, mem_qubits);</div>
<div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>  cudaMemcpy(d_qubits, qubits, mem_qubits, cudaMemcpyHostToDevice);</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">// create global array, with per-block subarrays</span></div>
<div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>  <span class="keywordtype">int</span> numThreadsPerBlock = 128;</div>
<div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>  <span class="keywordtype">int</span> numDiags = (1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>  <span class="keywordtype">int</span> numBlocks = ceil(numDiags / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) numThreadsPerBlock);</div>
<div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>  </div>
<div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>  <span class="comment">// create global GPU array for outcomeProbs</span></div>
<div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_outcomeProbs;</div>
<div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numOutcomes = (1LL << numQubits);</div>
<div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>  <span class="keywordtype">size_t</span> mem_outcomeProbs = numOutcomes * <span class="keyword">sizeof</span> *d_outcomeProbs;</div>
<div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>  cudaMalloc(&d_outcomeProbs, mem_outcomeProbs);</div>
<div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>  cudaMemset(d_outcomeProbs, 0, mem_outcomeProbs);</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">// populate per-block subarrays</span></div>
<div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>  densmatr_calcProbOfAllOutcomesKernel<<<numBlocks, numThreadsPerBlock>>>(</div>
<div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>  d_outcomeProbs, qureg, d_qubits, numQubits);</div>
<div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>  </div>
<div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>  <span class="comment">// copy outcomeProbs from GPU memory</span></div>
<div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>  cudaMemcpy(outcomeProbs, d_outcomeProbs, mem_outcomeProbs, cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>  </div>
<div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>  <span class="comment">// free GPU memory</span></div>
<div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>  cudaFree(d_qubits);</div>
<div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>  cudaFree(d_outcomeProbs);</div>
<div class="line"><a name="l02289"></a><span class="lineno"> 2289</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01176">calcProbOfAllOutcomes()</a>.</p>
</div>
</div>
<a id="afcb85940a9f204f77006c3644bd8c13e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afcb85940a9f204f77006c3644bd8c13e">◆ </a></span>densmatr_calcProbOfAllOutcomesKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_calcProbOfAllOutcomesKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>outcomeProbs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>qubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numQubits</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02238">2238</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>  {</div>
<div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>  <span class="comment">// each thread handles one diagonal amplitude</span></div>
<div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> diagInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numDiags = (1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>  <span class="keywordflow">if</span> (diagInd >= numDiags) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>  </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> flatInd = (1 + numDiags)*diagInd;</div>
<div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prob = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[flatInd]; <span class="comment">// im[flatInd] assumed ~ 0</span></div>
<div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>  </div>
<div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>  <span class="comment">// each diagonal amplitude contributes to one outcome</span></div>
<div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> outcomeInd = 0;</div>
<div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> q=0; q<numQubits; q++)</div>
<div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>  outcomeInd += <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[q], diagInd) * (1LL << q);</div>
<div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>  </div>
<div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>  <span class="comment">// each thread atomically writes directly to the global output.</span></div>
<div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>  <span class="comment">// this beat block-heirarchal atomic reductions in both global and shared memory!</span></div>
<div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>  atomicAdd(&outcomeProbs[outcomeInd], prob);</div>
<div class="line"><a name="l02257"></a><span class="lineno"> 2257</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="ae37b3eff5d3affbc1edfe216cabc1c53"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae37b3eff5d3affbc1edfe216cabc1c53">◆ </a></span>densmatr_calcProbOfOutcome()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densmatr_calcProbOfOutcome </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>measureQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>outcome</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02158">2158</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span> {</div>
<div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb = <a class="code" href="QuEST__gpu_8cu.html#a73167d054e4e8e7bfce4e3e8480c292d">densmatr_findProbabilityOfZero</a>(qureg, measureQubit);</div>
<div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>  <span class="keywordflow">if</span> (outcome==1) </div>
<div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>  outcomeProb = 1.0 - outcomeProb;</div>
<div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>  <span class="keywordflow">return</span> outcomeProb;</div>
<div class="line"><a name="l02164"></a><span class="lineno"> 2164</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l02064">densmatr_findProbabilityOfZero()</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01166">calcProbOfOutcome()</a>, <a class="el" href="QuEST_8c_source.html#l00966">collapseToOutcome()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00372">densmatr_measureWithStats()</a>.</p>
</div>
</div>
<a id="ae45eefa65f4ecd37bab84fade7cf7f1f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae45eefa65f4ecd37bab84fade7cf7f1f">◆ </a></span>densmatr_calcPurity()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densmatr_calcPurity </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Computes the trace of the density matrix squared. </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02664">2664</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02664"></a><span class="lineno"> 2664</span>  {</div>
<div class="line"><a name="l02665"></a><span class="lineno"> 2665</span>  </div>
<div class="line"><a name="l02666"></a><span class="lineno"> 2666</span>  <span class="comment">// we're summing the square of every term in the density matrix</span></div>
<div class="line"><a name="l02667"></a><span class="lineno"> 2667</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="l02668"></a><span class="lineno"> 2668</span>  </div>
<div class="line"><a name="l02669"></a><span class="lineno"> 2669</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02670"></a><span class="lineno"> 2670</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="l02671"></a><span class="lineno"> 2671</span>  <span class="keywordtype">int</span> firstTime = 1;</div>
<div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>  </div>
<div class="line"><a name="l02673"></a><span class="lineno"> 2673</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02674"></a><span class="lineno"> 2674</span>  </div>
<div class="line"><a name="l02675"></a><span class="lineno"> 2675</span>  <span class="comment">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l02676"></a><span class="lineno"> 2676</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02677"></a><span class="lineno"> 2677</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02678"></a><span class="lineno"> 2678</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02679"></a><span class="lineno"> 2679</span>  }</div>
<div class="line"><a name="l02680"></a><span class="lineno"> 2680</span>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l02681"></a><span class="lineno"> 2681</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02682"></a><span class="lineno"> 2682</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l02683"></a><span class="lineno"> 2683</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02684"></a><span class="lineno"> 2684</span>  }</div>
<div class="line"><a name="l02685"></a><span class="lineno"> 2685</span>  <span class="comment">// dictates size of reduction array</span></div>
<div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>  </div>
<div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>  <span class="comment">// spawn threads to sum the probs in each block</span></div>
<div class="line"><a name="l02689"></a><span class="lineno"> 2689</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02690"></a><span class="lineno"> 2690</span>  densmatr_calcPurityKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02691"></a><span class="lineno"> 2691</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="l02692"></a><span class="lineno"> 2692</span>  numValuesToReduce, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02693"></a><span class="lineno"> 2693</span>  firstTime = 0;</div>
<div class="line"><a name="l02694"></a><span class="lineno"> 2694</span>  </div>
<div class="line"><a name="l02695"></a><span class="lineno"> 2695</span>  <span class="comment">// sum the block probs</span></div>
<div class="line"><a name="l02696"></a><span class="lineno"> 2696</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02697"></a><span class="lineno"> 2697</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02698"></a><span class="lineno"> 2698</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02699"></a><span class="lineno"> 2699</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02700"></a><span class="lineno"> 2700</span>  qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02701"></a><span class="lineno"> 2701</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02702"></a><span class="lineno"> 2702</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="l02703"></a><span class="lineno"> 2703</span>  }</div>
<div class="line"><a name="l02704"></a><span class="lineno"> 2704</span>  </div>
<div class="line"><a name="l02705"></a><span class="lineno"> 2705</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</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>  </div>
<div class="line"><a name="l02708"></a><span class="lineno"> 2708</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> traceDensSquared;</div>
<div class="line"><a name="l02709"></a><span class="lineno"> 2709</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="l02710"></a><span class="lineno"> 2710</span>  <span class="keywordflow">return</span> traceDensSquared;</div>
<div class="line"><a name="l02711"></a><span class="lineno"> 2711</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l01951">copySharedReduceBlock()</a>, <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::firstLevelReduction</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00019">REDUCE_SHARED_SIZE</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::secondLevelReduction</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l02057">swapDouble()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01185">calcPurity()</a>.</p>
</div>
</div>
<a id="afe005f9f69319901bb56c4d022359ad5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afe005f9f69319901bb56c4d022359ad5">◆ </a></span>densmatr_calcPurityKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_calcPurityKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numAmpsToSum</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02645">2645</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02645"></a><span class="lineno"> 2645</span>  {</div>
<div class="line"><a name="l02646"></a><span class="lineno"> 2646</span>  </div>
<div class="line"><a name="l02647"></a><span class="lineno"> 2647</span>  <span class="comment">// figure out which density matrix term this thread is assigned</span></div>
<div class="line"><a name="l02648"></a><span class="lineno"> 2648</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="l02649"></a><span class="lineno"> 2649</span>  <span class="keywordflow">if</span> (index >= numAmpsToSum) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02650"></a><span class="lineno"> 2650</span>  </div>
<div class="line"><a name="l02651"></a><span class="lineno"> 2651</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="l02652"></a><span class="lineno"> 2652</span>  </div>
<div class="line"><a name="l02653"></a><span class="lineno"> 2653</span>  <span class="comment">// array of each thread's collected probability, to be summed</span></div>
<div class="line"><a name="l02654"></a><span class="lineno"> 2654</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02655"></a><span class="lineno"> 2655</span>  tempReductionArray[threadIdx.x] = term;</div>
<div class="line"><a name="l02656"></a><span class="lineno"> 2656</span>  __syncthreads();</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="comment">// every second thread reduces</span></div>
<div class="line"><a name="l02659"></a><span class="lineno"> 2659</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l02660"></a><span class="lineno"> 2660</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l02661"></a><span class="lineno"> 2661</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01932">reduceBlock()</a>.</p>
</div>
</div>
<a id="a6153547f245c05874161a105e9a2f02c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6153547f245c05874161a105e9a2f02c">◆ </a></span>densmatr_calcTotalProb()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densmatr_calcTotalProb </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01632">1632</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>  {</div>
<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>  </div>
<div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>  <span class="comment">// computes the trace using Kahan summation</span></div>
<div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> pTotal=0;</div>
<div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> y, t, c;</div>
<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>  c = 0;</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="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="l01640"></a><span class="lineno"> 1640</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> diagIndex;</div>
<div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>  </div>
<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(qureg);</div>
<div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>  </div>
<div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> col=0; col< numCols; col++) {</div>
<div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>  diagIndex = col*(numCols + 1);</div>
<div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>  y = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[diagIndex] - c;</div>
<div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>  t = pTotal + y;</div>
<div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>  c = ( t - pTotal ) - y; <span class="comment">// brackets are important</span></div>
<div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>  pTotal = t;</div>
<div class="line"><a name="l01650"></a><span class="lineno"> 1650</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>  <span class="keywordflow">return</span> pTotal;</div>
<div class="line"><a name="l01653"></a><span class="lineno"> 1653</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l00529">copyStateFromGPU()</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01143">calcTotalProb()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00509">statevec_calcExpecPauliProd()</a>.</p>
</div>
</div>
<a id="a5658f2ecbbd4ea425db5f7dc7fc4ba92"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5658f2ecbbd4ea425db5f7dc7fc4ba92">◆ </a></span>densmatr_collapseToKnownProbOutcome()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_collapseToKnownProbOutcome </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>measureQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>outcome</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>outcomeProb</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This involves finding |...i...><...j...| states and killing those where i!=j. </p>
<p>Renorms (/prob) every | * outcome * >< * outcome * | state, setting all others to zero. </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02805">2805</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02805"></a><span class="lineno"> 2805</span>  {</div>
<div class="line"><a name="l02806"></a><span class="lineno"> 2806</span>  </div>
<div class="line"><a name="l02807"></a><span class="lineno"> 2807</span>  <span class="keywordtype">int</span> rowQubit = measureQubit + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02808"></a><span class="lineno"> 2808</span>  </div>
<div class="line"><a name="l02809"></a><span class="lineno"> 2809</span>  <span class="keywordtype">int</span> colBit = 1LL << measureQubit;</div>
<div class="line"><a name="l02810"></a><span class="lineno"> 2810</span>  <span class="keywordtype">int</span> rowBit = 1LL << rowQubit;</div>
<div class="line"><a name="l02811"></a><span class="lineno"> 2811</span>  </div>
<div class="line"><a name="l02812"></a><span class="lineno"> 2812</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="l02813"></a><span class="lineno"> 2813</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="l02814"></a><span class="lineno"> 2814</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="l02815"></a><span class="lineno"> 2815</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="l02816"></a><span class="lineno"> 2816</span>  </div>
<div class="line"><a name="l02817"></a><span class="lineno"> 2817</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> desired, undesired;</div>
<div class="line"><a name="l02818"></a><span class="lineno"> 2818</span>  <span class="keywordflow">if</span> (outcome == 0) {</div>
<div class="line"><a name="l02819"></a><span class="lineno"> 2819</span>  desired = 0;</div>
<div class="line"><a name="l02820"></a><span class="lineno"> 2820</span>  undesired = colBit | rowBit;</div>
<div class="line"><a name="l02821"></a><span class="lineno"> 2821</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02822"></a><span class="lineno"> 2822</span>  desired = colBit | rowBit;</div>
<div class="line"><a name="l02823"></a><span class="lineno"> 2823</span>  undesired = 0;</div>
<div class="line"><a name="l02824"></a><span class="lineno"> 2824</span>  }</div>
<div class="line"><a name="l02825"></a><span class="lineno"> 2825</span>  </div>
<div class="line"><a name="l02826"></a><span class="lineno"> 2826</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02827"></a><span class="lineno"> 2827</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02828"></a><span class="lineno"> 2828</span>  CUDABlocks = ceil(numBasesToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02829"></a><span class="lineno"> 2829</span>  densmatr_collapseToKnownProbOutcomeKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02830"></a><span class="lineno"> 2830</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="l02831"></a><span class="lineno"> 2831</span>  part1, part2, part3, rowBit, colBit, desired, undesired);</div>
<div class="line"><a name="l02832"></a><span class="lineno"> 2832</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00888">applyProjector()</a>, <a class="el" href="QuEST_8c_source.html#l00966">collapseToOutcome()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00372">densmatr_measureWithStats()</a>.</p>
</div>
</div>
<a id="afc4dcedaf429d823f4da83d3521d8293"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afc4dcedaf429d823f4da83d3521d8293">◆ </a></span>densmatr_collapseToKnownProbOutcomeKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_collapseToKnownProbOutcomeKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>outcomeProb</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numBasesToVisit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part3</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>rowBit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>colBit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>desired</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>undesired</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Maps thread ID to a |..0..><..0..| state and then locates |0><1|, |1><0| and |1><1|. </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02779">2779</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02783"></a><span class="lineno"> 2783</span> {</div>
<div class="line"><a name="l02784"></a><span class="lineno"> 2784</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="l02785"></a><span class="lineno"> 2785</span>  <span class="keywordflow">if</span> (scanInd >= numBasesToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02786"></a><span class="lineno"> 2786</span>  </div>
<div class="line"><a name="l02787"></a><span class="lineno"> 2787</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="l02788"></a><span class="lineno"> 2788</span>  </div>
<div class="line"><a name="l02789"></a><span class="lineno"> 2789</span>  <span class="comment">// renormalise desired outcome</span></div>
<div class="line"><a name="l02790"></a><span class="lineno"> 2790</span>  vecReal[base + desired] /= outcomeProb;</div>
<div class="line"><a name="l02791"></a><span class="lineno"> 2791</span>  vecImag[base + desired] /= outcomeProb;</div>
<div class="line"><a name="l02792"></a><span class="lineno"> 2792</span>  </div>
<div class="line"><a name="l02793"></a><span class="lineno"> 2793</span>  <span class="comment">// kill undesired outcome</span></div>
<div class="line"><a name="l02794"></a><span class="lineno"> 2794</span>  vecReal[base + undesired] = 0;</div>
<div class="line"><a name="l02795"></a><span class="lineno"> 2795</span>  vecImag[base + undesired] = 0;</div>
<div class="line"><a name="l02796"></a><span class="lineno"> 2796</span>  </div>
<div class="line"><a name="l02797"></a><span class="lineno"> 2797</span>  <span class="comment">// kill |..0..><..1..| states</span></div>
<div class="line"><a name="l02798"></a><span class="lineno"> 2798</span>  vecReal[base + colBit] = 0;</div>
<div class="line"><a name="l02799"></a><span class="lineno"> 2799</span>  vecImag[base + colBit] = 0;</div>
<div class="line"><a name="l02800"></a><span class="lineno"> 2800</span>  vecReal[base + rowBit] = 0;</div>
<div class="line"><a name="l02801"></a><span class="lineno"> 2801</span>  vecImag[base + rowBit] = 0;</div>
<div class="line"><a name="l02802"></a><span class="lineno"> 2802</span> }</div>
</div><!-- fragment -->
</div>
</div>
<a id="a73167d054e4e8e7bfce4e3e8480c292d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a73167d054e4e8e7bfce4e3e8480c292d">◆ </a></span>densmatr_findProbabilityOfZero()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densmatr_findProbabilityOfZero </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>measureQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02064">2064</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02065"></a><span class="lineno"> 2065</span> {</div>
<div class="line"><a name="l02066"></a><span class="lineno"> 2066</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="l02067"></a><span class="lineno"> 2067</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="l02068"></a><span class="lineno"> 2068</span>  </div>
<div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02070"></a><span class="lineno"> 2070</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="l02071"></a><span class="lineno"> 2071</span>  <span class="keywordtype">int</span> firstTime = 1;</div>
<div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>  </div>
<div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>  </div>
<div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>  <span class="comment">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>  }</div>
<div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>  }</div>
<div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>  </div>
<div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</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="comment">// spawn threads to sum the probs in each block</span></div>
<div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>  densmatr_findProbabilityOfZeroKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>  qureg, measureQubit, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>  firstTime = 0;</div>
<div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>  </div>
<div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>  <span class="comment">// sum the block probs</span></div>
<div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>  qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02101"></a><span class="lineno"> 2101</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="l02102"></a><span class="lineno"> 2102</span>  }</div>
<div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>  </div>
<div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>  }</div>
<div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>  </div>
<div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> zeroProb;</div>
<div class="line"><a name="l02108"></a><span class="lineno"> 2108</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="l02109"></a><span class="lineno"> 2109</span>  <span class="keywordflow">return</span> zeroProb;</div>
<div class="line"><a name="l02110"></a><span class="lineno"> 2110</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l01951">copySharedReduceBlock()</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::firstLevelReduction</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00019">REDUCE_SHARED_SIZE</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::secondLevelReduction</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l02057">swapDouble()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l02158">densmatr_calcProbOfOutcome()</a>.</p>
</div>
</div>
<a id="ab558d79a6d1caa98999255246db6dcf2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab558d79a6d1caa98999255246db6dcf2">◆ </a></span>densmatr_findProbabilityOfZeroKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_findProbabilityOfZeroKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>measureQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01960">1960</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>  {</div>
<div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>  <span class="comment">// run by each thread</span></div>
<div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>  <span class="comment">// use of block here refers to contiguous amplitudes where measureQubit = 0, </span></div>
<div class="line"><a name="l01965"></a><span class="lineno"> 1965</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="l01966"></a><span class="lineno"> 1966</span>  </div>
<div class="line"><a name="l01967"></a><span class="lineno"> 1967</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="l01968"></a><span class="lineno"> 1968</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="l01969"></a><span class="lineno"> 1969</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="l01970"></a><span class="lineno"> 1970</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="l01971"></a><span class="lineno"> 1971</span>  </div>
<div class="line"><a name="l01972"></a><span class="lineno"> 1972</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="l01973"></a><span class="lineno"> 1973</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="l01974"></a><span class="lineno"> 1974</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="l01975"></a><span class="lineno"> 1975</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="l01976"></a><span class="lineno"> 1976</span>  </div>
<div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>  <span class="comment">// array of each thread's collected probability, to be summed</span></div>
<div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>  </div>
<div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>  <span class="comment">// figure out which density matrix prob that this thread is assigned</span></div>
<div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>  basisIndex = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>  densityIndex = (densityDim + 1) * basisIndex;</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>  <span class="comment">// record the probability in the CUDA-BLOCK-wide array</span></div>
<div class="line"><a name="l01988"></a><span class="lineno"> 1988</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="l01989"></a><span class="lineno"> 1989</span>  tempReductionArray[threadIdx.x] = prob;</div>
<div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>  </div>
<div class="line"><a name="l01991"></a><span class="lineno"> 1991</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="l01992"></a><span class="lineno"> 1992</span>  __syncthreads();</div>
<div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2){</div>
<div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>  }</div>
<div class="line"><a name="l01996"></a><span class="lineno"> 1996</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01932">reduceBlock()</a>.</p>
</div>
</div>
<a id="a20a155f53efc45c16803d7539c2c199d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a20a155f53efc45c16803d7539c2c199d">◆ </a></span>densmatr_initClassicalState()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_initClassicalState </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateInd</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00258">258</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00134">initClassicalState()</a>.</p>
</div>
</div>
<a id="a9f4bb112d5e95abb8e35bf051a02a06e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9f4bb112d5e95abb8e35bf051a02a06e">◆ </a></span>densmatr_initClassicalStateKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_initClassicalStateKernel </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>densityNumElems</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>densityReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>densityImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>densityInd</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00239">239</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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><!-- fragment -->
</div>
</div>
<a id="ad5b2ac0b00afa495f385520b2c5fa839"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad5b2ac0b00afa495f385520b2c5fa839">◆ </a></span>densmatr_initPlusState()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_initPlusState </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00226">226</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00125">initPlusState()</a>.</p>
</div>
</div>
<a id="a4cf98d55602d1138a2101c158095afdc"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4cf98d55602d1138a2101c158095afdc">◆ </a></span>densmatr_initPlusStateKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_initPlusStateKernel </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateVecSize</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>probFactor</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecImag</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00216">216</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  {</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><!-- fragment -->
</div>
</div>
<a id="ae5ad68d054875913d0f7ec654840a9ec"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae5ad68d054875913d0f7ec654840a9ec">◆ </a></span>densmatr_initPureState()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_initPureState </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>targetQureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>copyQureg</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00205">205</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00145">initPureState()</a>.</p>
</div>
</div>
<a id="a664339e2afc50b0418a56adfc1bc512e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a664339e2afc50b0418a56adfc1bc512e">◆ </a></span>densmatr_initPureStateKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_initPureStateKernel </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numPureAmps</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>targetVecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>targetVecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>copyVecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>copyVecImag</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00186">186</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="ac501fe7b9d331be48359ce1546348f97"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac501fe7b9d331be48359ce1546348f97">◆ </a></span>densmatr_mixDamping()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixDamping </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>damping</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03048">3048</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03048"></a><span class="lineno"> 3048</span>  {</div>
<div class="line"><a name="l03049"></a><span class="lineno"> 3049</span>  </div>
<div class="line"><a name="l03050"></a><span class="lineno"> 3050</span>  <span class="keywordflow">if</span> (damping == 0)</div>
<div class="line"><a name="l03051"></a><span class="lineno"> 3051</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03052"></a><span class="lineno"> 3052</span>  </div>
<div class="line"><a name="l03053"></a><span class="lineno"> 3053</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephase = sqrt(1-damping);</div>
<div class="line"><a name="l03054"></a><span class="lineno"> 3054</span>  <a class="code" href="QuEST__gpu_8cu.html#a01be2e229994aaffd9f73e966e515fd5">densmatr_oneQubitDegradeOffDiagonal</a>(qureg, targetQubit, dephase);</div>
<div class="line"><a name="l03055"></a><span class="lineno"> 3055</span>  </div>
<div class="line"><a name="l03056"></a><span class="lineno"> 3056</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="l03057"></a><span class="lineno"> 3057</span>  <span class="keywordtype">int</span> rowQubit = targetQubit + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l03058"></a><span class="lineno"> 3058</span>  </div>
<div class="line"><a name="l03059"></a><span class="lineno"> 3059</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="l03060"></a><span class="lineno"> 3060</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="l03061"></a><span class="lineno"> 3061</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="l03062"></a><span class="lineno"> 3062</span>  </div>
<div class="line"><a name="l03063"></a><span class="lineno"> 3063</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="l03064"></a><span class="lineno"> 3064</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="l03065"></a><span class="lineno"> 3065</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="l03066"></a><span class="lineno"> 3066</span>  </div>
<div class="line"><a name="l03067"></a><span class="lineno"> 3067</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l03068"></a><span class="lineno"> 3068</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l03069"></a><span class="lineno"> 3069</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l03070"></a><span class="lineno"> 3070</span>  densmatr_mixDampingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l03071"></a><span class="lineno"> 3071</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="l03072"></a><span class="lineno"> 3072</span>  part1, part2, part3, bothBits);</div>
<div class="line"><a name="l03073"></a><span class="lineno"> 3073</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l02879">densmatr_oneQubitDegradeOffDiagonal()</a>, <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01283">mixDamping()</a>.</p>
</div>
</div>
<a id="a7e0a6e9de648b33168d7f56eba53aa7b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7e0a6e9de648b33168d7f56eba53aa7b">◆ </a></span>densmatr_mixDampingKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_mixDampingKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>damping</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numAmpsToVisit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part3</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>bothBits</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Works like mixDephasing but modifies every other element, and elements are averaged in pairs. </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03001">3001</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03005"></a><span class="lineno"> 3005</span> {</div>
<div class="line"><a name="l03006"></a><span class="lineno"> 3006</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="l03007"></a><span class="lineno"> 3007</span>  <span class="keywordflow">if</span> (scanInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03008"></a><span class="lineno"> 3008</span>  </div>
<div class="line"><a name="l03009"></a><span class="lineno"> 3009</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="l03010"></a><span class="lineno"> 3010</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="l03011"></a><span class="lineno"> 3011</span>  </div>
<div class="line"><a name="l03012"></a><span class="lineno"> 3012</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> realAvDepol = damping * ( vecReal[targetInd]);</div>
<div class="line"><a name="l03013"></a><span class="lineno"> 3013</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> imagAvDepol = damping * ( vecImag[targetInd]);</div>
<div class="line"><a name="l03014"></a><span class="lineno"> 3014</span>  </div>
<div class="line"><a name="l03015"></a><span class="lineno"> 3015</span>  vecReal[targetInd] *= 1 - damping;</div>
<div class="line"><a name="l03016"></a><span class="lineno"> 3016</span>  vecImag[targetInd] *= 1 - damping;</div>
<div class="line"><a name="l03017"></a><span class="lineno"> 3017</span>  </div>
<div class="line"><a name="l03018"></a><span class="lineno"> 3018</span>  vecReal[baseInd] += realAvDepol;</div>
<div class="line"><a name="l03019"></a><span class="lineno"> 3019</span>  vecImag[baseInd] += imagAvDepol;</div>
<div class="line"><a name="l03020"></a><span class="lineno"> 3020</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a8adaba9dbdad6f7ab41ae4b8db0abefe"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8adaba9dbdad6f7ab41ae4b8db0abefe">◆ </a></span>densmatr_mixDensityMatrix()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixDensityMatrix </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>combineQureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>otherProb</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>otherQureg</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02846">2846</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02846"></a><span class="lineno"> 2846</span>  {</div>
<div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>  </div>
<div class="line"><a name="l02848"></a><span class="lineno"> 2848</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="l02849"></a><span class="lineno"> 2849</span>  </div>
<div class="line"><a name="l02850"></a><span class="lineno"> 2850</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02851"></a><span class="lineno"> 2851</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02852"></a><span class="lineno"> 2852</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02853"></a><span class="lineno"> 2853</span>  densmatr_mixDensityMatrixKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02854"></a><span class="lineno"> 2854</span>  combineQureg, otherProb, otherQureg, numAmpsToVisit</div>
<div class="line"><a name="l02855"></a><span class="lineno"> 2855</span>  );</div>
<div class="line"><a name="l02856"></a><span class="lineno"> 2856</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01012">mixDensityMatrix()</a>.</p>
</div>
</div>
<a id="a7f1cf14dd4820a59eb8a9874c2062bef"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7f1cf14dd4820a59eb8a9874c2062bef">◆ </a></span>densmatr_mixDensityMatrixKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_mixDensityMatrixKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>combineQureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>otherProb</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>otherQureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numAmpsToVisit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02834">2834</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02834"></a><span class="lineno"> 2834</span>  {</div>
<div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>  </div>
<div class="line"><a name="l02836"></a><span class="lineno"> 2836</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="l02837"></a><span class="lineno"> 2837</span>  <span class="keywordflow">if</span> (ampInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02838"></a><span class="lineno"> 2838</span>  </div>
<div class="line"><a name="l02839"></a><span class="lineno"> 2839</span>  combineQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[ampInd] *= 1-otherProb;</div>
<div class="line"><a name="l02840"></a><span class="lineno"> 2840</span>  combineQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[ampInd] *= 1-otherProb;</div>
<div class="line"><a name="l02841"></a><span class="lineno"> 2841</span>  </div>
<div class="line"><a name="l02842"></a><span class="lineno"> 2842</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="l02843"></a><span class="lineno"> 2843</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="l02844"></a><span class="lineno"> 2844</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>.</p>
</div>
</div>
<a id="aa31f0ef43a921c3ac73545d1d3670fa1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa31f0ef43a921c3ac73545d1d3670fa1">◆ </a></span>densmatr_mixDephasing()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixDephasing </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>dephase</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02899">2899</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02899"></a><span class="lineno"> 2899</span>  {</div>
<div class="line"><a name="l02900"></a><span class="lineno"> 2900</span>  </div>
<div class="line"><a name="l02901"></a><span class="lineno"> 2901</span>  <span class="keywordflow">if</span> (dephase == 0)</div>
<div class="line"><a name="l02902"></a><span class="lineno"> 2902</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02903"></a><span class="lineno"> 2903</span>  </div>
<div class="line"><a name="l02904"></a><span class="lineno"> 2904</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephFac = 1 - dephase;</div>
<div class="line"><a name="l02905"></a><span class="lineno"> 2905</span>  <a class="code" href="QuEST__gpu_8cu.html#a01be2e229994aaffd9f73e966e515fd5">densmatr_oneQubitDegradeOffDiagonal</a>(qureg, targetQubit, dephFac);</div>
<div class="line"><a name="l02906"></a><span class="lineno"> 2906</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l02879">densmatr_oneQubitDegradeOffDiagonal()</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l03022">densmatr_mixDepolarising()</a>, and <a class="el" href="QuEST_8c_source.html#l01250">mixDephasing()</a>.</p>
</div>
</div>
<a id="a37c6a59b2dd008d235474cb7248df952"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a37c6a59b2dd008d235474cb7248df952">◆ </a></span>densmatr_mixDephasingKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_mixDephasingKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>fac</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numAmpsToVisit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part3</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>colBit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>rowBit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Called once for every 4 amplitudes in density matrix Works by establishing the |..0..><..0..| state (for its given index) then visiting |..1..><..0..| and |..0..><..1..|. </p>
<p>Labels |part1 X pa><rt2 NOT(X) part3| From the brain of Simon Benjamin </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02863">2863</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02867"></a><span class="lineno"> 2867</span> {</div>
<div class="line"><a name="l02868"></a><span class="lineno"> 2868</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="l02869"></a><span class="lineno"> 2869</span>  <span class="keywordflow">if</span> (scanInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</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>  <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="l02872"></a><span class="lineno"> 2872</span>  vecReal[ampInd + colBit] *= fac;</div>
<div class="line"><a name="l02873"></a><span class="lineno"> 2873</span>  vecImag[ampInd + colBit] *= fac;</div>
<div class="line"><a name="l02874"></a><span class="lineno"> 2874</span>  vecReal[ampInd + rowBit] *= fac;</div>
<div class="line"><a name="l02875"></a><span class="lineno"> 2875</span>  vecImag[ampInd + rowBit] *= fac;</div>
<div class="line"><a name="l02876"></a><span class="lineno"> 2876</span> }</div>
</div><!-- fragment -->
</div>
</div>
<a id="a398b60c4cb4fa2cf2ffc126de6c08da0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a398b60c4cb4fa2cf2ffc126de6c08da0">◆ </a></span>densmatr_mixDepolarising()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixDepolarising </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>depolLevel</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03022">3022</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03022"></a><span class="lineno"> 3022</span>  {</div>
<div class="line"><a name="l03023"></a><span class="lineno"> 3023</span>  </div>
<div class="line"><a name="l03024"></a><span class="lineno"> 3024</span>  <span class="keywordflow">if</span> (depolLevel == 0)</div>
<div class="line"><a name="l03025"></a><span class="lineno"> 3025</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03026"></a><span class="lineno"> 3026</span>  </div>
<div class="line"><a name="l03027"></a><span class="lineno"> 3027</span>  <a class="code" href="QuEST__gpu_8cu.html#aa31f0ef43a921c3ac73545d1d3670fa1">densmatr_mixDephasing</a>(qureg, targetQubit, depolLevel);</div>
<div class="line"><a name="l03028"></a><span class="lineno"> 3028</span>  </div>
<div class="line"><a name="l03029"></a><span class="lineno"> 3029</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="l03030"></a><span class="lineno"> 3030</span>  <span class="keywordtype">int</span> rowQubit = targetQubit + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l03031"></a><span class="lineno"> 3031</span>  </div>
<div class="line"><a name="l03032"></a><span class="lineno"> 3032</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="l03033"></a><span class="lineno"> 3033</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="l03034"></a><span class="lineno"> 3034</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="l03035"></a><span class="lineno"> 3035</span>  </div>
<div class="line"><a name="l03036"></a><span class="lineno"> 3036</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="l03037"></a><span class="lineno"> 3037</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="l03038"></a><span class="lineno"> 3038</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="l03039"></a><span class="lineno"> 3039</span>  </div>
<div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l03042"></a><span class="lineno"> 3042</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l03043"></a><span class="lineno"> 3043</span>  densmatr_mixDepolarisingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l03044"></a><span class="lineno"> 3044</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="l03045"></a><span class="lineno"> 3045</span>  part1, part2, part3, bothBits);</div>
<div class="line"><a name="l03046"></a><span class="lineno"> 3046</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l02899">densmatr_mixDephasing()</a>, <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01272">mixDepolarising()</a>.</p>
</div>
</div>
<a id="aeb0039eccca94ba644a8728d91eff5bb"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aeb0039eccca94ba644a8728d91eff5bb">◆ </a></span>densmatr_mixDepolarisingKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_mixDepolarisingKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>depolLevel</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numAmpsToVisit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part3</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>bothBits</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Works like mixDephasing but modifies every other element, and elements are averaged in pairs. </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02975">2975</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02979"></a><span class="lineno"> 2979</span> {</div>
<div class="line"><a name="l02980"></a><span class="lineno"> 2980</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="l02981"></a><span class="lineno"> 2981</span>  <span class="keywordflow">if</span> (scanInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02982"></a><span class="lineno"> 2982</span>  </div>
<div class="line"><a name="l02983"></a><span class="lineno"> 2983</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="l02984"></a><span class="lineno"> 2984</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="l02985"></a><span class="lineno"> 2985</span>  </div>
<div class="line"><a name="l02986"></a><span class="lineno"> 2986</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="l02987"></a><span class="lineno"> 2987</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="l02988"></a><span class="lineno"> 2988</span>  </div>
<div class="line"><a name="l02989"></a><span class="lineno"> 2989</span>  vecReal[baseInd] *= 1 - depolLevel;</div>
<div class="line"><a name="l02990"></a><span class="lineno"> 2990</span>  vecImag[baseInd] *= 1 - depolLevel;</div>
<div class="line"><a name="l02991"></a><span class="lineno"> 2991</span>  vecReal[targetInd] *= 1 - depolLevel;</div>
<div class="line"><a name="l02992"></a><span class="lineno"> 2992</span>  vecImag[targetInd] *= 1 - depolLevel;</div>
<div class="line"><a name="l02993"></a><span class="lineno"> 2993</span>  </div>
<div class="line"><a name="l02994"></a><span class="lineno"> 2994</span>  vecReal[baseInd] += realAvDepol;</div>
<div class="line"><a name="l02995"></a><span class="lineno"> 2995</span>  vecImag[baseInd] += imagAvDepol;</div>
<div class="line"><a name="l02996"></a><span class="lineno"> 2996</span>  vecReal[targetInd] += realAvDepol;</div>
<div class="line"><a name="l02997"></a><span class="lineno"> 2997</span>  vecImag[targetInd] += imagAvDepol;</div>
<div class="line"><a name="l02998"></a><span class="lineno"> 2998</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a623e577b7230f3c8dc202be6185b4289"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a623e577b7230f3c8dc202be6185b4289">◆ </a></span>densmatr_mixTwoQubitDephasing()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixTwoQubitDephasing </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubit2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>dephase</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02938">2938</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02938"></a><span class="lineno"> 2938</span>  {</div>
<div class="line"><a name="l02939"></a><span class="lineno"> 2939</span>  </div>
<div class="line"><a name="l02940"></a><span class="lineno"> 2940</span>  <span class="keywordflow">if</span> (dephase == 0)</div>
<div class="line"><a name="l02941"></a><span class="lineno"> 2941</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02942"></a><span class="lineno"> 2942</span>  </div>
<div class="line"><a name="l02943"></a><span class="lineno"> 2943</span>  <span class="comment">// assumes qubit2 > qubit1</span></div>
<div class="line"><a name="l02944"></a><span class="lineno"> 2944</span>  </div>
<div class="line"><a name="l02945"></a><span class="lineno"> 2945</span>  <span class="keywordtype">int</span> rowQubit1 = qubit1 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02946"></a><span class="lineno"> 2946</span>  <span class="keywordtype">int</span> rowQubit2 = qubit2 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02947"></a><span class="lineno"> 2947</span>  </div>
<div class="line"><a name="l02948"></a><span class="lineno"> 2948</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="l02949"></a><span class="lineno"> 2949</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="l02950"></a><span class="lineno"> 2950</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="l02951"></a><span class="lineno"> 2951</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="l02952"></a><span class="lineno"> 2952</span>  </div>
<div class="line"><a name="l02953"></a><span class="lineno"> 2953</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="l02954"></a><span class="lineno"> 2954</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="l02955"></a><span class="lineno"> 2955</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="l02956"></a><span class="lineno"> 2956</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="l02957"></a><span class="lineno"> 2957</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="l02958"></a><span class="lineno"> 2958</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephFac = 1 - dephase;</div>
<div class="line"><a name="l02959"></a><span class="lineno"> 2959</span>  </div>
<div class="line"><a name="l02960"></a><span class="lineno"> 2960</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="l02961"></a><span class="lineno"> 2961</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="l02962"></a><span class="lineno"> 2962</span>  </div>
<div class="line"><a name="l02963"></a><span class="lineno"> 2963</span>  <span class="comment">// 12 of these states experience dephasing</span></div>
<div class="line"><a name="l02964"></a><span class="lineno"> 2964</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="l02965"></a><span class="lineno"> 2965</span>  </div>
<div class="line"><a name="l02966"></a><span class="lineno"> 2966</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02967"></a><span class="lineno"> 2967</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02968"></a><span class="lineno"> 2968</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02969"></a><span class="lineno"> 2969</span>  densmatr_mixTwoQubitDephasingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02970"></a><span class="lineno"> 2970</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="l02971"></a><span class="lineno"> 2971</span>  part1, part2, part3, part4, part5, colBit1, rowBit1, colBit2, rowBit2);</div>
<div class="line"><a name="l02972"></a><span class="lineno"> 2972</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00766">densmatr_mixTwoQubitDepolarising()</a>, and <a class="el" href="QuEST_8c_source.html#l01260">mixTwoQubitDephasing()</a>.</p>
</div>
</div>
<a id="ad27d13bcdcbe777e139a90c2e8d52924"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad27d13bcdcbe777e139a90c2e8d52924">◆ </a></span>densmatr_mixTwoQubitDephasingKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_mixTwoQubitDephasingKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>fac</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numBackgroundStates</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numAmpsToVisit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part3</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part4</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part5</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>colBit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>rowBit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>colBit2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>rowBit2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Called 12 times for every 16 amplitudes in density matrix Each sums from the |..0..0..><..0..0..| index to visit either |..0..0..><..0..1..|, |..0..0..><..1..0..|, |..0..0..><..1..1..|, |..0..1..><..0..0..| etc and so on to |..1..1..><..1..0|. </p>
<p>Labels |part1 0 part2 0 par><t3 0 part4 0 part5|. From the brain of Simon Benjamin </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02914">2914</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02918"></a><span class="lineno"> 2918</span> {</div>
<div class="line"><a name="l02919"></a><span class="lineno"> 2919</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="l02920"></a><span class="lineno"> 2920</span>  <span class="keywordflow">if</span> (outerInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02921"></a><span class="lineno"> 2921</span>  </div>
<div class="line"><a name="l02922"></a><span class="lineno"> 2922</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="l02923"></a><span class="lineno"> 2923</span>  <span class="keywordtype">int</span> meta = 1 + (outerInd/numBackgroundStates);</div>
<div class="line"><a name="l02924"></a><span class="lineno"> 2924</span>  <span class="keywordflow">if</span> (meta > 4) meta++;</div>
<div class="line"><a name="l02925"></a><span class="lineno"> 2925</span>  <span class="keywordflow">if</span> (meta > 9) meta++;</div>
<div class="line"><a name="l02926"></a><span class="lineno"> 2926</span>  </div>
<div class="line"><a name="l02927"></a><span class="lineno"> 2927</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="l02928"></a><span class="lineno"> 2928</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="l02929"></a><span class="lineno"> 2929</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateInd = (</div>
<div class="line"><a name="l02930"></a><span class="lineno"> 2930</span>  shift + </div>
<div class="line"><a name="l02931"></a><span class="lineno"> 2931</span>  (scanInd&part1) + ((scanInd&part2)<<1) + ((scanInd&part3)<<2) + ((scanInd&part4)<<3) + ((scanInd&part5)<<4));</div>
<div class="line"><a name="l02932"></a><span class="lineno"> 2932</span>  </div>
<div class="line"><a name="l02933"></a><span class="lineno"> 2933</span>  vecReal[stateInd] *= fac;</div>
<div class="line"><a name="l02934"></a><span class="lineno"> 2934</span>  vecImag[stateInd] *= fac;</div>
<div class="line"><a name="l02935"></a><span class="lineno"> 2935</span> }</div>
</div><!-- fragment -->
</div>
</div>
<a id="a43afa97e300b87bce7f3eb1213eb05f6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a43afa97e300b87bce7f3eb1213eb05f6">◆ </a></span>densmatr_mixTwoQubitDepolarising()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixTwoQubitDepolarising </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubit2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>depolLevel</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03108">3108</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03108"></a><span class="lineno"> 3108</span>  {</div>
<div class="line"><a name="l03109"></a><span class="lineno"> 3109</span>  </div>
<div class="line"><a name="l03110"></a><span class="lineno"> 3110</span>  <span class="keywordflow">if</span> (depolLevel == 0)</div>
<div class="line"><a name="l03111"></a><span class="lineno"> 3111</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03112"></a><span class="lineno"> 3112</span>  </div>
<div class="line"><a name="l03113"></a><span class="lineno"> 3113</span>  <span class="comment">// assumes qubit2 > qubit1</span></div>
<div class="line"><a name="l03114"></a><span class="lineno"> 3114</span>  </div>
<div class="line"><a name="l03115"></a><span class="lineno"> 3115</span>  <a class="code" href="QuEST__gpu_8cu.html#a623e577b7230f3c8dc202be6185b4289">densmatr_mixTwoQubitDephasing</a>(qureg, qubit1, qubit2, depolLevel);</div>
<div class="line"><a name="l03116"></a><span class="lineno"> 3116</span>  </div>
<div class="line"><a name="l03117"></a><span class="lineno"> 3117</span>  <span class="keywordtype">int</span> rowQubit1 = qubit1 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l03118"></a><span class="lineno"> 3118</span>  <span class="keywordtype">int</span> rowQubit2 = qubit2 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l03119"></a><span class="lineno"> 3119</span>  </div>
<div class="line"><a name="l03120"></a><span class="lineno"> 3120</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="l03121"></a><span class="lineno"> 3121</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="l03122"></a><span class="lineno"> 3122</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="l03123"></a><span class="lineno"> 3123</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="l03124"></a><span class="lineno"> 3124</span>  </div>
<div class="line"><a name="l03125"></a><span class="lineno"> 3125</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="l03126"></a><span class="lineno"> 3126</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="l03127"></a><span class="lineno"> 3127</span>  </div>
<div class="line"><a name="l03128"></a><span class="lineno"> 3128</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="l03129"></a><span class="lineno"> 3129</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="l03130"></a><span class="lineno"> 3130</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="l03131"></a><span class="lineno"> 3131</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="l03132"></a><span class="lineno"> 3132</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="l03133"></a><span class="lineno"> 3133</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="l03134"></a><span class="lineno"> 3134</span>  </div>
<div class="line"><a name="l03135"></a><span class="lineno"> 3135</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l03136"></a><span class="lineno"> 3136</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l03137"></a><span class="lineno"> 3137</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l03138"></a><span class="lineno"> 3138</span>  densmatr_mixTwoQubitDepolarisingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l03139"></a><span class="lineno"> 3139</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="l03140"></a><span class="lineno"> 3140</span>  part1, part2, part3, part4, part5, rowCol1, rowCol2);</div>
<div class="line"><a name="l03141"></a><span class="lineno"> 3141</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l02938">densmatr_mixTwoQubitDephasing()</a>, <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01291">mixTwoQubitDepolarising()</a>.</p>
</div>
</div>
<a id="a5f96311d9094c382074ad70d4b789612"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5f96311d9094c382074ad70d4b789612">◆ </a></span>densmatr_mixTwoQubitDepolarisingKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_mixTwoQubitDepolarisingKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>depolLevel</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numAmpsToVisit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part3</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part4</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part5</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>rowCol1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>rowCol2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Called once for every 16 amplitudes. </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03076">3076</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03081"></a><span class="lineno"> 3081</span> {</div>
<div class="line"><a name="l03082"></a><span class="lineno"> 3082</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="l03083"></a><span class="lineno"> 3083</span>  <span class="keywordflow">if</span> (scanInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03084"></a><span class="lineno"> 3084</span>  </div>
<div class="line"><a name="l03085"></a><span class="lineno"> 3085</span>  <span class="comment">// index of |..0..0..><..0..0|</span></div>
<div class="line"><a name="l03086"></a><span class="lineno"> 3086</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="l03087"></a><span class="lineno"> 3087</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="l03088"></a><span class="lineno"> 3088</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="l03089"></a><span class="lineno"> 3089</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="l03090"></a><span class="lineno"> 3090</span>  </div>
<div class="line"><a name="l03091"></a><span class="lineno"> 3091</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> realAvDepol = depolLevel * 0.25 * (</div>
<div class="line"><a name="l03092"></a><span class="lineno"> 3092</span>  vecReal[ind00] + vecReal[ind01] + vecReal[ind10] + vecReal[ind11]);</div>
<div class="line"><a name="l03093"></a><span class="lineno"> 3093</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> imagAvDepol = depolLevel * 0.25 * (</div>
<div class="line"><a name="l03094"></a><span class="lineno"> 3094</span>  vecImag[ind00] + vecImag[ind01] + vecImag[ind10] + vecImag[ind11]);</div>
<div class="line"><a name="l03095"></a><span class="lineno"> 3095</span>  </div>
<div class="line"><a name="l03096"></a><span class="lineno"> 3096</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> retain = 1 - depolLevel;</div>
<div class="line"><a name="l03097"></a><span class="lineno"> 3097</span>  vecReal[ind00] *= retain; vecImag[ind00] *= retain;</div>
<div class="line"><a name="l03098"></a><span class="lineno"> 3098</span>  vecReal[ind01] *= retain; vecImag[ind01] *= retain;</div>
<div class="line"><a name="l03099"></a><span class="lineno"> 3099</span>  vecReal[ind10] *= retain; vecImag[ind10] *= retain;</div>
<div class="line"><a name="l03100"></a><span class="lineno"> 3100</span>  vecReal[ind11] *= retain; vecImag[ind11] *= retain;</div>
<div class="line"><a name="l03101"></a><span class="lineno"> 3101</span>  </div>
<div class="line"><a name="l03102"></a><span class="lineno"> 3102</span>  vecReal[ind00] += realAvDepol; vecImag[ind00] += imagAvDepol;</div>
<div class="line"><a name="l03103"></a><span class="lineno"> 3103</span>  vecReal[ind01] += realAvDepol; vecImag[ind01] += imagAvDepol;</div>
<div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>  vecReal[ind10] += realAvDepol; vecImag[ind10] += imagAvDepol;</div>
<div class="line"><a name="l03105"></a><span class="lineno"> 3105</span>  vecReal[ind11] += realAvDepol; vecImag[ind11] += imagAvDepol;</div>
<div class="line"><a name="l03106"></a><span class="lineno"> 3106</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a01be2e229994aaffd9f73e966e515fd5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a01be2e229994aaffd9f73e966e515fd5">◆ </a></span>densmatr_oneQubitDegradeOffDiagonal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_oneQubitDegradeOffDiagonal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>dephFac</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02879">2879</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02879"></a><span class="lineno"> 2879</span>  {</div>
<div class="line"><a name="l02880"></a><span class="lineno"> 2880</span>  </div>
<div class="line"><a name="l02881"></a><span class="lineno"> 2881</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="l02882"></a><span class="lineno"> 2882</span>  </div>
<div class="line"><a name="l02883"></a><span class="lineno"> 2883</span>  <span class="keywordtype">int</span> rowQubit = targetQubit + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02884"></a><span class="lineno"> 2884</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="l02885"></a><span class="lineno"> 2885</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="l02886"></a><span class="lineno"> 2886</span>  </div>
<div class="line"><a name="l02887"></a><span class="lineno"> 2887</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="l02888"></a><span class="lineno"> 2888</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="l02889"></a><span class="lineno"> 2889</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="l02890"></a><span class="lineno"> 2890</span>  </div>
<div class="line"><a name="l02891"></a><span class="lineno"> 2891</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02892"></a><span class="lineno"> 2892</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02893"></a><span class="lineno"> 2893</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02894"></a><span class="lineno"> 2894</span>  densmatr_mixDephasingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02895"></a><span class="lineno"> 2895</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="l02896"></a><span class="lineno"> 2896</span>  part1, part2, part3, colBit, rowBit);</div>
<div class="line"><a name="l02897"></a><span class="lineno"> 2897</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l03048">densmatr_mixDamping()</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l02899">densmatr_mixDephasing()</a>.</p>
</div>
</div>
<a id="aec1852e1a8e70d3690919ce8ab551ba0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aec1852e1a8e70d3690919ce8ab551ba0">◆ </a></span>extractBit()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__forceinline__ __device__ int extractBit </td>
<td>(</td>
<td class="paramtype">const int </td>
<td class="paramname"><em>locationOfBitFromRight</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const long long int </td>
<td class="paramname"><em>theEncodedNumber</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00082">82</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  {</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><!-- fragment -->
<p class="reference">Referenced by <a class="el" href="QuEST__cpu_8c_source.html#l01377">agnostic_initDiagonalOpFromPauliHamil()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00389">agnostic_initDiagonalOpFromPauliHamilKernel()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00557">compressPairVectorForSingleQubitDepolarise()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00624">compressPairVectorForTwoQubitDepolarise()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02238">densmatr_calcProbOfAllOutcomesKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l03616">densmatr_calcProbOfAllOutcomesLocal()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l00791">densmatr_collapseToKnownProbOutcome()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l03402">densmatr_findProbabilityOfZeroLocal()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l00306">densmatr_mixDampingDistributed()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l00230">densmatr_mixDepolarisingDistributed()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l00547">densmatr_mixTwoQubitDepolarisingDistributed()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l00638">densmatr_mixTwoQubitDepolarisingQ1LocalQ2DistributedPart3()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01412">getGlobalIndOfOddParityInChunk()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l04345">statevec_applyMultiVarPhaseFuncOverrides()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l03611">statevec_applyMultiVarPhaseFuncOverridesKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l04446">statevec_applyParamNamedPhaseFuncOverrides()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l03760">statevec_applyParamNamedPhaseFuncOverridesKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l04268">statevec_applyPhaseFuncOverrides()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l03522">statevec_applyPhaseFuncOverridesKernel()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02186">statevec_calcProbOfAllOutcomesKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l03549">statevec_calcProbOfAllOutcomesLocal()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l02414">statevec_controlledCompactUnitaryDistributed()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00852">statevec_controlledCompactUnitaryKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l02196">statevec_controlledCompactUnitaryLocal()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l02742">statevec_controlledNotDistributed()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01834">statevec_controlledNotKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l02679">statevec_controlledNotLocal()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l03036">statevec_controlledPauliYDistributed()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01409">statevec_controlledPauliYKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l02982">statevec_controlledPauliYLocal()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l03687">statevec_controlledPhaseFlip()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01687">statevec_controlledPhaseFlipKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l03226">statevec_controlledPhaseShift()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01502">statevec_controlledPhaseShiftKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l02476">statevec_controlledUnitaryDistributed()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01179">statevec_controlledUnitaryKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l02336">statevec_controlledUnitaryLocal()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l01611">statevec_initStateOfSingleQubit()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00700">statevec_initStateOfSingleQubitKernel()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00980">statevec_multiControlledMultiQubitUnitaryKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l01912">statevec_multiControlledMultiQubitUnitaryLocal()</a>, and <a class="el" href="QuEST__cpu_8c_source.html#l03185">statevec_phaseShiftByTerm()</a>.</p>
</div>
</div>
<a id="ae1b7788cf504ec3d79de3855f97929c7"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae1b7788cf504ec3d79de3855f97929c7">◆ </a></span>flipBit()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__forceinline__ __device__ long long int flipBit </td>
<td>(</td>
<td class="paramtype">const long long int </td>
<td class="paramname"><em>number</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>bitInd</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00095">95</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  {</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><!-- fragment -->
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01412">getGlobalIndOfOddParityInChunk()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01514">statevec_multiControlledMultiQubitUnitary()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00980">statevec_multiControlledMultiQubitUnitaryKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l01912">statevec_multiControlledMultiQubitUnitaryLocal()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01458">statevec_multiControlledTwoQubitUnitary()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01096">statevec_multiControlledTwoQubitUnitaryKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l01813">statevec_multiControlledTwoQubitUnitaryLocal()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01431">statevec_swapQubitAmps()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l03965">statevec_swapQubitAmpsDistributed()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01743">statevec_swapQubitAmpsKernel()</a>, and <a class="el" href="QuEST__cpu_8c_source.html#l03922">statevec_swapQubitAmpsLocal()</a>.</p>
</div>
</div>
<a id="a1775b7abce55ccfd036bd5f55707877c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1775b7abce55ccfd036bd5f55707877c">◆ </a></span>getBitMaskParity()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__forceinline__ __device__ int getBitMaskParity </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>mask</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00086">86</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  {</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><!-- fragment -->
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l01599">statevec_multiControlledMultiRotateZKernel()</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01571">statevec_multiRotateZKernel()</a>.</p>
</div>
</div>
<a id="a112c74b3365bda6697813d9931b55377"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a112c74b3365bda6697813d9931b55377">◆ </a></span>getNumReductionLevels()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int getNumReductionLevels </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numValuesToReduce</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numReducedPerLevel</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02048">2048</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>  {</div>
<div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>  <span class="keywordtype">int</span> levels=0;</div>
<div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>  <span class="keywordflow">while</span> (numValuesToReduce){</div>
<div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>  numValuesToReduce = numValuesToReduce/numReducedPerLevel;</div>
<div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>  levels++;</div>
<div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>  }</div>
<div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>  <span class="keywordflow">return</span> levels;</div>
<div class="line"><a name="l02055"></a><span class="lineno"> 2055</span> }</div>
</div><!-- fragment -->
</div>
</div>
<a id="a0aabd5ed69a74e5bc0b46a17af45c886"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0aabd5ed69a74e5bc0b46a17af45c886">◆ </a></span>GPUExists()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int GPUExists </td>
<td>(</td>
<td class="paramtype">void </td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00446">446</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  {</div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  <span class="keywordtype">int</span> deviceCount, device;</div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  <span class="keywordtype">int</span> gpuDeviceCount = 0;</div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  <span class="keyword">struct </span>cudaDeviceProp properties;</div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  cudaError_t cudaResultCode = cudaGetDeviceCount(&deviceCount);</div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  <span class="keywordflow">if</span> (cudaResultCode != cudaSuccess) deviceCount = 0;</div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  <span class="comment">/* machines with no GPUs can still report one emulation device */</span></div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  <span class="keywordflow">for</span> (device = 0; device < deviceCount; ++device) {</div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  cudaGetDeviceProperties(&properties, device);</div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  <span class="keywordflow">if</span> (properties.major != 9999) { <span class="comment">/* 9999 means emulation only */</span></div>
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  ++gpuDeviceCount;</div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  }</div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  }</div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  <span class="keywordflow">if</span> (gpuDeviceCount) <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  <span class="keywordflow">else</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span> }</div>
</div><!-- fragment -->
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l00463">createQuESTEnv()</a>.</p>
</div>
</div>
<a id="a4760109974e9b52c60e9d60ccded3138"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4760109974e9b52c60e9d60ccded3138">◆ </a></span>insertTwoZeroBits()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__forceinline__ __device__ long long int insertTwoZeroBits </td>
<td>(</td>
<td class="paramtype">const long long int </td>
<td class="paramname"><em>number</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>bit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>bit2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00106">106</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  {</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#a5c6f1b2c71f43e57de4a1f818ddfbfd0">insertZeroBit</a>(<a class="code" href="QuEST__gpu_8cu.html#a5c6f1b2c71f43e57de4a1f818ddfbfd0">insertZeroBit</a>(number, small), big);</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l00099">insertZeroBit()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l01096">statevec_multiControlledTwoQubitUnitaryKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l01813">statevec_multiControlledTwoQubitUnitaryLocal()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01743">statevec_swapQubitAmpsKernel()</a>, and <a class="el" href="QuEST__cpu_8c_source.html#l03922">statevec_swapQubitAmpsLocal()</a>.</p>
</div>
</div>
<a id="a5c6f1b2c71f43e57de4a1f818ddfbfd0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5c6f1b2c71f43e57de4a1f818ddfbfd0">◆ </a></span>insertZeroBit()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__forceinline__ __device__ long long int insertZeroBit </td>
<td>(</td>
<td class="paramtype">const long long int </td>
<td class="paramname"><em>number</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>index</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00099">99</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  {</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><!-- fragment -->
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l00106">insertTwoZeroBits()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00112">insertZeroBits()</a>, and <a class="el" href="QuEST__cpu_8c_source.html#l01912">statevec_multiControlledMultiQubitUnitaryLocal()</a>.</p>
</div>
</div>
<a id="a9bac39238e100b0f845dc6e4deafc1c9"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9bac39238e100b0f845dc6e4deafc1c9">◆ </a></span>insertZeroBits()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__forceinline__ __device__ long long int insertZeroBits </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>number</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>inds</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>numInds</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00112">112</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  {</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#a5c6f1b2c71f43e57de4a1f818ddfbfd0">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><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l00099">insertZeroBit()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l00980">statevec_multiControlledMultiQubitUnitaryKernel()</a>.</p>
</div>
</div>
<a id="a8ce1e311ea72b862a8757dc71082fbf3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8ce1e311ea72b862a8757dc71082fbf3">◆ </a></span>log2Int()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__device__ __host__ unsigned int log2Int </td>
<td>(</td>
<td class="paramtype">unsigned int </td>
<td class="paramname"><em>x</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01925">1925</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01926"></a><span class="lineno"> 1926</span> {</div>
<div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ans = 0 ;</div>
<div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>  <span class="keywordflow">while</span>( x>>=1 ) ans++;</div>
<div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>  <span class="keywordflow">return</span> ans ;</div>
<div class="line"><a name="l01930"></a><span class="lineno"> 1930</span> }</div>
</div><!-- fragment -->
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l01932">reduceBlock()</a>.</p>
</div>
</div>
<a id="ac82f3dbf68f877f57d4abbb72fae1254"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac82f3dbf68f877f57d4abbb72fae1254">◆ </a></span>reduceBlock()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__device__ void reduceBlock </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>arrayIn</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>length</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01932">1932</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>  {</div>
<div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>  <span class="keywordtype">int</span> i, l, r;</div>
<div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>  <span class="keywordtype">int</span> threadMax, maxDepth;</div>
<div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>  threadMax = length/2;</div>
<div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>  maxDepth = <a class="code" href="QuEST__gpu_8cu.html#a8ce1e311ea72b862a8757dc71082fbf3">log2Int</a>(length/2);</div>
<div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>  </div>
<div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>  <span class="keywordflow">for</span> (i=0; i<maxDepth+1; i++){</div>
<div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>  <span class="keywordflow">if</span> (threadIdx.x<threadMax){</div>
<div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>  l = threadIdx.x;</div>
<div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>  r = l + threadMax;</div>
<div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>  arrayIn[l] = arrayIn[r] + arrayIn[l];</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>  threadMax = threadMax >> 1;</div>
<div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>  __syncthreads(); <span class="comment">// optimise -- use warp shuffle instead</span></div>
<div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>  }</div>
<div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>  </div>
<div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>  <span class="keywordflow">if</span> (threadIdx.x==0) reducedArray[blockIdx.x] = arrayIn[0];</div>
<div class="line"><a name="l01949"></a><span class="lineno"> 1949</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l01925">log2Int()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l01951">copySharedReduceBlock()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l03367">densmatr_calcExpecDiagonalOpKernel()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02481">densmatr_calcFidelityKernel()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02569">densmatr_calcHilbertSchmidtDistanceSquaredKernel()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02292">densmatr_calcInnerProductKernel()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02645">densmatr_calcPurityKernel()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01960">densmatr_findProbabilityOfZeroKernel()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l03249">statevec_calcExpecDiagonalOpKernel()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02363">statevec_calcInnerProductKernel()</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01998">statevec_findProbabilityOfZeroKernel()</a>.</p>
</div>
</div>
<a id="a27294e3065ebe42a65b3b9e0f85551dd"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a27294e3065ebe42a65b3b9e0f85551dd">◆ </a></span>statevec_applyDiagonalOp()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_applyDiagonalOp </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structDiagonalOp.html">DiagonalOp</a> </td>
<td class="paramname"><em>op</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03209">3209</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03210"></a><span class="lineno"> 3210</span> {</div>
<div class="line"><a name="l03211"></a><span class="lineno"> 3211</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l03212"></a><span class="lineno"> 3212</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l03213"></a><span class="lineno"> 3213</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="l03214"></a><span class="lineno"> 3214</span>  statevec_applyDiagonalOpKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, op);</div>
<div class="line"><a name="l03215"></a><span class="lineno"> 3215</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01127">applyDiagonalOp()</a>.</p>
</div>
</div>
<a id="a0ac752f618123ed417cf0e6358c07fde"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0ac752f618123ed417cf0e6358c07fde">◆ </a></span>statevec_applyDiagonalOpKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_applyDiagonalOpKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structDiagonalOp.html">DiagonalOp</a> </td>
<td class="paramname"><em>op</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03187">3187</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03187"></a><span class="lineno"> 3187</span>  {</div>
<div class="line"><a name="l03188"></a><span class="lineno"> 3188</span>  </div>
<div class="line"><a name="l03189"></a><span class="lineno"> 3189</span>  <span class="comment">// each thread modifies one value; a wasteful and inefficient strategy</span></div>
<div class="line"><a name="l03190"></a><span class="lineno"> 3190</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>;</div>
<div class="line"><a name="l03191"></a><span class="lineno"> 3191</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="l03192"></a><span class="lineno"> 3192</span>  <span class="keywordflow">if</span> (thisTask >= numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03193"></a><span class="lineno"> 3193</span>  </div>
<div class="line"><a name="l03194"></a><span class="lineno"> 3194</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateRe = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l03195"></a><span class="lineno"> 3195</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateIm = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l03196"></a><span class="lineno"> 3196</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* opRe = op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real;</div>
<div class="line"><a name="l03197"></a><span class="lineno"> 3197</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* opIm = op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag;</div>
<div class="line"><a name="l03198"></a><span class="lineno"> 3198</span>  </div>
<div class="line"><a name="l03199"></a><span class="lineno"> 3199</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> a = stateRe[thisTask];</div>
<div class="line"><a name="l03200"></a><span class="lineno"> 3200</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> b = stateIm[thisTask];</div>
<div class="line"><a name="l03201"></a><span class="lineno"> 3201</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> c = opRe[thisTask];</div>
<div class="line"><a name="l03202"></a><span class="lineno"> 3202</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> d = opIm[thisTask];</div>
<div class="line"><a name="l03203"></a><span class="lineno"> 3203</span>  </div>
<div class="line"><a name="l03204"></a><span class="lineno"> 3204</span>  <span class="comment">// (a + b i)(c + d i) = (a c - b d) + i (a d + b c)</span></div>
<div class="line"><a name="l03205"></a><span class="lineno"> 3205</span>  stateRe[thisTask] = a*c - b*d;</div>
<div class="line"><a name="l03206"></a><span class="lineno"> 3206</span>  stateIm[thisTask] = a*d + b*c;</div>
<div class="line"><a name="l03207"></a><span class="lineno"> 3207</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00312">DiagonalOp::deviceOperator</a>, <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="ab33437d10c1ce1c4b034c7c411db553f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab33437d10c1ce1c4b034c7c411db553f">◆ </a></span>statevec_applyMultiVarPhaseFuncOverrides()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_applyMultiVarPhaseFuncOverrides </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>qubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>numQubitsPerReg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numRegs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">enum <a class="el" href="group__type.html#ga9c91c41aa42ae537995e89ffc616afe1">bitEncoding</a> </td>
<td class="paramname"><em>encoding</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>coeffs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>exponents</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>numTermsPerReg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int * </td>
<td class="paramname"><em>overrideInds</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>overridePhases</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numOverrides</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>conj</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03695">3695</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03700"></a><span class="lineno"> 3700</span>  {</div>
<div class="line"><a name="l03701"></a><span class="lineno"> 3701</span>  <span class="comment">// determine size of arrays, for cloning into GPU memory</span></div>
<div class="line"><a name="l03702"></a><span class="lineno"> 3702</span>  <span class="keywordtype">size_t</span> mem_numQubitsPerReg = numRegs * <span class="keyword">sizeof</span> *numQubitsPerReg;</div>
<div class="line"><a name="l03703"></a><span class="lineno"> 3703</span>  <span class="keywordtype">size_t</span> mem_numTermsPerReg = numRegs * <span class="keyword">sizeof</span> *numTermsPerReg;</div>
<div class="line"><a name="l03704"></a><span class="lineno"> 3704</span>  <span class="keywordtype">size_t</span> mem_overridePhases = numOverrides * <span class="keyword">sizeof</span> *overridePhases;</div>
<div class="line"><a name="l03705"></a><span class="lineno"> 3705</span>  <span class="keywordtype">size_t</span> mem_overrideInds = numOverrides * numRegs * <span class="keyword">sizeof</span> *overrideInds;</div>
<div class="line"><a name="l03706"></a><span class="lineno"> 3706</span>  <span class="keywordtype">size_t</span> mem_qubits = 0;</div>
<div class="line"><a name="l03707"></a><span class="lineno"> 3707</span>  <span class="keywordtype">size_t</span> mem_coeffs = 0; </div>
<div class="line"><a name="l03708"></a><span class="lineno"> 3708</span>  <span class="keywordtype">size_t</span> mem_exponents = 0;</div>
<div class="line"><a name="l03709"></a><span class="lineno"> 3709</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++) {</div>
<div class="line"><a name="l03710"></a><span class="lineno"> 3710</span>  mem_qubits += numQubitsPerReg[r] * <span class="keyword">sizeof</span> *qubits;</div>
<div class="line"><a name="l03711"></a><span class="lineno"> 3711</span>  mem_coeffs += numTermsPerReg[r] * <span class="keyword">sizeof</span> *coeffs;</div>
<div class="line"><a name="l03712"></a><span class="lineno"> 3712</span>  mem_exponents += numTermsPerReg[r] * <span class="keyword">sizeof</span> *exponents;</div>
<div class="line"><a name="l03713"></a><span class="lineno"> 3713</span>  }</div>
<div class="line"><a name="l03714"></a><span class="lineno"> 3714</span>  </div>
<div class="line"><a name="l03715"></a><span class="lineno"> 3715</span>  <span class="comment">// allocate global GPU memory</span></div>
<div class="line"><a name="l03716"></a><span class="lineno"> 3716</span>  <span class="keywordtype">int</span>* d_qubits; cudaMalloc(&d_qubits, mem_qubits);</div>
<div class="line"><a name="l03717"></a><span class="lineno"> 3717</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_coeffs; cudaMalloc(&d_coeffs, mem_coeffs);</div>
<div class="line"><a name="l03718"></a><span class="lineno"> 3718</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_exponents; cudaMalloc(&d_exponents, mem_exponents);</div>
<div class="line"><a name="l03719"></a><span class="lineno"> 3719</span>  <span class="keywordtype">int</span>* d_numQubitsPerReg; cudaMalloc(&d_numQubitsPerReg, mem_numQubitsPerReg);</div>
<div class="line"><a name="l03720"></a><span class="lineno"> 3720</span>  <span class="keywordtype">int</span>* d_numTermsPerReg; cudaMalloc(&d_numTermsPerReg, mem_numTermsPerReg);</div>
<div class="line"><a name="l03721"></a><span class="lineno"> 3721</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span>* d_overrideInds; cudaMalloc(&d_overrideInds, mem_overrideInds);</div>
<div class="line"><a name="l03722"></a><span class="lineno"> 3722</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_overridePhases; cudaMalloc(&d_overridePhases, mem_overridePhases);</div>
<div class="line"><a name="l03723"></a><span class="lineno"> 3723</span>  </div>
<div class="line"><a name="l03724"></a><span class="lineno"> 3724</span>  <span class="comment">// copy function args into GPU memory</span></div>
<div class="line"><a name="l03725"></a><span class="lineno"> 3725</span>  cudaMemcpy(d_qubits, qubits, mem_qubits, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03726"></a><span class="lineno"> 3726</span>  cudaMemcpy(d_coeffs, coeffs, mem_coeffs, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03727"></a><span class="lineno"> 3727</span>  cudaMemcpy(d_exponents, exponents, mem_exponents, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03728"></a><span class="lineno"> 3728</span>  cudaMemcpy(d_numQubitsPerReg, numQubitsPerReg, mem_numQubitsPerReg, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03729"></a><span class="lineno"> 3729</span>  cudaMemcpy(d_numTermsPerReg, numTermsPerReg, mem_numTermsPerReg, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03730"></a><span class="lineno"> 3730</span>  cudaMemcpy(d_overrideInds, overrideInds, mem_overrideInds, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03731"></a><span class="lineno"> 3731</span>  cudaMemcpy(d_overridePhases, overridePhases, mem_overridePhases, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03732"></a><span class="lineno"> 3732</span>  </div>
<div class="line"><a name="l03733"></a><span class="lineno"> 3733</span>  <span class="keywordtype">int</span> threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l03734"></a><span class="lineno"> 3734</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> / threadsPerCUDABlock);</div>
<div class="line"><a name="l03735"></a><span class="lineno"> 3735</span>  </div>
<div class="line"><a name="l03736"></a><span class="lineno"> 3736</span>  <span class="comment">// allocate thread-local working space {phaseInds}</span></div>
<div class="line"><a name="l03737"></a><span class="lineno"> 3737</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> *d_phaseInds;</div>
<div class="line"><a name="l03738"></a><span class="lineno"> 3738</span>  <span class="keywordtype">size_t</span> gridSize = (size_t) threadsPerCUDABlock * CUDABlocks;</div>
<div class="line"><a name="l03739"></a><span class="lineno"> 3739</span>  cudaMalloc(&d_phaseInds, numRegs*gridSize * <span class="keyword">sizeof</span> *d_phaseInds);</div>
<div class="line"><a name="l03740"></a><span class="lineno"> 3740</span>  </div>
<div class="line"><a name="l03741"></a><span class="lineno"> 3741</span>  <span class="comment">// call kernel</span></div>
<div class="line"><a name="l03742"></a><span class="lineno"> 3742</span>  statevec_applyMultiVarPhaseFuncOverridesKernel<<<CUDABlocks,threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l03743"></a><span class="lineno"> 3743</span>  qureg, d_qubits, d_numQubitsPerReg, numRegs, encoding,</div>
<div class="line"><a name="l03744"></a><span class="lineno"> 3744</span>  d_coeffs, d_exponents, d_numTermsPerReg, </div>
<div class="line"><a name="l03745"></a><span class="lineno"> 3745</span>  d_overrideInds, d_overridePhases, numOverrides,</div>
<div class="line"><a name="l03746"></a><span class="lineno"> 3746</span>  d_phaseInds, </div>
<div class="line"><a name="l03747"></a><span class="lineno"> 3747</span>  conj);</div>
<div class="line"><a name="l03748"></a><span class="lineno"> 3748</span>  </div>
<div class="line"><a name="l03749"></a><span class="lineno"> 3749</span>  <span class="comment">// free device memory</span></div>
<div class="line"><a name="l03750"></a><span class="lineno"> 3750</span>  cudaFree(d_qubits);</div>
<div class="line"><a name="l03751"></a><span class="lineno"> 3751</span>  cudaFree(d_coeffs);</div>
<div class="line"><a name="l03752"></a><span class="lineno"> 3752</span>  cudaFree(d_exponents);</div>
<div class="line"><a name="l03753"></a><span class="lineno"> 3753</span>  cudaFree(d_numQubitsPerReg);</div>
<div class="line"><a name="l03754"></a><span class="lineno"> 3754</span>  cudaFree(d_numTermsPerReg);</div>
<div class="line"><a name="l03755"></a><span class="lineno"> 3755</span>  cudaFree(d_overrideInds);</div>
<div class="line"><a name="l03756"></a><span class="lineno"> 3756</span>  cudaFree(d_overridePhases);</div>
<div class="line"><a name="l03757"></a><span class="lineno"> 3757</span>  cudaFree(d_phaseInds);</div>
<div class="line"><a name="l03758"></a><span class="lineno"> 3758</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00761">applyMultiVarPhaseFunc()</a>, and <a class="el" href="QuEST_8c_source.html#l00778">applyMultiVarPhaseFuncOverrides()</a>.</p>
</div>
</div>
<a id="a5224b64ff81ca7b205c26f01bb704241"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5224b64ff81ca7b205c26f01bb704241">◆ </a></span>statevec_applyMultiVarPhaseFuncOverridesKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_applyMultiVarPhaseFuncOverridesKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>qubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>numQubitsPerReg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numRegs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">enum <a class="el" href="group__type.html#ga9c91c41aa42ae537995e89ffc616afe1">bitEncoding</a> </td>
<td class="paramname"><em>encoding</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>coeffs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>exponents</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>numTermsPerReg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int * </td>
<td class="paramname"><em>overrideInds</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>overridePhases</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numOverrides</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int * </td>
<td class="paramname"><em>phaseInds</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>conj</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03611">3611</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03617"></a><span class="lineno"> 3617</span>  {</div>
<div class="line"><a name="l03618"></a><span class="lineno"> 3618</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="l03619"></a><span class="lineno"> 3619</span>  <span class="keywordflow">if</span> (index>=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03620"></a><span class="lineno"> 3620</span>  </div>
<div class="line"><a name="l03621"></a><span class="lineno"> 3621</span>  <span class="comment">// determine global amplitude index (non-distributed, so it's just local index)</span></div>
<div class="line"><a name="l03622"></a><span class="lineno"> 3622</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> globalAmpInd = index;</div>
<div class="line"><a name="l03623"></a><span class="lineno"> 3623</span>  </div>
<div class="line"><a name="l03624"></a><span class="lineno"> 3624</span>  <span class="comment">/*</span></div>
<div class="line"><a name="l03625"></a><span class="lineno"> 3625</span> <span class="comment"> * each thread needs to write to a local:</span></div>
<div class="line"><a name="l03626"></a><span class="lineno"> 3626</span> <span class="comment"> * long long int phaseInds[numRegs];</span></div>
<div class="line"><a name="l03627"></a><span class="lineno"> 3627</span> <span class="comment"> * but instead has access to shared array phaseInds, with below stride and offset</span></div>
<div class="line"><a name="l03628"></a><span class="lineno"> 3628</span> <span class="comment"> */</span></div>
<div class="line"><a name="l03629"></a><span class="lineno"> 3629</span>  <span class="keywordtype">size_t</span> stride = gridDim.x*blockDim.x;</div>
<div class="line"><a name="l03630"></a><span class="lineno"> 3630</span>  <span class="keywordtype">size_t</span> offset = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l03631"></a><span class="lineno"> 3631</span>  </div>
<div class="line"><a name="l03632"></a><span class="lineno"> 3632</span>  <span class="comment">// determine phase indices</span></div>
<div class="line"><a name="l03633"></a><span class="lineno"> 3633</span>  <span class="keywordtype">int</span> flatInd = 0;</div>
<div class="line"><a name="l03634"></a><span class="lineno"> 3634</span>  <span class="keywordflow">if</span> (encoding == <a class="code" href="group__type.html#gga9c91c41aa42ae537995e89ffc616afe1a7165f9a47792f47c718ca128556fb3ae">UNSIGNED</a>) {</div>
<div class="line"><a name="l03635"></a><span class="lineno"> 3635</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++) {</div>
<div class="line"><a name="l03636"></a><span class="lineno"> 3636</span>  phaseInds[r*stride+offset] = 0LL;</div>
<div class="line"><a name="l03637"></a><span class="lineno"> 3637</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> q=0; q<numQubitsPerReg[r]; q++)</div>
<div class="line"><a name="l03638"></a><span class="lineno"> 3638</span>  phaseInds[r*stride+offset] += (1LL << q) * <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[flatInd++], globalAmpInd);</div>
<div class="line"><a name="l03639"></a><span class="lineno"> 3639</span>  }</div>
<div class="line"><a name="l03640"></a><span class="lineno"> 3640</span>  }</div>
<div class="line"><a name="l03641"></a><span class="lineno"> 3641</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (encoding == <a class="code" href="group__type.html#gga9c91c41aa42ae537995e89ffc616afe1a9aa2a35d92976c7de970506c4d19a96c">TWOS_COMPLEMENT</a>) {</div>
<div class="line"><a name="l03642"></a><span class="lineno"> 3642</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++) {</div>
<div class="line"><a name="l03643"></a><span class="lineno"> 3643</span>  phaseInds[r*stride+offset] = 0LL;</div>
<div class="line"><a name="l03644"></a><span class="lineno"> 3644</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> q=0; q<numQubitsPerReg[r]-1; q++) </div>
<div class="line"><a name="l03645"></a><span class="lineno"> 3645</span>  phaseInds[r*stride+offset] += (1LL << q) * <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[flatInd++], globalAmpInd);</div>
<div class="line"><a name="l03646"></a><span class="lineno"> 3646</span>  <span class="comment">// use final qubit to indicate sign</span></div>
<div class="line"><a name="l03647"></a><span class="lineno"> 3647</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[flatInd++], globalAmpInd) == 1)</div>
<div class="line"><a name="l03648"></a><span class="lineno"> 3648</span>  phaseInds[r*stride+offset] -= (1LL << (numQubitsPerReg[r]-1)); </div>
<div class="line"><a name="l03649"></a><span class="lineno"> 3649</span>  }</div>
<div class="line"><a name="l03650"></a><span class="lineno"> 3650</span>  }</div>
<div class="line"><a name="l03651"></a><span class="lineno"> 3651</span>  </div>
<div class="line"><a name="l03652"></a><span class="lineno"> 3652</span>  <span class="comment">// determine if this phase index has an overriden value (i < numOverrides)</span></div>
<div class="line"><a name="l03653"></a><span class="lineno"> 3653</span>  <span class="keywordtype">int</span> i;</div>
<div class="line"><a name="l03654"></a><span class="lineno"> 3654</span>  <span class="keywordflow">for</span> (i=0; i<numOverrides; i++) {</div>
<div class="line"><a name="l03655"></a><span class="lineno"> 3655</span>  <span class="keywordtype">int</span> found = 1;</div>
<div class="line"><a name="l03656"></a><span class="lineno"> 3656</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++) {</div>
<div class="line"><a name="l03657"></a><span class="lineno"> 3657</span>  <span class="keywordflow">if</span> (phaseInds[r*stride+offset] != overrideInds[i*numRegs+r]) {</div>
<div class="line"><a name="l03658"></a><span class="lineno"> 3658</span>  found = 0;</div>
<div class="line"><a name="l03659"></a><span class="lineno"> 3659</span>  <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l03660"></a><span class="lineno"> 3660</span>  }</div>
<div class="line"><a name="l03661"></a><span class="lineno"> 3661</span>  }</div>
<div class="line"><a name="l03662"></a><span class="lineno"> 3662</span>  <span class="keywordflow">if</span> (found)</div>
<div class="line"><a name="l03663"></a><span class="lineno"> 3663</span>  <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l03664"></a><span class="lineno"> 3664</span>  }</div>
<div class="line"><a name="l03665"></a><span class="lineno"> 3665</span>  </div>
<div class="line"><a name="l03666"></a><span class="lineno"> 3666</span>  <span class="comment">// compute the phase (unless overriden)</span></div>
<div class="line"><a name="l03667"></a><span class="lineno"> 3667</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> phase = 0;</div>
<div class="line"><a name="l03668"></a><span class="lineno"> 3668</span>  <span class="keywordflow">if</span> (i < numOverrides)</div>
<div class="line"><a name="l03669"></a><span class="lineno"> 3669</span>  phase = overridePhases[i];</div>
<div class="line"><a name="l03670"></a><span class="lineno"> 3670</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03671"></a><span class="lineno"> 3671</span>  flatInd = 0;</div>
<div class="line"><a name="l03672"></a><span class="lineno"> 3672</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++) {</div>
<div class="line"><a name="l03673"></a><span class="lineno"> 3673</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t=0; t<numTermsPerReg[r]; t++) {</div>
<div class="line"><a name="l03674"></a><span class="lineno"> 3674</span>  phase += coeffs[flatInd] * pow(phaseInds[r*stride+offset], exponents[flatInd]);</div>
<div class="line"><a name="l03675"></a><span class="lineno"> 3675</span>  flatInd++;</div>
<div class="line"><a name="l03676"></a><span class="lineno"> 3676</span>  }</div>
<div class="line"><a name="l03677"></a><span class="lineno"> 3677</span>  }</div>
<div class="line"><a name="l03678"></a><span class="lineno"> 3678</span>  }</div>
<div class="line"><a name="l03679"></a><span class="lineno"> 3679</span>  </div>
<div class="line"><a name="l03680"></a><span class="lineno"> 3680</span>  <span class="comment">// negate phase to conjugate operator </span></div>
<div class="line"><a name="l03681"></a><span class="lineno"> 3681</span>  <span class="keywordflow">if</span> (conj)</div>
<div class="line"><a name="l03682"></a><span class="lineno"> 3682</span>  phase *= -1;</div>
<div class="line"><a name="l03683"></a><span class="lineno"> 3683</span>  </div>
<div class="line"><a name="l03684"></a><span class="lineno"> 3684</span>  <span class="comment">// modify amp to amp * exp(i phase) </span></div>
<div class="line"><a name="l03685"></a><span class="lineno"> 3685</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> c = cos(phase);</div>
<div class="line"><a name="l03686"></a><span class="lineno"> 3686</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> s = sin(phase);</div>
<div class="line"><a name="l03687"></a><span class="lineno"> 3687</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index];</div>
<div class="line"><a name="l03688"></a><span class="lineno"> 3688</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> im = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index];</div>
<div class="line"><a name="l03689"></a><span class="lineno"> 3689</span>  </div>
<div class="line"><a name="l03690"></a><span class="lineno"> 3690</span>  <span class="comment">// = {re[amp] cos(phase) - im[amp] sin(phase)} + i {re[amp] sin(phase) + im[amp] cos(phase)}</span></div>
<div class="line"><a name="l03691"></a><span class="lineno"> 3691</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index] = re*c - im*s;</div>
<div class="line"><a name="l03692"></a><span class="lineno"> 3692</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index] = re*s + im*c;</div>
<div class="line"><a name="l03693"></a><span class="lineno"> 3693</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST_8h_source.html#l00269">TWOS_COMPLEMENT</a>, and <a class="el" href="QuEST_8h_source.html#l00269">UNSIGNED</a>.</p>
</div>
</div>
<a id="ad5b7e25e42427dfa7f19fd950264bb16"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad5b7e25e42427dfa7f19fd950264bb16">◆ </a></span>statevec_applyParamNamedPhaseFuncOverrides()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_applyParamNamedPhaseFuncOverrides </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>qubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>numQubitsPerReg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numRegs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">enum <a class="el" href="group__type.html#ga9c91c41aa42ae537995e89ffc616afe1">bitEncoding</a> </td>
<td class="paramname"><em>encoding</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">enum <a class="el" href="group__type.html#gaa7d869b117ba5024d6b84938e8cdfc65">phaseFunc</a> </td>
<td class="paramname"><em>phaseFuncName</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>params</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numParams</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int * </td>
<td class="paramname"><em>overrideInds</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>overridePhases</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numOverrides</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>conj</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03909">3909</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03914"></a><span class="lineno"> 3914</span>  {</div>
<div class="line"><a name="l03915"></a><span class="lineno"> 3915</span>  <span class="comment">// determine size of arrays, for cloning into GPU memory</span></div>
<div class="line"><a name="l03916"></a><span class="lineno"> 3916</span>  <span class="keywordtype">size_t</span> mem_numQubitsPerReg = numRegs * <span class="keyword">sizeof</span> *numQubitsPerReg;</div>
<div class="line"><a name="l03917"></a><span class="lineno"> 3917</span>  <span class="keywordtype">size_t</span> mem_overridePhases = numOverrides * <span class="keyword">sizeof</span> *overridePhases;</div>
<div class="line"><a name="l03918"></a><span class="lineno"> 3918</span>  <span class="keywordtype">size_t</span> mem_overrideInds = numOverrides * numRegs * <span class="keyword">sizeof</span> *overrideInds;</div>
<div class="line"><a name="l03919"></a><span class="lineno"> 3919</span>  <span class="keywordtype">size_t</span> mem_params = numParams * <span class="keyword">sizeof</span> *params;</div>
<div class="line"><a name="l03920"></a><span class="lineno"> 3920</span>  <span class="keywordtype">size_t</span> mem_qubits = 0;</div>
<div class="line"><a name="l03921"></a><span class="lineno"> 3921</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++)</div>
<div class="line"><a name="l03922"></a><span class="lineno"> 3922</span>  mem_qubits += numQubitsPerReg[r] * <span class="keyword">sizeof</span> *qubits;</div>
<div class="line"><a name="l03923"></a><span class="lineno"> 3923</span>  </div>
<div class="line"><a name="l03924"></a><span class="lineno"> 3924</span>  <span class="comment">// allocate global GPU memory</span></div>
<div class="line"><a name="l03925"></a><span class="lineno"> 3925</span>  <span class="keywordtype">int</span>* d_qubits; cudaMalloc(&d_qubits, mem_qubits);</div>
<div class="line"><a name="l03926"></a><span class="lineno"> 3926</span>  <span class="keywordtype">int</span>* d_numQubitsPerReg; cudaMalloc(&d_numQubitsPerReg, mem_numQubitsPerReg);</div>
<div class="line"><a name="l03927"></a><span class="lineno"> 3927</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span>* d_overrideInds; cudaMalloc(&d_overrideInds, mem_overrideInds);</div>
<div class="line"><a name="l03928"></a><span class="lineno"> 3928</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_overridePhases; cudaMalloc(&d_overridePhases, mem_overridePhases);</div>
<div class="line"><a name="l03929"></a><span class="lineno"> 3929</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_params = NULL; <span class="keywordflow">if</span> (numParams > 0) cudaMalloc(&d_params, mem_params);</div>
<div class="line"><a name="l03930"></a><span class="lineno"> 3930</span>  </div>
<div class="line"><a name="l03931"></a><span class="lineno"> 3931</span>  <span class="comment">// copy function args into GPU memory</span></div>
<div class="line"><a name="l03932"></a><span class="lineno"> 3932</span>  cudaMemcpy(d_qubits, qubits, mem_qubits, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03933"></a><span class="lineno"> 3933</span>  cudaMemcpy(d_numQubitsPerReg, numQubitsPerReg, mem_numQubitsPerReg, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03934"></a><span class="lineno"> 3934</span>  cudaMemcpy(d_overrideInds, overrideInds, mem_overrideInds, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03935"></a><span class="lineno"> 3935</span>  cudaMemcpy(d_overridePhases, overridePhases, mem_overridePhases, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03936"></a><span class="lineno"> 3936</span>  <span class="keywordflow">if</span> (numParams > 0)</div>
<div class="line"><a name="l03937"></a><span class="lineno"> 3937</span>  cudaMemcpy(d_params, params, mem_params, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03938"></a><span class="lineno"> 3938</span>  </div>
<div class="line"><a name="l03939"></a><span class="lineno"> 3939</span>  <span class="keywordtype">int</span> threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l03940"></a><span class="lineno"> 3940</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> / threadsPerCUDABlock);</div>
<div class="line"><a name="l03941"></a><span class="lineno"> 3941</span>  </div>
<div class="line"><a name="l03942"></a><span class="lineno"> 3942</span>  <span class="comment">// allocate thread-local working space {phaseInds}</span></div>
<div class="line"><a name="l03943"></a><span class="lineno"> 3943</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> *d_phaseInds;</div>
<div class="line"><a name="l03944"></a><span class="lineno"> 3944</span>  <span class="keywordtype">size_t</span> gridSize = (size_t) threadsPerCUDABlock * CUDABlocks;</div>
<div class="line"><a name="l03945"></a><span class="lineno"> 3945</span>  cudaMalloc(&d_phaseInds, numRegs*gridSize * <span class="keyword">sizeof</span> *d_phaseInds);</div>
<div class="line"><a name="l03946"></a><span class="lineno"> 3946</span>  </div>
<div class="line"><a name="l03947"></a><span class="lineno"> 3947</span>  <span class="comment">// call kernel</span></div>
<div class="line"><a name="l03948"></a><span class="lineno"> 3948</span>  statevec_applyParamNamedPhaseFuncOverridesKernel<<<CUDABlocks,threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l03949"></a><span class="lineno"> 3949</span>  qureg, d_qubits, d_numQubitsPerReg, numRegs, encoding,</div>
<div class="line"><a name="l03950"></a><span class="lineno"> 3950</span>  phaseFuncName, d_params, numParams,</div>
<div class="line"><a name="l03951"></a><span class="lineno"> 3951</span>  d_overrideInds, d_overridePhases, numOverrides,</div>
<div class="line"><a name="l03952"></a><span class="lineno"> 3952</span>  d_phaseInds,</div>
<div class="line"><a name="l03953"></a><span class="lineno"> 3953</span>  conj);</div>
<div class="line"><a name="l03954"></a><span class="lineno"> 3954</span>  </div>
<div class="line"><a name="l03955"></a><span class="lineno"> 3955</span>  <span class="comment">// free device memory</span></div>
<div class="line"><a name="l03956"></a><span class="lineno"> 3956</span>  cudaFree(d_qubits);</div>
<div class="line"><a name="l03957"></a><span class="lineno"> 3957</span>  cudaFree(d_numQubitsPerReg);</div>
<div class="line"><a name="l03958"></a><span class="lineno"> 3958</span>  cudaFree(d_overrideInds);</div>
<div class="line"><a name="l03959"></a><span class="lineno"> 3959</span>  cudaFree(d_overridePhases);</div>
<div class="line"><a name="l03960"></a><span class="lineno"> 3960</span>  cudaFree(d_phaseInds);</div>
<div class="line"><a name="l03961"></a><span class="lineno"> 3961</span>  <span class="keywordflow">if</span> (numParams > 0)</div>
<div class="line"><a name="l03962"></a><span class="lineno"> 3962</span>  cudaFree(d_params);</div>
<div class="line"><a name="l03963"></a><span class="lineno"> 3963</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__common_8c_source.html#l00849">agnostic_applyQFT()</a>, <a class="el" href="QuEST_8c_source.html#l00796">applyNamedPhaseFunc()</a>, <a class="el" href="QuEST_8c_source.html#l00813">applyNamedPhaseFuncOverrides()</a>, <a class="el" href="QuEST_8c_source.html#l00831">applyParamNamedPhaseFunc()</a>, and <a class="el" href="QuEST_8c_source.html#l00848">applyParamNamedPhaseFuncOverrides()</a>.</p>
</div>
</div>
<a id="a0ab7d9b8126b7074f21ba3e2316dd246"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0ab7d9b8126b7074f21ba3e2316dd246">◆ </a></span>statevec_applyParamNamedPhaseFuncOverridesKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_applyParamNamedPhaseFuncOverridesKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>qubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>numQubitsPerReg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numRegs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">enum <a class="el" href="group__type.html#ga9c91c41aa42ae537995e89ffc616afe1">bitEncoding</a> </td>
<td class="paramname"><em>encoding</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">enum <a class="el" href="group__type.html#gaa7d869b117ba5024d6b84938e8cdfc65">phaseFunc</a> </td>
<td class="paramname"><em>phaseFuncName</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>params</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numParams</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int * </td>
<td class="paramname"><em>overrideInds</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>overridePhases</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numOverrides</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int * </td>
<td class="paramname"><em>phaseInds</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>conj</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03760">3760</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03766"></a><span class="lineno"> 3766</span>  {</div>
<div class="line"><a name="l03767"></a><span class="lineno"> 3767</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="l03768"></a><span class="lineno"> 3768</span>  <span class="keywordflow">if</span> (index>=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03769"></a><span class="lineno"> 3769</span>  </div>
<div class="line"><a name="l03770"></a><span class="lineno"> 3770</span>  <span class="comment">// determine global amplitude index (non-distributed, so it's just local index)</span></div>
<div class="line"><a name="l03771"></a><span class="lineno"> 3771</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> globalAmpInd = index;</div>
<div class="line"><a name="l03772"></a><span class="lineno"> 3772</span>  </div>
<div class="line"><a name="l03773"></a><span class="lineno"> 3773</span>  <span class="comment">/*</span></div>
<div class="line"><a name="l03774"></a><span class="lineno"> 3774</span> <span class="comment"> * each thread needs to write to a local:</span></div>
<div class="line"><a name="l03775"></a><span class="lineno"> 3775</span> <span class="comment"> * long long int phaseInds[numRegs];</span></div>
<div class="line"><a name="l03776"></a><span class="lineno"> 3776</span> <span class="comment"> * but instead has access to shared array phaseInds, with below stride and offset</span></div>
<div class="line"><a name="l03777"></a><span class="lineno"> 3777</span> <span class="comment"> */</span></div>
<div class="line"><a name="l03778"></a><span class="lineno"> 3778</span>  <span class="keywordtype">size_t</span> stride = gridDim.x*blockDim.x;</div>
<div class="line"><a name="l03779"></a><span class="lineno"> 3779</span>  <span class="keywordtype">size_t</span> offset = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l03780"></a><span class="lineno"> 3780</span>  </div>
<div class="line"><a name="l03781"></a><span class="lineno"> 3781</span>  <span class="comment">// determine phase indices</span></div>
<div class="line"><a name="l03782"></a><span class="lineno"> 3782</span>  <span class="keywordflow">if</span> (encoding == <a class="code" href="group__type.html#gga9c91c41aa42ae537995e89ffc616afe1a7165f9a47792f47c718ca128556fb3ae">UNSIGNED</a>) {</div>
<div class="line"><a name="l03783"></a><span class="lineno"> 3783</span>  <span class="keywordtype">int</span> flatInd = 0;</div>
<div class="line"><a name="l03784"></a><span class="lineno"> 3784</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++) {</div>
<div class="line"><a name="l03785"></a><span class="lineno"> 3785</span>  phaseInds[r*stride+offset] = 0LL;</div>
<div class="line"><a name="l03786"></a><span class="lineno"> 3786</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> q=0; q<numQubitsPerReg[r]; q++)</div>
<div class="line"><a name="l03787"></a><span class="lineno"> 3787</span>  phaseInds[r*stride+offset] += (1LL << q) * <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[flatInd++], globalAmpInd);</div>
<div class="line"><a name="l03788"></a><span class="lineno"> 3788</span>  }</div>
<div class="line"><a name="l03789"></a><span class="lineno"> 3789</span>  }</div>
<div class="line"><a name="l03790"></a><span class="lineno"> 3790</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (encoding == <a class="code" href="group__type.html#gga9c91c41aa42ae537995e89ffc616afe1a9aa2a35d92976c7de970506c4d19a96c">TWOS_COMPLEMENT</a>) {</div>
<div class="line"><a name="l03791"></a><span class="lineno"> 3791</span>  <span class="keywordtype">int</span> flatInd = 0;</div>
<div class="line"><a name="l03792"></a><span class="lineno"> 3792</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++) {</div>
<div class="line"><a name="l03793"></a><span class="lineno"> 3793</span>  phaseInds[r*stride+offset] = 0LL;</div>
<div class="line"><a name="l03794"></a><span class="lineno"> 3794</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> q=0; q<numQubitsPerReg[r]-1; q++) </div>
<div class="line"><a name="l03795"></a><span class="lineno"> 3795</span>  phaseInds[r*stride+offset] += (1LL << q) * <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[flatInd++], globalAmpInd);</div>
<div class="line"><a name="l03796"></a><span class="lineno"> 3796</span>  <span class="comment">// use final qubit to indicate sign</span></div>
<div class="line"><a name="l03797"></a><span class="lineno"> 3797</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[flatInd++], globalAmpInd) == 1)</div>
<div class="line"><a name="l03798"></a><span class="lineno"> 3798</span>  phaseInds[r*stride+offset] -= (1LL << (numQubitsPerReg[r]-1));</div>
<div class="line"><a name="l03799"></a><span class="lineno"> 3799</span>  }</div>
<div class="line"><a name="l03800"></a><span class="lineno"> 3800</span>  }</div>
<div class="line"><a name="l03801"></a><span class="lineno"> 3801</span>  </div>
<div class="line"><a name="l03802"></a><span class="lineno"> 3802</span>  <span class="comment">// determine if this phase index has an overriden value (i < numOverrides)</span></div>
<div class="line"><a name="l03803"></a><span class="lineno"> 3803</span>  <span class="keywordtype">int</span> i;</div>
<div class="line"><a name="l03804"></a><span class="lineno"> 3804</span>  <span class="keywordflow">for</span> (i=0; i<numOverrides; i++) {</div>
<div class="line"><a name="l03805"></a><span class="lineno"> 3805</span>  <span class="keywordtype">int</span> found = 1;</div>
<div class="line"><a name="l03806"></a><span class="lineno"> 3806</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++) {</div>
<div class="line"><a name="l03807"></a><span class="lineno"> 3807</span>  <span class="keywordflow">if</span> (phaseInds[r*stride+offset] != overrideInds[i*numRegs+r]) {</div>
<div class="line"><a name="l03808"></a><span class="lineno"> 3808</span>  found = 0;</div>
<div class="line"><a name="l03809"></a><span class="lineno"> 3809</span>  <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l03810"></a><span class="lineno"> 3810</span>  }</div>
<div class="line"><a name="l03811"></a><span class="lineno"> 3811</span>  }</div>
<div class="line"><a name="l03812"></a><span class="lineno"> 3812</span>  <span class="keywordflow">if</span> (found)</div>
<div class="line"><a name="l03813"></a><span class="lineno"> 3813</span>  <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l03814"></a><span class="lineno"> 3814</span>  }</div>
<div class="line"><a name="l03815"></a><span class="lineno"> 3815</span>  </div>
<div class="line"><a name="l03816"></a><span class="lineno"> 3816</span>  <span class="comment">// compute the phase (unless overriden)</span></div>
<div class="line"><a name="l03817"></a><span class="lineno"> 3817</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> phase = 0;</div>
<div class="line"><a name="l03818"></a><span class="lineno"> 3818</span>  <span class="keywordflow">if</span> (i < numOverrides)</div>
<div class="line"><a name="l03819"></a><span class="lineno"> 3819</span>  phase = overridePhases[i];</div>
<div class="line"><a name="l03820"></a><span class="lineno"> 3820</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03821"></a><span class="lineno"> 3821</span>  <span class="comment">// compute norm related phases</span></div>
<div class="line"><a name="l03822"></a><span class="lineno"> 3822</span>  <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ae003ec1158e3a4e295616ced12af154e">NORM</a> || phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ad4c32e295c08ebe224e2c5ba6497f043">INVERSE_NORM</a> ||</div>
<div class="line"><a name="l03823"></a><span class="lineno"> 3823</span>  phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a93c0c1e166dd43c6a57f61e5490808e1">SCALED_NORM</a> || phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ae8c96906c1ec109d295c491e572d01e2">SCALED_INVERSE_NORM</a> ||</div>
<div class="line"><a name="l03824"></a><span class="lineno"> 3824</span>  phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65aa318172feec5b530e9a7849f2f7b44e7">SCALED_INVERSE_SHIFTED_NORM</a>) {</div>
<div class="line"><a name="l03825"></a><span class="lineno"> 3825</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> norm = 0;</div>
<div class="line"><a name="l03826"></a><span class="lineno"> 3826</span>  <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65aa318172feec5b530e9a7849f2f7b44e7">SCALED_INVERSE_SHIFTED_NORM</a>) {</div>
<div class="line"><a name="l03827"></a><span class="lineno"> 3827</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++) {</div>
<div class="line"><a name="l03828"></a><span class="lineno"> 3828</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dif = phaseInds[r*stride+offset] - params[2+r];</div>
<div class="line"><a name="l03829"></a><span class="lineno"> 3829</span>  norm += dif*dif;</div>
<div class="line"><a name="l03830"></a><span class="lineno"> 3830</span>  }</div>
<div class="line"><a name="l03831"></a><span class="lineno"> 3831</span>  }</div>
<div class="line"><a name="l03832"></a><span class="lineno"> 3832</span>  <span class="keywordflow">else</span></div>
<div class="line"><a name="l03833"></a><span class="lineno"> 3833</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++)</div>
<div class="line"><a name="l03834"></a><span class="lineno"> 3834</span>  norm += phaseInds[r*stride+offset]*phaseInds[r*stride+offset];</div>
<div class="line"><a name="l03835"></a><span class="lineno"> 3835</span>  norm = sqrt(norm);</div>
<div class="line"><a name="l03836"></a><span class="lineno"> 3836</span>  </div>
<div class="line"><a name="l03837"></a><span class="lineno"> 3837</span>  <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ae003ec1158e3a4e295616ced12af154e">NORM</a>)</div>
<div class="line"><a name="l03838"></a><span class="lineno"> 3838</span>  phase = norm;</div>
<div class="line"><a name="l03839"></a><span class="lineno"> 3839</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ad4c32e295c08ebe224e2c5ba6497f043">INVERSE_NORM</a>)</div>
<div class="line"><a name="l03840"></a><span class="lineno"> 3840</span>  phase = (norm == 0.)? params[0] : 1/norm; <span class="comment">// smallest non-zero norm is 1</span></div>
<div class="line"><a name="l03841"></a><span class="lineno"> 3841</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a93c0c1e166dd43c6a57f61e5490808e1">SCALED_NORM</a>)</div>
<div class="line"><a name="l03842"></a><span class="lineno"> 3842</span>  phase = params[0] * norm;</div>
<div class="line"><a name="l03843"></a><span class="lineno"> 3843</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ae8c96906c1ec109d295c491e572d01e2">SCALED_INVERSE_NORM</a> || phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65aa318172feec5b530e9a7849f2f7b44e7">SCALED_INVERSE_SHIFTED_NORM</a>)</div>
<div class="line"><a name="l03844"></a><span class="lineno"> 3844</span>  phase = (norm <= REAL_EPS)? params[1] : params[0] / norm; <span class="comment">// unless shifted closer to zero</span></div>
<div class="line"><a name="l03845"></a><span class="lineno"> 3845</span>  }</div>
<div class="line"><a name="l03846"></a><span class="lineno"> 3846</span>  <span class="comment">// compute product related phases</span></div>
<div class="line"><a name="l03847"></a><span class="lineno"> 3847</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65acb6911398e0068f545a31b82bcdef3e4">PRODUCT</a> || phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65acb26952815118f5ced7703302dbeb556">INVERSE_PRODUCT</a> ||</div>
<div class="line"><a name="l03848"></a><span class="lineno"> 3848</span>  phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a31a29a30f92fe34c35098f941adbbc93">SCALED_PRODUCT</a> || phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a1a5168576607f460d3e60f184575cacb">SCALED_INVERSE_PRODUCT</a>) {</div>
<div class="line"><a name="l03849"></a><span class="lineno"> 3849</span>  </div>
<div class="line"><a name="l03850"></a><span class="lineno"> 3850</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prod = 1;</div>
<div class="line"><a name="l03851"></a><span class="lineno"> 3851</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++)</div>
<div class="line"><a name="l03852"></a><span class="lineno"> 3852</span>  prod *= phaseInds[r*stride+offset];</div>
<div class="line"><a name="l03853"></a><span class="lineno"> 3853</span>  </div>
<div class="line"><a name="l03854"></a><span class="lineno"> 3854</span>  <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65acb6911398e0068f545a31b82bcdef3e4">PRODUCT</a>)</div>
<div class="line"><a name="l03855"></a><span class="lineno"> 3855</span>  phase = prod;</div>
<div class="line"><a name="l03856"></a><span class="lineno"> 3856</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65acb26952815118f5ced7703302dbeb556">INVERSE_PRODUCT</a>)</div>
<div class="line"><a name="l03857"></a><span class="lineno"> 3857</span>  phase = (prod == 0.)? params[0] : 1/prod; <span class="comment">// smallest non-zero prod is +- 1</span></div>
<div class="line"><a name="l03858"></a><span class="lineno"> 3858</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a31a29a30f92fe34c35098f941adbbc93">SCALED_PRODUCT</a>)</div>
<div class="line"><a name="l03859"></a><span class="lineno"> 3859</span>  phase = params[0] * prod;</div>
<div class="line"><a name="l03860"></a><span class="lineno"> 3860</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a1a5168576607f460d3e60f184575cacb">SCALED_INVERSE_PRODUCT</a>)</div>
<div class="line"><a name="l03861"></a><span class="lineno"> 3861</span>  phase = (prod == 0.)? params[1] : params[0] / prod;</div>
<div class="line"><a name="l03862"></a><span class="lineno"> 3862</span>  }</div>
<div class="line"><a name="l03863"></a><span class="lineno"> 3863</span>  <span class="comment">// compute Euclidean distance related phases </span></div>
<div class="line"><a name="l03864"></a><span class="lineno"> 3864</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a2ad72f168181763513d7793c13bf2a91">DISTANCE</a> || phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a6313e6ff48163c11c47866c4fda4bfa0">INVERSE_DISTANCE</a> ||</div>
<div class="line"><a name="l03865"></a><span class="lineno"> 3865</span>  phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ace23d4b924240a245d83193f0ce398d4">SCALED_DISTANCE</a> || phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ae5114537389194302c7a619e35e6e227">SCALED_INVERSE_DISTANCE</a> ||</div>
<div class="line"><a name="l03866"></a><span class="lineno"> 3866</span>  phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a39111120b79016d6b3e773b711fa63f7">SCALED_INVERSE_SHIFTED_DISTANCE</a>) {</div>
<div class="line"><a name="l03867"></a><span class="lineno"> 3867</span>  </div>
<div class="line"><a name="l03868"></a><span class="lineno"> 3868</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dist = 0;</div>
<div class="line"><a name="l03869"></a><span class="lineno"> 3869</span>  <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a39111120b79016d6b3e773b711fa63f7">SCALED_INVERSE_SHIFTED_DISTANCE</a>) {</div>
<div class="line"><a name="l03870"></a><span class="lineno"> 3870</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r+=2) {</div>
<div class="line"><a name="l03871"></a><span class="lineno"> 3871</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dif = (phaseInds[r*stride+offset] - phaseInds[(r+1)*stride+offset] - params[2+r/2]);</div>
<div class="line"><a name="l03872"></a><span class="lineno"> 3872</span>  dist += dif*dif;</div>
<div class="line"><a name="l03873"></a><span class="lineno"> 3873</span>  }</div>
<div class="line"><a name="l03874"></a><span class="lineno"> 3874</span>  }</div>
<div class="line"><a name="l03875"></a><span class="lineno"> 3875</span>  <span class="keywordflow">else</span></div>
<div class="line"><a name="l03876"></a><span class="lineno"> 3876</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r+=2) {</div>
<div class="line"><a name="l03877"></a><span class="lineno"> 3877</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dif = (phaseInds[(r+1)*stride+offset] - phaseInds[r*stride+offset]);</div>
<div class="line"><a name="l03878"></a><span class="lineno"> 3878</span>  dist += dif*dif;</div>
<div class="line"><a name="l03879"></a><span class="lineno"> 3879</span>  }</div>
<div class="line"><a name="l03880"></a><span class="lineno"> 3880</span>  dist = sqrt(dist);</div>
<div class="line"><a name="l03881"></a><span class="lineno"> 3881</span>  </div>
<div class="line"><a name="l03882"></a><span class="lineno"> 3882</span>  <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a2ad72f168181763513d7793c13bf2a91">DISTANCE</a>)</div>
<div class="line"><a name="l03883"></a><span class="lineno"> 3883</span>  phase = dist;</div>
<div class="line"><a name="l03884"></a><span class="lineno"> 3884</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a6313e6ff48163c11c47866c4fda4bfa0">INVERSE_DISTANCE</a>)</div>
<div class="line"><a name="l03885"></a><span class="lineno"> 3885</span>  phase = (dist == 0.)? params[0] : 1/dist; <span class="comment">// smallest non-zero dist is 1</span></div>
<div class="line"><a name="l03886"></a><span class="lineno"> 3886</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ace23d4b924240a245d83193f0ce398d4">SCALED_DISTANCE</a>)</div>
<div class="line"><a name="l03887"></a><span class="lineno"> 3887</span>  phase = params[0] * dist;</div>
<div class="line"><a name="l03888"></a><span class="lineno"> 3888</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ae5114537389194302c7a619e35e6e227">SCALED_INVERSE_DISTANCE</a> || phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a39111120b79016d6b3e773b711fa63f7">SCALED_INVERSE_SHIFTED_DISTANCE</a>)</div>
<div class="line"><a name="l03889"></a><span class="lineno"> 3889</span>  phase = (dist <= REAL_EPS)? params[1] : params[0] / dist; <span class="comment">// unless shifted closer</span></div>
<div class="line"><a name="l03890"></a><span class="lineno"> 3890</span>  }</div>
<div class="line"><a name="l03891"></a><span class="lineno"> 3891</span>  }</div>
<div class="line"><a name="l03892"></a><span class="lineno"> 3892</span>  </div>
<div class="line"><a name="l03893"></a><span class="lineno"> 3893</span>  </div>
<div class="line"><a name="l03894"></a><span class="lineno"> 3894</span>  <span class="comment">// negate phase to conjugate operator </span></div>
<div class="line"><a name="l03895"></a><span class="lineno"> 3895</span>  <span class="keywordflow">if</span> (conj)</div>
<div class="line"><a name="l03896"></a><span class="lineno"> 3896</span>  phase *= -1;</div>
<div class="line"><a name="l03897"></a><span class="lineno"> 3897</span>  </div>
<div class="line"><a name="l03898"></a><span class="lineno"> 3898</span>  <span class="comment">// modify amp to amp * exp(i phase) </span></div>
<div class="line"><a name="l03899"></a><span class="lineno"> 3899</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> c = cos(phase);</div>
<div class="line"><a name="l03900"></a><span class="lineno"> 3900</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> s = sin(phase);</div>
<div class="line"><a name="l03901"></a><span class="lineno"> 3901</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index];</div>
<div class="line"><a name="l03902"></a><span class="lineno"> 3902</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> im = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index];</div>
<div class="line"><a name="l03903"></a><span class="lineno"> 3903</span>  </div>
<div class="line"><a name="l03904"></a><span class="lineno"> 3904</span>  <span class="comment">// = {re[amp] cos(phase) - im[amp] sin(phase)} + i {re[amp] sin(phase) + im[amp] cos(phase)}</span></div>
<div class="line"><a name="l03905"></a><span class="lineno"> 3905</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index] = re*c - im*s;</div>
<div class="line"><a name="l03906"></a><span class="lineno"> 3906</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index] = re*s + im*c;</div>
<div class="line"><a name="l03907"></a><span class="lineno"> 3907</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00234">DISTANCE</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00234">INVERSE_DISTANCE</a>, <a class="el" href="QuEST_8h_source.html#l00232">INVERSE_NORM</a>, <a class="el" href="QuEST_8h_source.html#l00233">INVERSE_PRODUCT</a>, <a class="el" href="QuEST_8h_source.html#l00232">NORM</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00233">PRODUCT</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST_8h_source.html#l00234">SCALED_DISTANCE</a>, <a class="el" href="QuEST_8h_source.html#l00234">SCALED_INVERSE_DISTANCE</a>, <a class="el" href="QuEST_8h_source.html#l00232">SCALED_INVERSE_NORM</a>, <a class="el" href="QuEST_8h_source.html#l00233">SCALED_INVERSE_PRODUCT</a>, <a class="el" href="QuEST_8h_source.html#l00234">SCALED_INVERSE_SHIFTED_DISTANCE</a>, <a class="el" href="QuEST_8h_source.html#l00232">SCALED_INVERSE_SHIFTED_NORM</a>, <a class="el" href="QuEST_8h_source.html#l00232">SCALED_NORM</a>, <a class="el" href="QuEST_8h_source.html#l00233">SCALED_PRODUCT</a>, <a class="el" href="QuEST_8h_source.html#l00269">TWOS_COMPLEMENT</a>, and <a class="el" href="QuEST_8h_source.html#l00269">UNSIGNED</a>.</p>
</div>
</div>
<a id="a9d7928473aca695a614e9c24d903e578"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9d7928473aca695a614e9c24d903e578">◆ </a></span>statevec_applyPhaseFuncOverrides()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_applyPhaseFuncOverrides </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>qubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">enum <a class="el" href="group__type.html#ga9c91c41aa42ae537995e89ffc616afe1">bitEncoding</a> </td>
<td class="paramname"><em>encoding</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>coeffs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>exponents</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numTerms</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int * </td>
<td class="paramname"><em>overrideInds</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>overridePhases</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numOverrides</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>conj</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03576">3576</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03581"></a><span class="lineno"> 3581</span>  {</div>
<div class="line"><a name="l03582"></a><span class="lineno"> 3582</span>  <span class="comment">// allocate device space for global list of {qubits}, {coeffs}, {exponents}, {overrideInds} and {overridePhases}</span></div>
<div class="line"><a name="l03583"></a><span class="lineno"> 3583</span>  <span class="keywordtype">int</span>* d_qubits; <span class="keywordtype">size_t</span> mem_qubits = numQubits * <span class="keyword">sizeof</span> *d_qubits;</div>
<div class="line"><a name="l03584"></a><span class="lineno"> 3584</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_coeffs; <span class="keywordtype">size_t</span> mem_terms = numTerms * <span class="keyword">sizeof</span> *d_coeffs;</div>
<div class="line"><a name="l03585"></a><span class="lineno"> 3585</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_exponents; </div>
<div class="line"><a name="l03586"></a><span class="lineno"> 3586</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span>* d_overrideInds; <span class="keywordtype">size_t</span> mem_inds = numOverrides * <span class="keyword">sizeof</span> *d_overrideInds;</div>
<div class="line"><a name="l03587"></a><span class="lineno"> 3587</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_overridePhases; <span class="keywordtype">size_t</span> mem_phas = numOverrides * <span class="keyword">sizeof</span> *d_overridePhases;</div>
<div class="line"><a name="l03588"></a><span class="lineno"> 3588</span>  cudaMalloc(&d_qubits, mem_qubits); cudaMemcpy(d_qubits, qubits, mem_qubits, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03589"></a><span class="lineno"> 3589</span>  cudaMalloc(&d_coeffs, mem_terms); cudaMemcpy(d_coeffs, coeffs, mem_terms, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03590"></a><span class="lineno"> 3590</span>  cudaMalloc(&d_exponents, mem_terms); cudaMemcpy(d_exponents, exponents, mem_terms, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03591"></a><span class="lineno"> 3591</span>  cudaMalloc(&d_overrideInds, mem_inds); cudaMemcpy(d_overrideInds, overrideInds, mem_inds, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03592"></a><span class="lineno"> 3592</span>  cudaMalloc(&d_overridePhases,mem_phas); cudaMemcpy(d_overridePhases, overridePhases, mem_phas, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03593"></a><span class="lineno"> 3593</span>  </div>
<div class="line"><a name="l03594"></a><span class="lineno"> 3594</span>  <span class="comment">// call kernel</span></div>
<div class="line"><a name="l03595"></a><span class="lineno"> 3595</span>  <span class="keywordtype">int</span> threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l03596"></a><span class="lineno"> 3596</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> / threadsPerCUDABlock);</div>
<div class="line"><a name="l03597"></a><span class="lineno"> 3597</span>  statevec_applyPhaseFuncOverridesKernel<<<CUDABlocks,threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l03598"></a><span class="lineno"> 3598</span>  qureg, d_qubits, numQubits, encoding, </div>
<div class="line"><a name="l03599"></a><span class="lineno"> 3599</span>  d_coeffs, d_exponents, numTerms, </div>
<div class="line"><a name="l03600"></a><span class="lineno"> 3600</span>  d_overrideInds, d_overridePhases, numOverrides,</div>
<div class="line"><a name="l03601"></a><span class="lineno"> 3601</span>  conj);</div>
<div class="line"><a name="l03602"></a><span class="lineno"> 3602</span>  </div>
<div class="line"><a name="l03603"></a><span class="lineno"> 3603</span>  <span class="comment">// cleanup device memory </span></div>
<div class="line"><a name="l03604"></a><span class="lineno"> 3604</span>  cudaFree(d_qubits);</div>
<div class="line"><a name="l03605"></a><span class="lineno"> 3605</span>  cudaFree(d_coeffs);</div>
<div class="line"><a name="l03606"></a><span class="lineno"> 3606</span>  cudaFree(d_exponents);</div>
<div class="line"><a name="l03607"></a><span class="lineno"> 3607</span>  cudaFree(d_overrideInds);</div>
<div class="line"><a name="l03608"></a><span class="lineno"> 3608</span>  cudaFree(d_overridePhases);</div>
<div class="line"><a name="l03609"></a><span class="lineno"> 3609</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00726">applyPhaseFunc()</a>, and <a class="el" href="QuEST_8c_source.html#l00743">applyPhaseFuncOverrides()</a>.</p>
</div>
</div>
<a id="af6f0087743a115ed303cd4733b9f9494"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af6f0087743a115ed303cd4733b9f9494">◆ </a></span>statevec_applyPhaseFuncOverridesKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_applyPhaseFuncOverridesKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>qubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">enum <a class="el" href="group__type.html#ga9c91c41aa42ae537995e89ffc616afe1">bitEncoding</a> </td>
<td class="paramname"><em>encoding</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>coeffs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>exponents</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numTerms</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int * </td>
<td class="paramname"><em>overrideInds</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>overridePhases</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numOverrides</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>conj</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03522">3522</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03527"></a><span class="lineno"> 3527</span>  {</div>
<div class="line"><a name="l03528"></a><span class="lineno"> 3528</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="l03529"></a><span class="lineno"> 3529</span>  <span class="keywordflow">if</span> (index>=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03530"></a><span class="lineno"> 3530</span>  </div>
<div class="line"><a name="l03531"></a><span class="lineno"> 3531</span>  <span class="comment">// determine global amplitude index (non-distributed, so it's just local index)</span></div>
<div class="line"><a name="l03532"></a><span class="lineno"> 3532</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> globalAmpInd = index;</div>
<div class="line"><a name="l03533"></a><span class="lineno"> 3533</span>  </div>
<div class="line"><a name="l03534"></a><span class="lineno"> 3534</span>  <span class="comment">// determine phase index of {qubits}</span></div>
<div class="line"><a name="l03535"></a><span class="lineno"> 3535</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> phaseInd = 0LL;</div>
<div class="line"><a name="l03536"></a><span class="lineno"> 3536</span>  <span class="keywordflow">if</span> (encoding == <a class="code" href="group__type.html#gga9c91c41aa42ae537995e89ffc616afe1a7165f9a47792f47c718ca128556fb3ae">UNSIGNED</a>) {</div>
<div class="line"><a name="l03537"></a><span class="lineno"> 3537</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> q=0; q<numQubits; q++)</div>
<div class="line"><a name="l03538"></a><span class="lineno"> 3538</span>  phaseInd += (1LL << q) * <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[q], globalAmpInd);</div>
<div class="line"><a name="l03539"></a><span class="lineno"> 3539</span>  }</div>
<div class="line"><a name="l03540"></a><span class="lineno"> 3540</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (encoding == <a class="code" href="group__type.html#gga9c91c41aa42ae537995e89ffc616afe1a9aa2a35d92976c7de970506c4d19a96c">TWOS_COMPLEMENT</a>) {</div>
<div class="line"><a name="l03541"></a><span class="lineno"> 3541</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> q=0; q<numQubits-1; q++) <span class="comment">// use final qubit to indicate sign </span></div>
<div class="line"><a name="l03542"></a><span class="lineno"> 3542</span>  phaseInd += (1LL << q) * <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[q], globalAmpInd);</div>
<div class="line"><a name="l03543"></a><span class="lineno"> 3543</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[numQubits-1], globalAmpInd) == 1)</div>
<div class="line"><a name="l03544"></a><span class="lineno"> 3544</span>  phaseInd -= (1LL << (numQubits-1));</div>
<div class="line"><a name="l03545"></a><span class="lineno"> 3545</span>  }</div>
<div class="line"><a name="l03546"></a><span class="lineno"> 3546</span>  </div>
<div class="line"><a name="l03547"></a><span class="lineno"> 3547</span>  <span class="comment">// determine if this phase index has an overriden value (i < numOverrides)</span></div>
<div class="line"><a name="l03548"></a><span class="lineno"> 3548</span>  <span class="keywordtype">int</span> i;</div>
<div class="line"><a name="l03549"></a><span class="lineno"> 3549</span>  <span class="keywordflow">for</span> (i=0; i<numOverrides; i++)</div>
<div class="line"><a name="l03550"></a><span class="lineno"> 3550</span>  <span class="keywordflow">if</span> (phaseInd == overrideInds[i])</div>
<div class="line"><a name="l03551"></a><span class="lineno"> 3551</span>  <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l03552"></a><span class="lineno"> 3552</span>  </div>
<div class="line"><a name="l03553"></a><span class="lineno"> 3553</span>  <span class="comment">// determine phase from {coeffs}, {exponents} (unless overriden)</span></div>
<div class="line"><a name="l03554"></a><span class="lineno"> 3554</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> phase = 0;</div>
<div class="line"><a name="l03555"></a><span class="lineno"> 3555</span>  <span class="keywordflow">if</span> (i < numOverrides)</div>
<div class="line"><a name="l03556"></a><span class="lineno"> 3556</span>  phase = overridePhases[i];</div>
<div class="line"><a name="l03557"></a><span class="lineno"> 3557</span>  <span class="keywordflow">else</span></div>
<div class="line"><a name="l03558"></a><span class="lineno"> 3558</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t=0; t<numTerms; t++)</div>
<div class="line"><a name="l03559"></a><span class="lineno"> 3559</span>  phase += coeffs[t] * pow(phaseInd, exponents[t]);</div>
<div class="line"><a name="l03560"></a><span class="lineno"> 3560</span>  </div>
<div class="line"><a name="l03561"></a><span class="lineno"> 3561</span>  <span class="comment">// negate phase to conjugate operator </span></div>
<div class="line"><a name="l03562"></a><span class="lineno"> 3562</span>  <span class="keywordflow">if</span> (conj)</div>
<div class="line"><a name="l03563"></a><span class="lineno"> 3563</span>  phase *= -1;</div>
<div class="line"><a name="l03564"></a><span class="lineno"> 3564</span>  </div>
<div class="line"><a name="l03565"></a><span class="lineno"> 3565</span>  <span class="comment">// modify amp to amp * exp(i phase) </span></div>
<div class="line"><a name="l03566"></a><span class="lineno"> 3566</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> c = cos(phase);</div>
<div class="line"><a name="l03567"></a><span class="lineno"> 3567</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> s = sin(phase);</div>
<div class="line"><a name="l03568"></a><span class="lineno"> 3568</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index];</div>
<div class="line"><a name="l03569"></a><span class="lineno"> 3569</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> im = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index];</div>
<div class="line"><a name="l03570"></a><span class="lineno"> 3570</span>  </div>
<div class="line"><a name="l03571"></a><span class="lineno"> 3571</span>  <span class="comment">// = {re[amp] cos(phase) - im[amp] sin(phase)} + i {re[amp] sin(phase) + im[amp] cos(phase)}</span></div>
<div class="line"><a name="l03572"></a><span class="lineno"> 3572</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index] = re*c - im*s;</div>
<div class="line"><a name="l03573"></a><span class="lineno"> 3573</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index] = re*s + im*c;</div>
<div class="line"><a name="l03574"></a><span class="lineno"> 3574</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST_8h_source.html#l00269">TWOS_COMPLEMENT</a>, and <a class="el" href="QuEST_8h_source.html#l00269">UNSIGNED</a>.</p>
</div>
</div>
<a id="a0fb948ddab4ca210e523aa3c52639df4"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0fb948ddab4ca210e523aa3c52639df4">◆ </a></span>statevec_calcExpecDiagonalOp()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="structComplex.html">Complex</a> statevec_calcExpecDiagonalOp </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structDiagonalOp.html">DiagonalOp</a> </td>
<td class="paramname"><em>op</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03276">3276</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03276"></a><span class="lineno"> 3276</span>  {</div>
<div class="line"><a name="l03277"></a><span class="lineno"> 3277</span>  </div>
<div class="line"><a name="l03278"></a><span class="lineno"> 3278</span>  <span class="comment">/* @TODO: remove all this reduction boilerplate from QuEST GPU </span></div>
<div class="line"><a name="l03279"></a><span class="lineno"> 3279</span> <span class="comment"> * (e.g. a func which accepts a pointer to do every-value reduction?)</span></div>
<div class="line"><a name="l03280"></a><span class="lineno"> 3280</span> <span class="comment"> */</span></div>
<div class="line"><a name="l03281"></a><span class="lineno"> 3281</span>  </div>
<div class="line"><a name="l03282"></a><span class="lineno"> 3282</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> expecReal, expecImag;</div>
<div class="line"><a name="l03283"></a><span class="lineno"> 3283</span>  </div>
<div class="line"><a name="l03284"></a><span class="lineno"> 3284</span>  <span class="keywordtype">int</span> getRealComp;</div>
<div class="line"><a name="l03285"></a><span class="lineno"> 3285</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce;</div>
<div class="line"><a name="l03286"></a><span class="lineno"> 3286</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l03287"></a><span class="lineno"> 3287</span>  <span class="keywordtype">int</span> maxReducedPerLevel;</div>
<div class="line"><a name="l03288"></a><span class="lineno"> 3288</span>  <span class="keywordtype">int</span> firstTime;</div>
<div class="line"><a name="l03289"></a><span class="lineno"> 3289</span>  </div>
<div class="line"><a name="l03290"></a><span class="lineno"> 3290</span>  <span class="comment">// compute real component of inner product</span></div>
<div class="line"><a name="l03291"></a><span class="lineno"> 3291</span>  getRealComp = 1;</div>
<div class="line"><a name="l03292"></a><span class="lineno"> 3292</span>  numValuesToReduce = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03293"></a><span class="lineno"> 3293</span>  maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l03294"></a><span class="lineno"> 3294</span>  firstTime = 1;</div>
<div class="line"><a name="l03295"></a><span class="lineno"> 3295</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l03296"></a><span class="lineno"> 3296</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l03297"></a><span class="lineno"> 3297</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l03298"></a><span class="lineno"> 3298</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l03299"></a><span class="lineno"> 3299</span>  }</div>
<div class="line"><a name="l03300"></a><span class="lineno"> 3300</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03301"></a><span class="lineno"> 3301</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l03302"></a><span class="lineno"> 3302</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l03303"></a><span class="lineno"> 3303</span>  }</div>
<div class="line"><a name="l03304"></a><span class="lineno"> 3304</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l03305"></a><span class="lineno"> 3305</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l03306"></a><span class="lineno"> 3306</span>  statevec_calcExpecDiagonalOpKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l03307"></a><span class="lineno"> 3307</span>  getRealComp,</div>
<div class="line"><a name="l03308"></a><span class="lineno"> 3308</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="l03309"></a><span class="lineno"> 3309</span>  op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real, op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag, </div>
<div class="line"><a name="l03310"></a><span class="lineno"> 3310</span>  numValuesToReduce, </div>
<div class="line"><a name="l03311"></a><span class="lineno"> 3311</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l03312"></a><span class="lineno"> 3312</span>  firstTime = 0;</div>
<div class="line"><a name="l03313"></a><span class="lineno"> 3313</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03314"></a><span class="lineno"> 3314</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l03315"></a><span class="lineno"> 3315</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l03316"></a><span class="lineno"> 3316</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l03317"></a><span class="lineno"> 3317</span>  qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l03318"></a><span class="lineno"> 3318</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l03319"></a><span class="lineno"> 3319</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="l03320"></a><span class="lineno"> 3320</span>  }</div>
<div class="line"><a name="l03321"></a><span class="lineno"> 3321</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l03322"></a><span class="lineno"> 3322</span>  }</div>
<div class="line"><a name="l03323"></a><span class="lineno"> 3323</span>  cudaMemcpy(&expecReal, 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="l03324"></a><span class="lineno"> 3324</span>  </div>
<div class="line"><a name="l03325"></a><span class="lineno"> 3325</span>  <span class="comment">// compute imag component of inner product</span></div>
<div class="line"><a name="l03326"></a><span class="lineno"> 3326</span>  getRealComp = 0;</div>
<div class="line"><a name="l03327"></a><span class="lineno"> 3327</span>  numValuesToReduce = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03328"></a><span class="lineno"> 3328</span>  maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l03329"></a><span class="lineno"> 3329</span>  firstTime = 1;</div>
<div class="line"><a name="l03330"></a><span class="lineno"> 3330</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l03331"></a><span class="lineno"> 3331</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l03332"></a><span class="lineno"> 3332</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l03333"></a><span class="lineno"> 3333</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l03334"></a><span class="lineno"> 3334</span>  }</div>
<div class="line"><a name="l03335"></a><span class="lineno"> 3335</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03336"></a><span class="lineno"> 3336</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l03337"></a><span class="lineno"> 3337</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l03338"></a><span class="lineno"> 3338</span>  }</div>
<div class="line"><a name="l03339"></a><span class="lineno"> 3339</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l03340"></a><span class="lineno"> 3340</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l03341"></a><span class="lineno"> 3341</span>  statevec_calcExpecDiagonalOpKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l03342"></a><span class="lineno"> 3342</span>  getRealComp,</div>
<div class="line"><a name="l03343"></a><span class="lineno"> 3343</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="l03344"></a><span class="lineno"> 3344</span>  op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real, op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag, </div>
<div class="line"><a name="l03345"></a><span class="lineno"> 3345</span>  numValuesToReduce, </div>
<div class="line"><a name="l03346"></a><span class="lineno"> 3346</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l03347"></a><span class="lineno"> 3347</span>  firstTime = 0;</div>
<div class="line"><a name="l03348"></a><span class="lineno"> 3348</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03349"></a><span class="lineno"> 3349</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l03350"></a><span class="lineno"> 3350</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l03351"></a><span class="lineno"> 3351</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l03352"></a><span class="lineno"> 3352</span>  qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l03353"></a><span class="lineno"> 3353</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l03354"></a><span class="lineno"> 3354</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="l03355"></a><span class="lineno"> 3355</span>  }</div>
<div class="line"><a name="l03356"></a><span class="lineno"> 3356</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l03357"></a><span class="lineno"> 3357</span>  }</div>
<div class="line"><a name="l03358"></a><span class="lineno"> 3358</span>  cudaMemcpy(&expecImag, 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="l03359"></a><span class="lineno"> 3359</span>  </div>
<div class="line"><a name="l03360"></a><span class="lineno"> 3360</span>  <span class="comment">// return complex</span></div>
<div class="line"><a name="l03361"></a><span class="lineno"> 3361</span>  <a class="code" href="structComplex.html">Complex</a> expecVal;</div>
<div class="line"><a name="l03362"></a><span class="lineno"> 3362</span>  expecVal.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a> = expecReal;</div>
<div class="line"><a name="l03363"></a><span class="lineno"> 3363</span>  expecVal.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a> = expecImag;</div>
<div class="line"><a name="l03364"></a><span class="lineno"> 3364</span>  <span class="keywordflow">return</span> expecVal;</div>
<div class="line"><a name="l03365"></a><span class="lineno"> 3365</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l01951">copySharedReduceBlock()</a>, <a class="el" href="QuEST_8h_source.html#l00312">DiagonalOp::deviceOperator</a>, <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::firstLevelReduction</a>, <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00019">REDUCE_SHARED_SIZE</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::secondLevelReduction</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l02057">swapDouble()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01228">calcExpecDiagonalOp()</a>.</p>
</div>
</div>
<a id="a34c5af075a18c7d6513a3d41284f1ab3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a34c5af075a18c7d6513a3d41284f1ab3">◆ </a></span>statevec_calcExpecDiagonalOpKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_calcExpecDiagonalOpKernel </td>
<td>(</td>
<td class="paramtype">int </td>
<td class="paramname"><em>getRealComp</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>opReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>opImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numTermsToSum</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>computes either a real or imag term of |vec_i|^2 op_i </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03249">3249</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03253"></a><span class="lineno"> 3253</span> {</div>
<div class="line"><a name="l03254"></a><span class="lineno"> 3254</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="l03255"></a><span class="lineno"> 3255</span>  <span class="keywordflow">if</span> (index >= numTermsToSum) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03256"></a><span class="lineno"> 3256</span>  </div>
<div class="line"><a name="l03257"></a><span class="lineno"> 3257</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> vecAbs = vecReal[index]*vecReal[index] + vecImag[index]*vecImag[index];</div>
<div class="line"><a name="l03258"></a><span class="lineno"> 3258</span>  </div>
<div class="line"><a name="l03259"></a><span class="lineno"> 3259</span>  <span class="comment">// choose whether to calculate the real or imaginary term of the expec term</span></div>
<div class="line"><a name="l03260"></a><span class="lineno"> 3260</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> expecVal;</div>
<div class="line"><a name="l03261"></a><span class="lineno"> 3261</span>  <span class="keywordflow">if</span> (getRealComp)</div>
<div class="line"><a name="l03262"></a><span class="lineno"> 3262</span>  expecVal = vecAbs * opReal[index];</div>
<div class="line"><a name="l03263"></a><span class="lineno"> 3263</span>  <span class="keywordflow">else</span></div>
<div class="line"><a name="l03264"></a><span class="lineno"> 3264</span>  expecVal = vecAbs * opImag[index];</div>
<div class="line"><a name="l03265"></a><span class="lineno"> 3265</span>  </div>
<div class="line"><a name="l03266"></a><span class="lineno"> 3266</span>  <span class="comment">// array of each thread's collected sum term, to be summed</span></div>
<div class="line"><a name="l03267"></a><span class="lineno"> 3267</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l03268"></a><span class="lineno"> 3268</span>  tempReductionArray[threadIdx.x] = expecVal;</div>
<div class="line"><a name="l03269"></a><span class="lineno"> 3269</span>  __syncthreads();</div>
<div class="line"><a name="l03270"></a><span class="lineno"> 3270</span>  </div>
<div class="line"><a name="l03271"></a><span class="lineno"> 3271</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l03272"></a><span class="lineno"> 3272</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l03273"></a><span class="lineno"> 3273</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l03274"></a><span class="lineno"> 3274</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01932">reduceBlock()</a>.</p>
</div>
</div>
<a id="a7ebd3198a198f4cd20840f64fd8b84d0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7ebd3198a198f4cd20840f64fd8b84d0">◆ </a></span>statevec_calcInnerProduct()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="structComplex.html">Complex</a> statevec_calcInnerProduct </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>bra</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>ket</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Terrible code which unnecessarily individually computes and sums the real and imaginary components of the inner product, so as to not have to worry about keeping the sums separated during reduction. </p>
<p>Truly disgusting, probably doubles runtime, please fix. </p><dl class="todo"><dt><b><a class="el" href="todo.html#_todo000003">Todo:</a></b></dt><dd>could even do the kernel twice, storing real in bra.reduc and imag in ket.reduc? </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02393">2393</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>  {</div>
<div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>  </div>
<div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> innerProdReal, innerProdImag;</div>
<div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>  </div>
<div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>  <span class="keywordtype">int</span> getRealComp;</div>
<div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce;</div>
<div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>  <span class="keywordtype">int</span> maxReducedPerLevel;</div>
<div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>  <span class="keywordtype">int</span> firstTime;</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">// compute real component of inner product</span></div>
<div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>  getRealComp = 1;</div>
<div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>  numValuesToReduce = bra.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>  maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>  firstTime = 1;</div>
<div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>  }</div>
<div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>  }</div>
<div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>  statevec_calcInnerProductKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>  getRealComp,</div>
<div class="line"><a name="l02421"></a><span class="lineno"> 2421</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="l02422"></a><span class="lineno"> 2422</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="l02423"></a><span class="lineno"> 2423</span>  numValuesToReduce, </div>
<div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>  bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>  firstTime = 0;</div>
<div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>  bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>  bra.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02432"></a><span class="lineno"> 2432</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="l02433"></a><span class="lineno"> 2433</span>  }</div>
<div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</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>  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="l02437"></a><span class="lineno"> 2437</span>  </div>
<div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>  <span class="comment">// compute imag component of inner product</span></div>
<div class="line"><a name="l02439"></a><span class="lineno"> 2439</span>  getRealComp = 0;</div>
<div class="line"><a name="l02440"></a><span class="lineno"> 2440</span>  numValuesToReduce = bra.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02441"></a><span class="lineno"> 2441</span>  maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>  firstTime = 1;</div>
<div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02446"></a><span class="lineno"> 2446</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>  }</div>
<div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02449"></a><span class="lineno"> 2449</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l02450"></a><span class="lineno"> 2450</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</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>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02454"></a><span class="lineno"> 2454</span>  statevec_calcInnerProductKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>  getRealComp,</div>
<div class="line"><a name="l02456"></a><span class="lineno"> 2456</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="l02457"></a><span class="lineno"> 2457</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="l02458"></a><span class="lineno"> 2458</span>  numValuesToReduce, </div>
<div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>  bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>  firstTime = 0;</div>
<div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>  bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>  bra.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02467"></a><span class="lineno"> 2467</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="l02468"></a><span class="lineno"> 2468</span>  }</div>
<div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>  }</div>
<div class="line"><a name="l02471"></a><span class="lineno"> 2471</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="l02472"></a><span class="lineno"> 2472</span>  </div>
<div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>  <span class="comment">// return complex</span></div>
<div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>  <a class="code" href="structComplex.html">Complex</a> innerProd;</div>
<div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>  innerProd.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a> = innerProdReal;</div>
<div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>  innerProd.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a> = innerProdImag;</div>
<div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>  <span class="keywordflow">return</span> innerProd;</div>
<div class="line"><a name="l02478"></a><span class="lineno"> 2478</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l01951">copySharedReduceBlock()</a>, <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::firstLevelReduction</a>, <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00019">REDUCE_SHARED_SIZE</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::secondLevelReduction</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l02057">swapDouble()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01150">calcInnerProduct()</a>, <a class="el" href="QuEST__common_8c_source.html#l00509">statevec_calcExpecPauliProd()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00380">statevec_calcFidelity()</a>.</p>
</div>
</div>
<a id="a4f3c49fa4904bb120bbb6ae2e6395dfd"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4f3c49fa4904bb120bbb6ae2e6395dfd">◆ </a></span>statevec_calcInnerProductKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_calcInnerProductKernel </td>
<td>(</td>
<td class="paramtype">int </td>
<td class="paramname"><em>getRealComp</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecReal1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecImag1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecReal2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecImag2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numTermsToSum</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>computes either a real or imag term in the inner product </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02363">2363</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02367"></a><span class="lineno"> 2367</span> {</div>
<div class="line"><a name="l02368"></a><span class="lineno"> 2368</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="l02369"></a><span class="lineno"> 2369</span>  <span class="keywordflow">if</span> (index >= numTermsToSum) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>  </div>
<div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>  <span class="comment">// choose whether to calculate the real or imaginary term of the inner product</span></div>
<div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> innerProdTerm;</div>
<div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>  <span class="keywordflow">if</span> (getRealComp)</div>
<div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>  innerProdTerm = vecReal1[index]*vecReal2[index] + vecImag1[index]*vecImag2[index];</div>
<div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>  <span class="keywordflow">else</span></div>
<div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>  innerProdTerm = vecReal1[index]*vecImag2[index] - vecImag1[index]*vecReal2[index];</div>
<div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>  </div>
<div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>  <span class="comment">// array of each thread's collected sum term, to be summed</span></div>
<div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>  tempReductionArray[threadIdx.x] = innerProdTerm;</div>
<div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>  __syncthreads();</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>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l02386"></a><span class="lineno"> 2386</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01932">reduceBlock()</a>.</p>
</div>
</div>
<a id="afd14cca643241a991ac172a826311eca"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afd14cca643241a991ac172a826311eca">◆ </a></span>statevec_calcProbOfAllOutcomes()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_calcProbOfAllOutcomes </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>outcomeProbs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>qubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numQubits</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02207">2207</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>  {</div>
<div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>  </div>
<div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>  <span class="comment">// copy qubits to GPU memory</span></div>
<div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>  <span class="keywordtype">int</span>* d_qubits;</div>
<div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>  <span class="keywordtype">size_t</span> mem_qubits = numQubits * <span class="keyword">sizeof</span> *d_qubits;</div>
<div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>  cudaMalloc(&d_qubits, mem_qubits);</div>
<div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>  cudaMemcpy(d_qubits, qubits, mem_qubits, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>  </div>
<div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>  <span class="comment">// create one thread for every amplitude</span></div>
<div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>  <span class="keywordtype">int</span> numThreadsPerBlock = 128;</div>
<div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>  <span class="keywordtype">int</span> numBlocks = ceil(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) numThreadsPerBlock);</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">// create global GPU array for outcomeProbs</span></div>
<div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_outcomeProbs;</div>
<div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numOutcomes = (1LL << numQubits);</div>
<div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>  <span class="keywordtype">size_t</span> mem_outcomeProbs = numOutcomes * <span class="keyword">sizeof</span> *d_outcomeProbs;</div>
<div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>  cudaMalloc(&d_outcomeProbs, mem_outcomeProbs);</div>
<div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>  cudaMemset(d_outcomeProbs, 0, mem_outcomeProbs);</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">// populate per-block subarrays</span></div>
<div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>  statevec_calcProbOfAllOutcomesKernel<<<numBlocks, numThreadsPerBlock>>>(</div>
<div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>  d_outcomeProbs, qureg, d_qubits, numQubits);</div>
<div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>  </div>
<div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>  <span class="comment">// copy outcomeProbs from GPU memory</span></div>
<div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>  cudaMemcpy(outcomeProbs, d_outcomeProbs, mem_outcomeProbs, cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>  </div>
<div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>  <span class="comment">// free GPU memory</span></div>
<div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>  cudaFree(d_qubits);</div>
<div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>  cudaFree(d_outcomeProbs);</div>
<div class="line"><a name="l02236"></a><span class="lineno"> 2236</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01176">calcProbOfAllOutcomes()</a>.</p>
</div>
</div>
<a id="ab2ffd422f8c4e334277263bb4efe2a61"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab2ffd422f8c4e334277263bb4efe2a61">◆ </a></span>statevec_calcProbOfAllOutcomesKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_calcProbOfAllOutcomesKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>outcomeProbs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>qubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numQubits</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02186">2186</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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">// each thread handles one amplitude (all amplitudes are involved)</span></div>
<div class="line"><a name="l02190"></a><span class="lineno"> 2190</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="l02191"></a><span class="lineno"> 2191</span>  <span class="keywordflow">if</span> (ampInd >= qureg.<a class="code" href="structQureg.html#adef4935cac95763c29164cf99b144ed4">numAmpsTotal</a>) <span class="keywordflow">return</span>;</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>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prob = (</div>
<div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[ampInd]*qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[ampInd] + </div>
<div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[ampInd]*qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[ampInd]);</div>
<div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>  </div>
<div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>  <span class="comment">// each amplitude contributes to one outcome</span></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> outcomeInd = 0;</div>
<div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> q=0; q<numQubits; q++)</div>
<div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>  outcomeInd += <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[q], ampInd) * (1LL << q);</div>
<div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>  </div>
<div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>  <span class="comment">// each thread atomically writes directly to the global output.</span></div>
<div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>  <span class="comment">// this beat block-heirarchal atomic reductions in both global and shared memory!</span></div>
<div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>  atomicAdd(&outcomeProbs[outcomeInd], prob);</div>
<div class="line"><a name="l02205"></a><span class="lineno"> 2205</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00334">Qureg::numAmpsTotal</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a63cb88a5f4eb12fef087435b8db3f8eb"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a63cb88a5f4eb12fef087435b8db3f8eb">◆ </a></span>statevec_calcProbOfOutcome()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> statevec_calcProbOfOutcome </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>measureQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>outcome</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02150">2150</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02151"></a><span class="lineno"> 2151</span> {</div>
<div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb = <a class="code" href="QuEST__gpu_8cu.html#a5a34c2468f9c21c35ccca1b5e491e238">statevec_findProbabilityOfZero</a>(qureg, measureQubit);</div>
<div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>  <span class="keywordflow">if</span> (outcome==1)</div>
<div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>  outcomeProb = 1.0 - outcomeProb;</div>
<div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>  <span class="keywordflow">return</span> outcomeProb;</div>
<div class="line"><a name="l02156"></a><span class="lineno"> 2156</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l02112">statevec_findProbabilityOfZero()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01166">calcProbOfOutcome()</a>, <a class="el" href="QuEST_8c_source.html#l00966">collapseToOutcome()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00364">statevec_measureWithStats()</a>.</p>
</div>
</div>
<a id="ad65ad1b5ea6f30b0c6b4ffda96e1a8e6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad65ad1b5ea6f30b0c6b4ffda96e1a8e6">◆ </a></span>statevec_calcTotalProb()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> statevec_calcTotalProb </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01655">1655</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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">/* IJB - implemented using Kahan summation for greater accuracy at a slight floating</span></div>
<div class="line"><a name="l01657"></a><span class="lineno"> 1657</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="l01658"></a><span class="lineno"> 1658</span>  <span class="comment">/* Don't change the bracketing in this routine! */</span></div>
<div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> pTotal=0;</div>
<div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> y, t, c;</div>
<div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01662"></a><span class="lineno"> 1662</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="l01663"></a><span class="lineno"> 1663</span>  </div>
<div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(qureg);</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>  c = 0.0;</div>
<div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>  <span class="keywordflow">for</span> (index=0; index<numAmpsPerRank; index++){</div>
<div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>  <span class="comment">/* Perform pTotal+=qureg.stateVec.real[index]*qureg.stateVec.real[index]; by Kahan */</span></div>
<div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>  <span class="comment">// pTotal+=qureg.stateVec.real[index]*qureg.stateVec.real[index];</span></div>
<div class="line"><a name="l01670"></a><span class="lineno"> 1670</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="l01671"></a><span class="lineno"> 1671</span>  t = pTotal + y;</div>
<div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>  c = ( t - pTotal ) - y;</div>
<div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>  pTotal = t;</div>
<div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>  </div>
<div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>  <span class="comment">/* Perform pTotal+=qureg.stateVec.imag[index]*qureg.stateVec.imag[index]; by Kahan */</span></div>
<div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>  <span class="comment">//pTotal+=qureg.stateVec.imag[index]*qureg.stateVec.imag[index];</span></div>
<div class="line"><a name="l01677"></a><span class="lineno"> 1677</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="l01678"></a><span class="lineno"> 1678</span>  t = pTotal + y;</div>
<div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>  c = ( t - pTotal ) - y;</div>
<div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>  pTotal = t;</div>
<div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>  </div>
<div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>  </div>
<div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>  }</div>
<div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>  <span class="keywordflow">return</span> pTotal;</div>
<div class="line"><a name="l01685"></a><span class="lineno"> 1685</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l00529">copyStateFromGPU()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01143">calcTotalProb()</a>.</p>
</div>
</div>
<a id="aa4b77089145184d990848cd66993aa8b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa4b77089145184d990848cd66993aa8b">◆ </a></span>statevec_cloneQureg()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_cloneQureg </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>targetQureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>copyQureg</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>works for both statevectors and density matrices </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00170">170</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  {</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><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, and <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00164">cloneQureg()</a>, <a class="el" href="QuEST_8c_source.html#l00064">createCloneQureg()</a>, <a class="el" href="QuEST_8c_source.html#l00145">initPureState()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00509">statevec_calcExpecPauliProd()</a>.</p>
</div>
</div>
<a id="a008becc4a18f868340836e0ab9fd6df6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a008becc4a18f868340836e0ab9fd6df6">◆ </a></span>statevec_collapseToKnownProbOutcome()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_collapseToKnownProbOutcome </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>measureQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>outcome</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>outcomeProb</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02770">2770</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02771"></a><span class="lineno"> 2771</span> { </div>
<div class="line"><a name="l02772"></a><span class="lineno"> 2772</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02773"></a><span class="lineno"> 2773</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02774"></a><span class="lineno"> 2774</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="l02775"></a><span class="lineno"> 2775</span>  statevec_collapseToKnownProbOutcomeKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, measureQubit, outcome, outcomeProb);</div>
<div class="line"><a name="l02776"></a><span class="lineno"> 2776</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00888">applyProjector()</a>, <a class="el" href="QuEST_8c_source.html#l00966">collapseToOutcome()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00364">statevec_measureWithStats()</a>.</p>
</div>
</div>
<a id="a5d2202221eed63dc9b003d716a46e879"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5d2202221eed63dc9b003d716a46e879">◆ </a></span>statevec_collapseToKnownProbOutcomeKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_collapseToKnownProbOutcomeKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>measureQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>outcome</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>totalProbability</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02713">2713</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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="comment">// ----- sizes</span></div>
<div class="line"><a name="l02716"></a><span class="lineno"> 2716</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="l02717"></a><span class="lineno"> 2717</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l02718"></a><span class="lineno"> 2718</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l02719"></a><span class="lineno"> 2719</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="l02720"></a><span class="lineno"> 2720</span>  index; <span class="comment">// current index for first half block</span></div>
<div class="line"><a name="l02721"></a><span class="lineno"> 2721</span>  <span class="comment">// ----- measured probability</span></div>
<div class="line"><a name="l02722"></a><span class="lineno"> 2722</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="l02723"></a><span class="lineno"> 2723</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l02724"></a><span class="lineno"> 2724</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="l02725"></a><span class="lineno"> 2725</span>  <span class="comment">// (good for shared memory parallelism)</span></div>
<div class="line"><a name="l02726"></a><span class="lineno"> 2726</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="l02727"></a><span class="lineno"> 2727</span>  </div>
<div class="line"><a name="l02728"></a><span class="lineno"> 2728</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02729"></a><span class="lineno"> 2729</span>  <span class="comment">// dimensions //</span></div>
<div class="line"><a name="l02730"></a><span class="lineno"> 2730</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02731"></a><span class="lineno"> 2731</span>  sizeHalfBlock = 1LL << (measureQubit); <span class="comment">// number of state vector elements to sum,</span></div>
<div class="line"><a name="l02732"></a><span class="lineno"> 2732</span>  <span class="comment">// and then the number to skip</span></div>
<div class="line"><a name="l02733"></a><span class="lineno"> 2733</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks (pairs of measure and skip entries)</span></div>
<div class="line"><a name="l02734"></a><span class="lineno"> 2734</span>  </div>
<div class="line"><a name="l02735"></a><span class="lineno"> 2735</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02736"></a><span class="lineno"> 2736</span>  <span class="comment">// find probability //</span></div>
<div class="line"><a name="l02737"></a><span class="lineno"> 2737</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02738"></a><span class="lineno"> 2738</span>  </div>
<div class="line"><a name="l02739"></a><span class="lineno"> 2739</span>  <span class="comment">//</span></div>
<div class="line"><a name="l02740"></a><span class="lineno"> 2740</span>  <span class="comment">// --- task-based shared-memory parallel implementation</span></div>
<div class="line"><a name="l02741"></a><span class="lineno"> 2741</span>  <span class="comment">//</span></div>
<div class="line"><a name="l02742"></a><span class="lineno"> 2742</span>  renorm=1/sqrt(totalProbability);</div>
<div class="line"><a name="l02743"></a><span class="lineno"> 2743</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="l02744"></a><span class="lineno"> 2744</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="l02745"></a><span class="lineno"> 2745</span>  </div>
<div class="line"><a name="l02746"></a><span class="lineno"> 2746</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02747"></a><span class="lineno"> 2747</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02748"></a><span class="lineno"> 2748</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l02749"></a><span class="lineno"> 2749</span>  index = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l02750"></a><span class="lineno"> 2750</span>  </div>
<div class="line"><a name="l02751"></a><span class="lineno"> 2751</span>  <span class="keywordflow">if</span> (outcome==0){</div>
<div class="line"><a name="l02752"></a><span class="lineno"> 2752</span>  stateVecReal[index]=stateVecReal[index]*renorm;</div>
<div class="line"><a name="l02753"></a><span class="lineno"> 2753</span>  stateVecImag[index]=stateVecImag[index]*renorm;</div>
<div class="line"><a name="l02754"></a><span class="lineno"> 2754</span>  </div>
<div class="line"><a name="l02755"></a><span class="lineno"> 2755</span>  stateVecReal[index+sizeHalfBlock]=0;</div>
<div class="line"><a name="l02756"></a><span class="lineno"> 2756</span>  stateVecImag[index+sizeHalfBlock]=0;</div>
<div class="line"><a name="l02757"></a><span class="lineno"> 2757</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (outcome==1){</div>
<div class="line"><a name="l02758"></a><span class="lineno"> 2758</span>  stateVecReal[index]=0;</div>
<div class="line"><a name="l02759"></a><span class="lineno"> 2759</span>  stateVecImag[index]=0;</div>
<div class="line"><a name="l02760"></a><span class="lineno"> 2760</span>  </div>
<div class="line"><a name="l02761"></a><span class="lineno"> 2761</span>  stateVecReal[index+sizeHalfBlock]=stateVecReal[index+sizeHalfBlock]*renorm;</div>
<div class="line"><a name="l02762"></a><span class="lineno"> 2762</span>  stateVecImag[index+sizeHalfBlock]=stateVecImag[index+sizeHalfBlock]*renorm;</div>
<div class="line"><a name="l02763"></a><span class="lineno"> 2763</span>  }</div>
<div class="line"><a name="l02764"></a><span class="lineno"> 2764</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="aec63559e8b9ab0e17efe18d64d2ceca6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aec63559e8b9ab0e17efe18d64d2ceca6">◆ </a></span>statevec_compactUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_compactUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>alpha</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>beta</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00844">844</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00845"></a><span class="lineno"> 845</span> {</div>
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00848"></a><span class="lineno"> 848</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="l00849"></a><span class="lineno"> 849</span>  statevec_compactUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, alpha, beta);</div>
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00404">compactUnitary()</a>, <a class="el" href="QuEST__common_8c_source.html#l00414">statevec_multiRotatePauli()</a>, <a class="el" href="QuEST__common_8c_source.html#l00314">statevec_rotateAroundAxis()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00321">statevec_rotateAroundAxisConj()</a>.</p>
</div>
</div>
<a id="a4d5c3bc20e1fe6f36e1f92e6d030afc7"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4d5c3bc20e1fe6f36e1f92e6d030afc7">◆ </a></span>statevec_compactUnitaryKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_compactUnitaryKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>rotQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>alpha</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>beta</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>fix – no necessary for GPU version</p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00789">789</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00789"></a><span class="lineno"> 789</span>  {</div>
<div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l00791"></a><span class="lineno"> 791</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="l00792"></a><span class="lineno"> 792</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l00794"></a><span class="lineno"> 794</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="l00795"></a><span class="lineno"> 795</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</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"> 797</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00798"></a><span class="lineno"> 798</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="l00799"></a><span class="lineno"> 799</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00801"></a><span class="lineno"> 801</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="l00802"></a><span class="lineno"> 802</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="l00803"></a><span class="lineno"> 803</span>  </div>
<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  sizeHalfBlock = 1LL << rotQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l00806"></a><span class="lineno"> 806</span>  </div>
<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00808"></a><span class="lineno"> 808</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  </div>
<div class="line"><a name="l00812"></a><span class="lineno"> 812</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="l00813"></a><span class="lineno"> 813</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="l00814"></a><span class="lineno"> 814</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="l00815"></a><span class="lineno"> 815</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="l00816"></a><span class="lineno"> 816</span>  </div>
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00819"></a><span class="lineno"> 819</span>  </div>
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  </div>
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  </div>
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  </div>
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  <span class="comment">// state[indexUp] = alpha * state[indexUp] - conj(beta) * state[indexLo]</span></div>
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  stateVecReal[indexUp] = alphaReal*stateRealUp - alphaImag*stateImagUp </div>
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  - betaReal*stateRealLo - betaImag*stateImagLo;</div>
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  stateVecImag[indexUp] = alphaReal*stateImagUp + alphaImag*stateRealUp </div>
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  - betaReal*stateImagLo + betaImag*stateRealLo;</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[indexLo] = beta * state[indexUp] + conj(alpha) * state[indexLo]</span></div>
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  stateVecReal[indexLo] = betaReal*stateRealUp - betaImag*stateImagUp </div>
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>  + alphaReal*stateRealLo + alphaImag*stateImagLo;</div>
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  stateVecImag[indexLo] = betaReal*stateImagUp + betaImag*stateRealUp </div>
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  + alphaReal*stateImagLo - alphaImag*stateRealLo;</div>
<div class="line"><a name="l00842"></a><span class="lineno"> 842</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>.</p>
</div>
</div>
<a id="ae6cecbad32a03416138b321cdc1a2c33"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae6cecbad32a03416138b321cdc1a2c33">◆ </a></span>statevec_compareStates()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int statevec_compareStates </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>mq1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>mq2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>precision</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00771">771</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> diff;</div>
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  <span class="keywordtype">int</span> chunkSize = mq1.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</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>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(mq1);</div>
<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(mq2);</div>
<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  </div>
<div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i<chunkSize; i++){</div>
<div class="line"><a name="l00779"></a><span class="lineno"> 779</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="l00780"></a><span class="lineno"> 780</span>  <span class="keywordflow">if</span> (diff<0) diff *= -1;</div>
<div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  <span class="keywordflow">if</span> (diff>precision) <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00782"></a><span class="lineno"> 782</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="l00783"></a><span class="lineno"> 783</span>  <span class="keywordflow">if</span> (diff<0) diff *= -1;</div>
<div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  <span class="keywordflow">if</span> (diff>precision) <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  }</div>
<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l00787"></a><span class="lineno"> 787</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l00529">copyStateFromGPU()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01573">compareStates()</a>.</p>
</div>
</div>
<a id="a1275d604674224d87a173fb5bac78835"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1275d604674224d87a173fb5bac78835">◆ </a></span>statevec_controlledCompactUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledCompactUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>alpha</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>beta</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00911">911</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00912"></a><span class="lineno"> 912</span> {</div>
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00915"></a><span class="lineno"> 915</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="l00916"></a><span class="lineno"> 916</span>  statevec_controlledCompactUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit, alpha, beta);</div>
<div class="line"><a name="l00917"></a><span class="lineno"> 917</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00417">controlledCompactUnitary()</a>, <a class="el" href="QuEST__common_8c_source.html#l00330">statevec_controlledRotateAroundAxis()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00337">statevec_controlledRotateAroundAxisConj()</a>.</p>
</div>
</div>
<a id="ab1bc0bf471c4459dd845adbfac5ef857"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab1bc0bf471c4459dd845adbfac5ef857">◆ </a></span>statevec_controlledCompactUnitaryKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_controlledCompactUnitaryKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>alpha</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>beta</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>fix – no necessary for GPU version</p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00852">852</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00852"></a><span class="lineno"> 852</span>  {</div>
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l00854"></a><span class="lineno"> 854</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="l00855"></a><span class="lineno"> 855</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l00857"></a><span class="lineno"> 857</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="l00858"></a><span class="lineno"> 858</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  </div>
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00861"></a><span class="lineno"> 861</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="l00862"></a><span class="lineno"> 862</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  <span class="comment">// ----- temp variables</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; <span class="comment">// task based approach for expose loop with small granularity</span></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>>>1;</div>
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  <span class="keywordtype">int</span> controlBit;</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>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></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">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  </div>
<div class="line"><a name="l00876"></a><span class="lineno"> 876</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="l00877"></a><span class="lineno"> 877</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="l00878"></a><span class="lineno"> 878</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="l00879"></a><span class="lineno"> 879</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="l00880"></a><span class="lineno"> 880</span>  </div>
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span>  </div>
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  indexLo = indexUp + sizeHalfBlock;</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>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(controlQubit, indexUp);</div>
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  </div>
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>  </div>
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  <span class="comment">// state[indexUp] = alpha * state[indexUp] - conj(beta) * state[indexLo]</span></div>
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  stateVecReal[indexUp] = alphaReal*stateRealUp - alphaImag*stateImagUp </div>
<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>  - betaReal*stateRealLo - betaImag*stateImagLo;</div>
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  stateVecImag[indexUp] = alphaReal*stateImagUp + alphaImag*stateRealUp </div>
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  - betaReal*stateImagLo + betaImag*stateRealLo;</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">// state[indexLo] = beta * state[indexUp] + conj(alpha) * state[indexLo]</span></div>
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>  stateVecReal[indexLo] = betaReal*stateRealUp - betaImag*stateImagUp </div>
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  + alphaReal*stateRealLo + alphaImag*stateImagLo;</div>
<div class="line"><a name="l00906"></a><span class="lineno"> 906</span>  stateVecImag[indexLo] = betaReal*stateImagUp + betaImag*stateRealUp </div>
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>  + alphaReal*stateImagLo - alphaImag*stateRealLo;</div>
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  }</div>
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>.</p>
</div>
</div>
<a id="abb2eab4af99adcc59be24f4c91c6f6ad"></a>
<h2 class="memtitle"><span class="permalink"><a href="#abb2eab4af99adcc59be24f4c91c6f6ad">◆ </a></span>statevec_controlledNot()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledNot </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01873">1873</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01877"></a><span class="lineno"> 1877</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="l01878"></a><span class="lineno"> 1878</span>  statevec_controlledNotKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit);</div>
<div class="line"><a name="l01879"></a><span class="lineno"> 1879</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00524">controlledNot()</a>.</p>
</div>
</div>
<a id="ac15269559c1759a1a44971451874cea9"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac15269559c1759a1a44971451874cea9">◆ </a></span>statevec_controlledNotKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_controlledNotKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01834">1834</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01835"></a><span class="lineno"> 1835</span> {</div>
<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01837"></a><span class="lineno"> 1837</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="l01838"></a><span class="lineno"> 1838</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>  </div>
<div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01843"></a><span class="lineno"> 1843</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="l01844"></a><span class="lineno"> 1844</span>  stateImagUp; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l01845"></a><span class="lineno"> 1845</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="l01846"></a><span class="lineno"> 1846</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>  </div>
<div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01851"></a><span class="lineno"> 1851</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="l01852"></a><span class="lineno"> 1852</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="l01853"></a><span class="lineno"> 1853</span>  </div>
<div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>  <span class="keywordflow">if</span> (index>=(stateVecSize>>1)) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>  thisBlock = index / sizeHalfBlock;</div>
<div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>  indexUp = thisBlock*sizeBlock + index%sizeHalfBlock;</div>
<div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>  </div>
<div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(controlQubit, indexUp);</div>
<div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>  </div>
<div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>  stateVecReal[indexUp] = stateVecReal[indexLo];</div>
<div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>  stateVecImag[indexUp] = stateVecImag[indexLo];</div>
<div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>  </div>
<div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>  stateVecReal[indexLo] = stateRealUp;</div>
<div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>  stateVecImag[indexLo] = stateImagUp;</div>
<div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>  }</div>
<div class="line"><a name="l01871"></a><span class="lineno"> 1871</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a4e19ef93d01d7acea32ca646d623aedd"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4e19ef93d01d7acea32ca646d623aedd">◆ </a></span>statevec_controlledPauliY()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledPauliY </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01445">1445</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span> {</div>
<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>  <span class="keywordtype">int</span> conjFactor = 1;</div>
<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01450"></a><span class="lineno"> 1450</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="l01451"></a><span class="lineno"> 1451</span>  statevec_controlledPauliYKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit, conjFactor);</div>
<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00563">controlledPauliY()</a>.</p>
</div>
</div>
<a id="a4a2fa262d3f0dba372797b9bd35d9fa5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4a2fa262d3f0dba372797b9bd35d9fa5">◆ </a></span>statevec_controlledPauliYConj()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledPauliYConj </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01454">1454</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span> {</div>
<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>  <span class="keywordtype">int</span> conjFactor = -1;</div>
<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01459"></a><span class="lineno"> 1459</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="l01460"></a><span class="lineno"> 1460</span>  statevec_controlledPauliYKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit, conjFactor);</div>
<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00563">controlledPauliY()</a>.</p>
</div>
</div>
<a id="ac65fd6109f08a191a7811ddf72886d55"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac65fd6109f08a191a7811ddf72886d55">◆ </a></span>statevec_controlledPauliYKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_controlledPauliYKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>conjFac</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01409">1409</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01410"></a><span class="lineno"> 1410</span> {</div>
<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, sizeHalfBlock;</div>
<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>  </div>
<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp, stateImagUp; </div>
<div class="line"><a name="l01417"></a><span class="lineno"> 1417</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="l01418"></a><span class="lineno"> 1418</span>  sizeHalfBlock = 1LL << targetQubit;</div>
<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>  sizeBlock = 2LL * sizeHalfBlock;</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>>1)) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>  thisBlock = index / sizeHalfBlock;</div>
<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>  indexUp = thisBlock*sizeBlock + index%sizeHalfBlock;</div>
<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>  </div>
<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(controlQubit, indexUp);</div>
<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>  <span class="keywordflow">if</span> (controlBit){</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>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>  </div>
<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>  <span class="comment">// update under +-{{0, -i}, {i, 0}}</span></div>
<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>  stateVecReal[indexUp] = conjFac * stateVecImag[indexLo];</div>
<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>  stateVecImag[indexUp] = conjFac * -stateVecReal[indexLo];</div>
<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>  stateVecReal[indexLo] = conjFac * -stateImagUp;</div>
<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>  stateVecImag[indexLo] = conjFac * stateRealUp;</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> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="aaf78491e35d165edfd57387f9fffecbd"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aaf78491e35d165edfd57387f9fffecbd">◆ </a></span>statevec_controlledPhaseFlip()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledPhaseFlip </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>idQubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>idQubit2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01708">1708</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01709"></a><span class="lineno"> 1709</span> {</div>
<div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01712"></a><span class="lineno"> 1712</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="l01713"></a><span class="lineno"> 1713</span>  statevec_controlledPhaseFlipKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, idQubit1, idQubit2);</div>
<div class="line"><a name="l01714"></a><span class="lineno"> 1714</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00575">controlledPhaseFlip()</a>.</p>
</div>
</div>
<a id="a1653a2901d0a843e00127e7150c31384"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1653a2901d0a843e00127e7150c31384">◆ </a></span>statevec_controlledPhaseFlipKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_controlledPhaseFlipKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>idQubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>idQubit2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01687">1687</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01688"></a><span class="lineno"> 1688</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> index;</div>
<div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>  <span class="keywordtype">int</span> bit1, bit2;</div>
<div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>  </div>
<div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01694"></a><span class="lineno"> 1694</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="l01695"></a><span class="lineno"> 1695</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="l01696"></a><span class="lineno"> 1696</span>  </div>
<div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>  </div>
<div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>  bit1 = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a> (idQubit1, index);</div>
<div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>  bit2 = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a> (idQubit2, index);</div>
<div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>  <span class="keywordflow">if</span> (bit1 && bit2) {</div>
<div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>  stateVecReal [index] = - stateVecReal [index];</div>
<div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>  stateVecImag [index] = - stateVecImag [index];</div>
<div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>  }</div>
<div class="line"><a name="l01706"></a><span class="lineno"> 1706</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a63df1ec14ff7cc81c3f392ac10fcc744"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a63df1ec14ff7cc81c3f392ac10fcc744">◆ </a></span>statevec_controlledPhaseShift()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledPhaseShift </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>idQubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>idQubit2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01527">1527</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01528"></a><span class="lineno"> 1528</span> {</div>
<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle = cos(angle);</div>
<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle = sin(angle);</div>
<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>  </div>
<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01534"></a><span class="lineno"> 1534</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="l01535"></a><span class="lineno"> 1535</span>  statevec_controlledPhaseShiftKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, idQubit1, idQubit2, cosAngle, sinAngle);</div>
<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00498">controlledPhaseShift()</a>.</p>
</div>
</div>
<a id="a2f95208e214543c15c3e16cc2e091d5c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2f95208e214543c15c3e16cc2e091d5c">◆ </a></span>statevec_controlledPhaseShiftKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_controlledPhaseShiftKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>idQubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>idQubit2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>cosAngle</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>sinAngle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01502">1502</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01503"></a><span class="lineno"> 1503</span> {</div>
<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</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> stateVecSize;</div>
<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>  <span class="keywordtype">int</span> bit1, bit2;</div>
<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealLo, stateImagLo;</div>
<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>  </div>
<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01510"></a><span class="lineno"> 1510</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="l01511"></a><span class="lineno"> 1511</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="l01512"></a><span class="lineno"> 1512</span>  </div>
<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>  </div>
<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>  bit1 = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a> (idQubit1, index);</div>
<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>  bit2 = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a> (idQubit2, index);</div>
<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>  <span class="keywordflow">if</span> (bit1 && bit2) {</div>
<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>  stateRealLo = stateVecReal[index];</div>
<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>  stateImagLo = stateVecImag[index];</div>
<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>  </div>
<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>  stateVecReal[index] = cosAngle*stateRealLo - sinAngle*stateImagLo;</div>
<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>  stateVecImag[index] = sinAngle*stateRealLo + cosAngle*stateImagLo;</div>
<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>  }</div>
<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="add9ca9956cdd81ed5d0b0f66168c04a3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#add9ca9956cdd81ed5d0b0f66168c04a3">◆ </a></span>statevec_controlledUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01237">1237</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span> {</div>
<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01241"></a><span class="lineno"> 1241</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="l01242"></a><span class="lineno"> 1242</span>  statevec_controlledUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit, argifyMatrix2(u));</div>
<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00360">controlledUnitary()</a>.</p>
</div>
</div>
<a id="ae4ee10f6db39b2634c82159322181826"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae4ee10f6db39b2634c82159322181826">◆ </a></span>statevec_controlledUnitaryKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_controlledUnitaryKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ArgMatrix2 </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>fix – no necessary for GPU version</p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01179">1179</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>  {</div>
<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l01181"></a><span class="lineno"> 1181</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="l01182"></a><span class="lineno"> 1182</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l01184"></a><span class="lineno"> 1184</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="l01185"></a><span class="lineno"> 1185</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>  </div>
<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01188"></a><span class="lineno"> 1188</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="l01189"></a><span class="lineno"> 1189</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01191"></a><span class="lineno"> 1191</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="l01192"></a><span class="lineno"> 1192</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="l01193"></a><span class="lineno"> 1193</span>  </div>
<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>  </div>
<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>  </div>
<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>  </div>
<div class="line"><a name="l01204"></a><span class="lineno"> 1204</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="l01205"></a><span class="lineno"> 1205</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="l01206"></a><span class="lineno"> 1206</span>  </div>
<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>  </div>
<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>  </div>
<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>  </div>
<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>  </div>
<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(controlQubit, indexUp);</div>
<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>  <span class="comment">// state[indexUp] = u00 * state[indexUp] + u01 * state[indexLo]</span></div>
<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>  stateVecReal[indexUp] = u.r0c0.real*stateRealUp - u.r0c0.imag*stateImagUp </div>
<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>  + u.r0c1.real*stateRealLo - u.r0c1.imag*stateImagLo;</div>
<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>  stateVecImag[indexUp] = u.r0c0.real*stateImagUp + u.r0c0.imag*stateRealUp </div>
<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>  + u.r0c1.real*stateImagLo + u.r0c1.imag*stateRealLo;</div>
<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>  </div>
<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>  <span class="comment">// state[indexLo] = u10 * state[indexUp] + u11 * state[indexLo]</span></div>
<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>  stateVecReal[indexLo] = u.r1c0.real*stateRealUp - u.r1c0.imag*stateImagUp </div>
<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>  + u.r1c1.real*stateRealLo - u.r1c1.imag*stateImagLo;</div>
<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>  stateVecImag[indexLo] = u.r1c0.real*stateImagUp + u.r1c0.imag*stateRealUp </div>
<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>  + u.r1c1.real*stateImagLo + u.r1c1.imag*stateRealLo;</div>
<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>  }</div>
<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a365bbb1b80cb00405c8bf1a4fa1ea8e5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a365bbb1b80cb00405c8bf1a4fa1ea8e5">◆ </a></span>statevec_createQureg()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_createQureg </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> * </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQuESTEnv.html">QuESTEnv</a> </td>
<td class="paramname"><em>env</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00275">275</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::firstLevelReduction</a>, <a class="el" href="QuEST_8h_source.html#l00325">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00334">Qureg::numAmpsTotal</a>, <a class="el" href="QuEST_8h_source.html#l00338">Qureg::numChunks</a>, <a class="el" href="QuEST_8h_source.html#l00329">Qureg::numQubitsInStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00365">QuESTEnv::numRanks</a>, <a class="el" href="QuEST_8h_source.html#l00343">Qureg::pairStateVec</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST_8h_source.html#l00364">QuESTEnv::rank</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00019">REDUCE_SHARED_SIZE</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::secondLevelReduction</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00064">createCloneQureg()</a>, <a class="el" href="QuEST_8c_source.html#l00050">createDensityQureg()</a>, and <a class="el" href="QuEST_8c_source.html#l00036">createQureg()</a>.</p>
</div>
</div>
<a id="a2a52ad9f9ad9b2fd6a76f6d433b3b217"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2a52ad9f9ad9b2fd6a76f6d433b3b217">◆ </a></span>statevec_destroyQureg()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_destroyQureg </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQuESTEnv.html">QuESTEnv</a> </td>
<td class="paramname"><em>env</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00321">321</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  cudaFree(qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  cudaFree(qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>);</div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::firstLevelReduction</a>, <a class="el" href="QuEST_8h_source.html#l00365">QuESTEnv::numRanks</a>, <a class="el" href="QuEST_8h_source.html#l00343">Qureg::pairStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::secondLevelReduction</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00077">destroyQureg()</a>.</p>
</div>
</div>
<a id="a5a34c2468f9c21c35ccca1b5e491e238"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5a34c2468f9c21c35ccca1b5e491e238">◆ </a></span>statevec_findProbabilityOfZero()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> statevec_findProbabilityOfZero </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>measureQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02112">2112</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span> {</div>
<div class="line"><a name="l02114"></a><span class="lineno"> 2114</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="l02115"></a><span class="lineno"> 2115</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateProb=0;</div>
<div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>  <span class="keywordtype">int</span> firstTime=1;</div>
<div class="line"><a name="l02118"></a><span class="lineno"> 2118</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="l02119"></a><span class="lineno"> 2119</span>  </div>
<div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>  <span class="keywordflow">while</span>(numValuesToReduce>1){ </div>
<div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>  <span class="keywordflow">if</span> (numValuesToReduce<maxReducedPerLevel){</div>
<div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>  <span class="comment">// Need less than one CUDA block to reduce values</span></div>
<div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>  <span class="comment">// Use full CUDA blocks, with block size constrained by shared mem usage</span></div>
<div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>  }</div>
<div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>  </div>
<div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>  <span class="keywordflow">if</span> (firstTime){</div>
<div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>  statevec_findProbabilityOfZeroKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>  qureg, measureQubit, qureg.<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>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>  qureg.<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>(&(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="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(&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="l02147"></a><span class="lineno"> 2147</span>  <span class="keywordflow">return</span> stateProb;</div>
<div class="line"><a name="l02148"></a><span class="lineno"> 2148</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l01951">copySharedReduceBlock()</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::firstLevelReduction</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00019">REDUCE_SHARED_SIZE</a>, <a class="el" href="QuEST_8h_source.html#l00348">Qureg::secondLevelReduction</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l02057">swapDouble()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l02150">statevec_calcProbOfOutcome()</a>.</p>
</div>
</div>
<a id="acd94d5e3794824e757731e50d3d018c6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#acd94d5e3794824e757731e50d3d018c6">◆ </a></span>statevec_findProbabilityOfZeroKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_findProbabilityOfZeroKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>measureQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01998">1998</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>  {</div>
<div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l02002"></a><span class="lineno"> 2002</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="l02003"></a><span class="lineno"> 2003</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l02005"></a><span class="lineno"> 2005</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="l02006"></a><span class="lineno"> 2006</span>  index; <span class="comment">// current index for first half block</span></div>
<div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l02008"></a><span class="lineno"> 2008</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="l02009"></a><span class="lineno"> 2009</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="l02010"></a><span class="lineno"> 2010</span>  <span class="comment">// (good for shared memory parallelism)</span></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="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>  </div>
<div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>  <span class="comment">// dimensions //</span></div>
<div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>  sizeHalfBlock = 1LL << (measureQubit); <span class="comment">// number of state vector elements to sum,</span></div>
<div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>  <span class="comment">// and then the number to skip</span></div>
<div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks (pairs of measure and skip entries)</span></div>
<div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>  </div>
<div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>  <span class="comment">// find probability //</span></div>
<div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>  </div>
<div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>  <span class="comment">//</span></div>
<div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>  <span class="comment">// --- task-based shared-memory parallel implementation</span></div>
<div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>  <span class="comment">//</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>  <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="l02030"></a><span class="lineno"> 2030</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="l02031"></a><span class="lineno"> 2031</span>  </div>
<div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>  </div>
<div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>  index = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> realVal, imagVal;</div>
<div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>  realVal = stateVecReal[index];</div>
<div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>  imagVal = stateVecImag[index]; </div>
<div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>  tempReductionArray[threadIdx.x] = realVal*realVal + imagVal*imagVal;</div>
<div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>  __syncthreads();</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="keywordflow">if</span> (threadIdx.x<blockDim.x/2){</div>
<div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</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> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01932">reduceBlock()</a>.</p>
</div>
</div>
<a id="abd509244d57657e148e4084c5ab5d28f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#abd509244d57657e148e4084c5ab5d28f">◆ </a></span>statevec_getImagAmp()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> statevec_getImagAmp </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>index</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00576">576</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> el=0;</div>
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  cudaMemcpy(&el, &(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index]), </div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  <span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag)), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <span class="keywordflow">return</span> el;</div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00939">getAmp()</a>, <a class="el" href="QuEST_8c_source.html#l00949">getDensityAmp()</a>, <a class="el" href="QuEST_8c_source.html#l00925">getImagAmp()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00248">statevec_getProbAmp()</a>.</p>
</div>
</div>
<a id="abc9a9ef4344c7faaaf28ac25c76649b9"></a>
<h2 class="memtitle"><span class="permalink"><a href="#abc9a9ef4344c7faaaf28ac25c76649b9">◆ </a></span>statevec_getRealAmp()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> statevec_getRealAmp </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>index</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00569">569</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  {</div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> el=0;</div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  cudaMemcpy(&el, &(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index]), </div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  <span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real)), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  <span class="keywordflow">return</span> el;</div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00939">getAmp()</a>, <a class="el" href="QuEST_8c_source.html#l00949">getDensityAmp()</a>, <a class="el" href="QuEST_8c_source.html#l00918">getRealAmp()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00248">statevec_getProbAmp()</a>.</p>
</div>
</div>
<a id="af3fc7bd149c70f083b149050242cd55e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af3fc7bd149c70f083b149050242cd55e">◆ </a></span>statevec_hadamard()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_hadamard </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01826">1826</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01827"></a><span class="lineno"> 1827</span> {</div>
<div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01830"></a><span class="lineno"> 1830</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="l01831"></a><span class="lineno"> 1831</span>  statevec_hadamardKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit);</div>
<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__common_8c_source.html#l00849">agnostic_applyQFT()</a>, and <a class="el" href="QuEST_8c_source.html#l00176">hadamard()</a>.</p>
</div>
</div>
<a id="afcf7b425ab92924c15b0b95b0d64c307"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afcf7b425ab92924c15b0b95b0d64c307">◆ </a></span>statevec_hadamardKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_hadamardKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>fix – no necessary for GPU version</p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01777">1777</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>  {</div>
<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l01779"></a><span class="lineno"> 1779</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="l01780"></a><span class="lineno"> 1780</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l01782"></a><span class="lineno"> 1782</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="l01783"></a><span class="lineno"> 1783</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>  </div>
<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01786"></a><span class="lineno"> 1786</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="l01787"></a><span class="lineno"> 1787</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01789"></a><span class="lineno"> 1789</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="l01790"></a><span class="lineno"> 1790</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="l01791"></a><span class="lineno"> 1791</span>  </div>
<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>  </div>
<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>  </div>
<div class="line"><a name="l01800"></a><span class="lineno"> 1800</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="l01801"></a><span class="lineno"> 1801</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="l01802"></a><span class="lineno"> 1802</span>  </div>
<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> recRoot2 = 1.0/sqrt(2.0);</div>
<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>  </div>
<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>  </div>
<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>  indexLo = indexUp + sizeHalfBlock;</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="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>  </div>
<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>  </div>
<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>  stateVecReal[indexUp] = recRoot2*(stateRealUp + stateRealLo);</div>
<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>  stateVecImag[indexUp] = recRoot2*(stateImagUp + stateImagLo);</div>
<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>  </div>
<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>  stateVecReal[indexLo] = recRoot2*(stateRealUp - stateRealLo);</div>
<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>  stateVecImag[indexLo] = recRoot2*(stateImagUp - stateImagLo);</div>
<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a758bad4237ff0bf3b4ff5be626a982ae"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a758bad4237ff0bf3b4ff5be626a982ae">◆ </a></span>statevec_initBlankState()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_initBlankState </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00593">593</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00597"></a><span class="lineno"> 597</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="l00598"></a><span class="lineno"> 598</span>  statevec_initBlankStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00119">initBlankState()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00538">statevec_applyPauliSum()</a>.</p>
</div>
</div>
<a id="a2116805f30cb063a0e7c0341583d1550"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2116805f30cb063a0e7c0341583d1550">◆ </a></span>statevec_initBlankStateKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_initBlankStateKernel </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateVecSize</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecImag</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00583">583</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  {</div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  </div>
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  <span class="comment">// initialise the statevector to be all-zeros</span></div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  stateVecReal[index] = 0.0;</div>
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span> }</div>
</div><!-- fragment -->
</div>
</div>
<a id="a288dc4b46bdacd69cbf4a6fd070d26a7"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a288dc4b46bdacd69cbf4a6fd070d26a7">◆ </a></span>statevec_initClassicalState()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_initClassicalState </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateInd</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00668">668</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00669"></a><span class="lineno"> 669</span> {</div>
<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00672"></a><span class="lineno"> 672</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="l00673"></a><span class="lineno"> 673</span>  statevec_initClassicalStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, stateInd);</div>
<div class="line"><a name="l00677"></a><span class="lineno"> 677</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00134">initClassicalState()</a>.</p>
</div>
</div>
<a id="a0f1817fe73e2911937af3979b6506ebd"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0f1817fe73e2911937af3979b6506ebd">◆ </a></span>statevec_initClassicalStateKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_initClassicalStateKernel </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateVecSize</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateInd</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00653">653</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  {</div>
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</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="comment">// initialise the state to |stateInd></span></div>
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  stateVecReal[index] = 0.0;</div>
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  </div>
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  <span class="keywordflow">if</span> (index==stateInd){</div>
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  <span class="comment">// classical state has probability 1</span></div>
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  stateVecReal[stateInd] = 1.0;</div>
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  stateVecImag[stateInd] = 0.0;</div>
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  }</div>
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span> }</div>
</div><!-- fragment -->
</div>
</div>
<a id="ad9fd3017ea40cf63fd04b39e03494972"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad9fd3017ea40cf63fd04b39e03494972">◆ </a></span>statevec_initDebugState()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_initDebugState </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Initialise the state vector of probability amplitudes to an (unphysical) state with each component of each probability amplitude a unique floating point value. </p>
<p>For debugging processes </p><dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of qubits to be initialised </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00689">689</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00690"></a><span class="lineno"> 690</span> {</div>
<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00693"></a><span class="lineno"> 693</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="l00694"></a><span class="lineno"> 694</span>  statevec_initDebugStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>,</div>
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01578">initDebugState()</a>.</p>
</div>
</div>
<a id="ad947613d4d62b0b659a0be1e9c736427"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad947613d4d62b0b659a0be1e9c736427">◆ </a></span>statevec_initDebugStateKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_initDebugStateKernel </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateVecSize</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecImag</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00679">679</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  {</div>
<div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</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>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</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>  stateVecReal[index] = (index*2.0)/10.0;</div>
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  stateVecImag[index] = (index*2.0+1.0)/10.0;</div>
<div class="line"><a name="l00687"></a><span class="lineno"> 687</span> }</div>
</div><!-- fragment -->
</div>
</div>
<a id="a482fc361fd5f08075404c72e536316a0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a482fc361fd5f08075404c72e536316a0">◆ </a></span>statevec_initPlusState()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_initPlusState </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00642">642</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00643"></a><span class="lineno"> 643</span> {</div>
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00646"></a><span class="lineno"> 646</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="l00647"></a><span class="lineno"> 647</span>  statevec_initPlusStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00125">initPlusState()</a>.</p>
</div>
</div>
<a id="aaa36e3e86a5b79e676c6268fa2b02222"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aaa36e3e86a5b79e676c6268fa2b02222">◆ </a></span>statevec_initPlusStateKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_initPlusStateKernel </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateVecSize</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecImag</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00631">631</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  {</div>
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  </div>
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  </div>
<div class="line"><a name="l00637"></a><span class="lineno"> 637</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="l00638"></a><span class="lineno"> 638</span>  stateVecReal[index] = normFactor;</div>
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00640"></a><span class="lineno"> 640</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a05756b45f10135bb2eeb07380f806c20"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a05756b45f10135bb2eeb07380f806c20">◆ </a></span>statevec_initStateFromSingleFile()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int statevec_initStateFromSingleFile </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> * </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">char </td>
<td class="paramname"><em>filename</em>[200], </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQuESTEnv.html">QuESTEnv</a> </td>
<td class="paramname"><em>env</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00727">727</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  {</div>
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkSize, stateVecSize;</div>
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> indexInChunk, totalIndex;</div>
<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>  </div>
<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  chunkSize = qureg-><a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  stateVecSize = chunkSize*qureg-><a class="code" href="structQureg.html#aa3deb7163aab90a61e755a1f200f5413">numChunks</a>;</div>
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  </div>
<div class="line"><a name="l00734"></a><span class="lineno"> 734</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="l00735"></a><span class="lineno"> 735</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="l00736"></a><span class="lineno"> 736</span>  </div>
<div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  FILE *fp;</div>
<div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  <span class="keywordtype">char</span> line[200];</div>
<div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  </div>
<div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  fp = fopen(filename, <span class="stringliteral">"r"</span>);</div>
<div class="line"><a name="l00741"></a><span class="lineno"> 741</span>  <span class="keywordflow">if</span> (fp == NULL)</div>
<div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  </div>
<div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  indexInChunk = 0; totalIndex = 0;</div>
<div class="line"><a name="l00745"></a><span class="lineno"> 745</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="l00746"></a><span class="lineno"> 746</span>  <span class="keywordflow">if</span> (line[0]!=<span class="charliteral">'#'</span>){</div>
<div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  <span class="keywordtype">int</span> chunkId = totalIndex/chunkSize;</div>
<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  <span class="keywordflow">if</span> (chunkId==qureg-><a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>){</div>
<div class="line"><a name="l00749"></a><span class="lineno"> 749</span> <span class="preprocessor"> # if QuEST_PREC==1</span></div>
<div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  sscanf(line, <span class="stringliteral">"%f, %f"</span>, &(stateVecReal[indexInChunk]),</div>
<div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  &(stateVecImag[indexInChunk]));</div>
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span> <span class="preprocessor"> # elif QuEST_PREC==2</span></div>
<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  sscanf(line, <span class="stringliteral">"%lf, %lf"</span>, &(stateVecReal[indexInChunk]),</div>
<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  &(stateVecImag[indexInChunk]));</div>
<div class="line"><a name="l00755"></a><span class="lineno"> 755</span> <span class="preprocessor"> # elif QuEST_PREC==4</span></div>
<div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  sscanf(line, <span class="stringliteral">"%lf, %lf"</span>, &(stateVecReal[indexInChunk]),</div>
<div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  &(stateVecImag[indexInChunk]));</div>
<div class="line"><a name="l00758"></a><span class="lineno"> 758</span> <span class="preprocessor"> # endif</span></div>
<div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  indexInChunk += 1;</div>
<div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  }</div>
<div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  totalIndex += 1;</div>
<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  }</div>
<div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  }</div>
<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  fclose(fp);</div>
<div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  <a class="code" href="group__debug.html#ga11448560006dd165128e404b54ebb2f7">copyStateToGPU</a>(*qureg);</div>
<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  </div>
<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  <span class="comment">// indicate success</span></div>
<div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l00769"></a><span class="lineno"> 769</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00519">copyStateToGPU()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00338">Qureg::numChunks</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01582">initStateFromSingleFile()</a>.</p>
</div>
</div>
<a id="a923906770cac0da9e3459bae58de9e64"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a923906770cac0da9e3459bae58de9e64">◆ </a></span>statevec_initStateOfSingleQubit()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_initStateOfSingleQubit </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> * </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubitId</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>outcome</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Initialise the state vector of probability amplitudes such that one qubit is set to 'outcome' and all other qubits are in an equal superposition of zero and one. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of qubits to be initialised </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">qubitId</td><td>id of qubit to set to state 'outcome' </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">outcome</td><td>of qubit 'qubitId' </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00718">718</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00719"></a><span class="lineno"> 719</span> {</div>
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00722"></a><span class="lineno"> 722</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="l00723"></a><span class="lineno"> 723</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="l00724"></a><span class="lineno"> 724</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01587">initStateOfSingleQubit()</a>.</p>
</div>
</div>
<a id="ace807c2089e172363db9ffe083f60f71"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ace807c2089e172363db9ffe083f60f71">◆ </a></span>statevec_initStateOfSingleQubitKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_initStateOfSingleQubitKernel </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateVecSize</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubitId</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>outcome</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00700">700</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  {</div>
<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  <span class="keywordtype">int</span> bit;</div>
<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  </div>
<div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  </div>
<div class="line"><a name="l00707"></a><span class="lineno"> 707</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="l00708"></a><span class="lineno"> 708</span>  bit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubitId, index);</div>
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  <span class="keywordflow">if</span> (bit==outcome) {</div>
<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  stateVecReal[index] = normFactor;</div>
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  stateVecReal[index] = 0.0;</div>
<div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  }</div>
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a2ca0c6ba07ab2b4b437321bf17efc966"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2ca0c6ba07ab2b4b437321bf17efc966">◆ </a></span>statevec_initZeroState()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_initZeroState </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00620">620</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00624"></a><span class="lineno"> 624</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="l00625"></a><span class="lineno"> 625</span>  statevec_initZeroStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00113">initZeroState()</a>.</p>
</div>
</div>
<a id="a43b35abfab0d6093b052e2c2e4b15064"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a43b35abfab0d6093b052e2c2e4b15064">◆ </a></span>statevec_initZeroStateKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_initZeroStateKernel </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateVecSize</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecImag</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00604">604</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  {</div>
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  </div>
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  <span class="comment">// initialise the state to |0000..0000></span></div>
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  stateVecReal[index] = 0.0;</div>
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  </div>
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  <span class="keywordflow">if</span> (index==0){</div>
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  <span class="comment">// zero state |0000..0000> has probability 1</span></div>
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  stateVecReal[0] = 1.0;</div>
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  stateVecImag[0] = 0.0;</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> }</div>
</div><!-- fragment -->
</div>
</div>
<a id="a13ecc24b355a5213d745651cde56bd71"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a13ecc24b355a5213d745651cde56bd71">◆ </a></span>statevec_multiControlledMultiQubitNot()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiControlledMultiQubitNot </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>ctrlMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targMask</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01918">1918</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>  {</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="keywordtype">int</span> numThreadsPerBlock = 128;</div>
<div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>  <span class="keywordtype">int</span> numBlocks = ceil(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) numThreadsPerBlock);</div>
<div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>  statevec_multiControlledMultiQubitNotKernel<<<numBlocks, numThreadsPerBlock>>>(qureg, ctrlMask, targMask);</div>
<div class="line"><a name="l01923"></a><span class="lineno"> 1923</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00549">multiControlledMultiQubitNot()</a>, and <a class="el" href="QuEST_8c_source.html#l00536">multiQubitNot()</a>.</p>
</div>
</div>
<a id="ac2d127c660168c2462601e4eca100740"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac2d127c660168c2462601e4eca100740">◆ </a></span>statevec_multiControlledMultiQubitNotKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_multiControlledMultiQubitNotKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>ctrlMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targMask</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01881">1881</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>  {</div>
<div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>  </div>
<div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateRe = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateIm = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</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>  <span class="comment">// althouugh each thread swaps/updates two amplitudes, we still invoke one thread per amp</span></div>
<div class="line"><a name="l01887"></a><span class="lineno"> 1887</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="l01888"></a><span class="lineno"> 1888</span>  <span class="keywordflow">if</span> (ampInd >= qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)</div>
<div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>  </div>
<div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>  <span class="comment">// modify amplitudes only if control qubits are 1 for this state</span></div>
<div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>  <span class="keywordflow">if</span> (ctrlMask && ((ctrlMask & ampInd) != ctrlMask))</div>
<div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>  </div>
<div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> mateInd = ampInd ^ targMask;</div>
<div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>  </div>
<div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>  <span class="comment">// if the mate is lower index, another thread is handling it</span></div>
<div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>  <span class="keywordflow">if</span> (mateInd < ampInd)</div>
<div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>  </div>
<div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>  <span class="comment">/* it may seem wasteful to spawn more threads than are needed, and abort </span></div>
<div class="line"><a name="l01902"></a><span class="lineno"> 1902</span> <span class="comment"> * half of them due to the amp pairing above (and potentially abort</span></div>
<div class="line"><a name="l01903"></a><span class="lineno"> 1903</span> <span class="comment"> * an exponential number due to ctrlMask). however, since we are moving </span></div>
<div class="line"><a name="l01904"></a><span class="lineno"> 1904</span> <span class="comment"> * global memory directly in a potentially non-contiguous fashoin, this </span></div>
<div class="line"><a name="l01905"></a><span class="lineno"> 1905</span> <span class="comment"> * method is likely to be memory bandwidth bottlenecked anyway </span></div>
<div class="line"><a name="l01906"></a><span class="lineno"> 1906</span> <span class="comment"> */</span></div>
<div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>  </div>
<div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> mateRe = stateRe[mateInd];</div>
<div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> mateIm = stateIm[mateInd];</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>  <span class="comment">// swap amp with mate</span></div>
<div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>  stateRe[mateInd] = stateRe[ampInd];</div>
<div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>  stateIm[mateInd] = stateIm[ampInd];</div>
<div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>  stateRe[ampInd] = mateRe;</div>
<div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>  stateIm[ampInd] = mateIm;</div>
<div class="line"><a name="l01916"></a><span class="lineno"> 1916</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a0acfe30083d0bc2a84da196378a36122"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0acfe30083d0bc2a84da196378a36122">◆ </a></span>statevec_multiControlledMultiQubitUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiControlledMultiQubitUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>targs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numTargs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrixN.html">ComplexMatrixN</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This calls swapQubitAmps only when it would involve a distributed communication; if the qubit chunks already fit in the node, it operates the unitary direct. </p>
<p>It is already gauranteed here that all target qubits can fit on each node (this is validated in the front-end)</p>
<dl class="todo"><dt><b><a class="el" href="todo.html#_todo000002">Todo:</a></b></dt><dd>refactor so that the 'swap back' isn't performed; instead the qubit locations are updated. </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01039">1039</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span> {</div>
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>  <span class="keywordtype">int</span> threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</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="l01043"></a><span class="lineno"> 1043</span>  </div>
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>  <span class="comment">// allocate device space for global {targs} (length: numTargs) and populate</span></div>
<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>  <span class="keywordtype">int</span> *d_targs;</div>
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>  <span class="keywordtype">size_t</span> targMemSize = numTargs * <span class="keyword">sizeof</span> *d_targs;</div>
<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>  cudaMalloc(&d_targs, targMemSize);</div>
<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>  cudaMemcpy(d_targs, targs, targMemSize, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>  </div>
<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>  <span class="comment">// flatten out the u.real and u.imag lists</span></div>
<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>  <span class="keywordtype">int</span> uNumRows = (1 << u.<a class="code" href="structComplexMatrixN.html#a606f7afbc3f65a596bdca21cb43be6a8">numQubits</a>);</div>
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</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="l01053"></a><span class="lineno"> 1053</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="l01054"></a><span class="lineno"> 1054</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> i = 0;</div>
<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r < uNumRows; r++)</div>
<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> c=0; c < uNumRows; c++) {</div>
<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>  uReFlat[i] = u.<a class="code" href="structComplexMatrixN.html#a446e8a077597e4f76049d547df0c9738">real</a>[r][c];</div>
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>  uImFlat[i] = u.<a class="code" href="structComplexMatrixN.html#afde13e469a3b4f179f45e53d1ec0a7cf">imag</a>[r][c];</div>
<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>  i++;</div>
<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>  }</div>
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>  </div>
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</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="l01063"></a><span class="lineno"> 1063</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_uRe;</div>
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_uIm;</div>
<div class="line"><a name="l01065"></a><span class="lineno"> 1065</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="l01066"></a><span class="lineno"> 1066</span>  cudaMalloc(&d_uRe, uMemSize);</div>
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>  cudaMalloc(&d_uIm, uMemSize);</div>
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>  cudaMemcpy(d_uRe, uReFlat, uMemSize, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>  cudaMemcpy(d_uIm, uImFlat, uMemSize, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>  </div>
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>  <span class="comment">// allocate device Wspace for thread-local {ampInds}, {reAmps}, {imAmps} (length: 1<<numTargs)</span></div>
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> *d_ampInds;</div>
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *d_reAmps;</div>
<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *d_imAmps;</div>
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>  <span class="keywordtype">size_t</span> gridSize = (size_t) threadsPerCUDABlock * CUDABlocks;</div>
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>  <span class="keywordtype">int</span> numTargAmps = uNumRows;</div>
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>  cudaMalloc(&d_ampInds, numTargAmps*gridSize * <span class="keyword">sizeof</span> *d_ampInds);</div>
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>  cudaMalloc(&d_reAmps, numTargAmps*gridSize * <span class="keyword">sizeof</span> *d_reAmps);</div>
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>  cudaMalloc(&d_imAmps, numTargAmps*gridSize * <span class="keyword">sizeof</span> *d_imAmps);</div>
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>  </div>
<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>  <span class="comment">// call kernel</span></div>
<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>  statevec_multiControlledMultiQubitUnitaryKernel<<<CUDABlocks,threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>  qureg, ctrlMask, d_targs, numTargs, d_uRe, d_uIm, d_ampInds, d_reAmps, d_imAmps, numTargAmps);</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>  <span class="comment">// free kernel memory</span></div>
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>  free(uReFlat);</div>
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>  free(uImFlat);</div>
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>  cudaFree(d_targs);</div>
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>  cudaFree(d_uRe);</div>
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>  cudaFree(d_uIm);</div>
<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>  cudaFree(d_ampInds);</div>
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>  cudaFree(d_reAmps);</div>
<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>  cudaFree(d_imAmps);</div>
<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00190">ComplexMatrixN::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00188">ComplexMatrixN::numQubits</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00189">ComplexMatrixN::real</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01114">applyMultiControlledMatrixN()</a>, <a class="el" href="QuEST__common_8c_source.html#l00634">densmatr_applyMultiQubitKrausSuperoperator()</a>, <a class="el" href="QuEST__common_8c_source.html#l00626">densmatr_applyTwoQubitKrausSuperoperator()</a>, <a class="el" href="QuEST_8c_source.html#l00330">multiControlledMultiQubitUnitary()</a>, <a class="el" href="QuEST__common_8c_source.html#l00579">statevec_controlledMultiQubitUnitary()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00573">statevec_multiQubitUnitary()</a>.</p>
</div>
</div>
<a id="afd7fc4d67072a80dbc609bf328b5be20"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afd7fc4d67072a80dbc609bf328b5be20">◆ </a></span>statevec_multiControlledMultiQubitUnitaryKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_multiControlledMultiQubitUnitaryKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>targs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numTargs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>uRe</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>uIm</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int * </td>
<td class="paramname"><em>ampInds</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reAmps</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>imAmps</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numTargAmps</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00980">980</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  </div>
<div class="line"><a name="l00985"></a><span class="lineno"> 985</span>  <span class="comment">// decide the amplitudes this thread will modify</span></div>
<div class="line"><a name="l00986"></a><span class="lineno"> 986</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="l00987"></a><span class="lineno"> 987</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="l00988"></a><span class="lineno"> 988</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00989"></a><span class="lineno"> 989</span>  </div>
<div class="line"><a name="l00990"></a><span class="lineno"> 990</span>  <span class="comment">// find this task's start index (where all targs are 0)</span></div>
<div class="line"><a name="l00991"></a><span class="lineno"> 991</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#a9bac39238e100b0f845dc6e4deafc1c9">insertZeroBits</a>(thisTask, targs, numTargs);</div>
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  </div>
<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  <span class="comment">// this task only modifies amplitudes if control qubits are 1 for this state</span></div>
<div class="line"><a name="l00994"></a><span class="lineno"> 994</span>  <span class="keywordflow">if</span> (ctrlMask && (ctrlMask&ind00) != ctrlMask)</div>
<div class="line"><a name="l00995"></a><span class="lineno"> 995</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span>  </div>
<div class="line"><a name="l00997"></a><span class="lineno"> 997</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="l00998"></a><span class="lineno"> 998</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="l00999"></a><span class="lineno"> 999</span>  </div>
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>  <span class="comment">/*</span></div>
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span> <span class="comment"> each thread needs:</span></div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span> <span class="comment"> long long int ampInds[numAmps];</span></div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span> <span class="comment"> qreal reAmps[numAmps];</span></div>
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span> <span class="comment"> qreal imAmps[numAmps];</span></div>
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span> <span class="comment"> but instead has access to shared arrays, with below stride and offset</span></div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span> <span class="comment"> */</span></div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>  <span class="keywordtype">size_t</span> stride = gridDim.x*blockDim.x;</div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>  <span class="keywordtype">size_t</span> offset = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  </div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>  <span class="comment">// determine the indices and record values of target amps</span></div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind;</div>
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i < numTargAmps; i++) {</div>
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  </div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>  <span class="comment">// get global index of current target qubit assignment</span></div>
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>  ind = ind00;</div>
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t=0; t < numTargs; t++)</div>
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(t, i))</div>
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  ind = <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(ind, targs[t]);</div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  </div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>  ampInds[i*stride+offset] = ind;</div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>  reAmps [i*stride+offset] = reVec[ind];</div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>  imAmps [i*stride+offset] = imVec[ind];</div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  }</div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>  </div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  <span class="comment">// update the amplitudes</span></div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r < numTargAmps; r++) {</div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  ind = ampInds[r*stride+offset];</div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>  reVec[ind] = 0;</div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>  imVec[ind] = 0;</div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> c=0; c < numTargAmps; c++) {</div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> uReElem = uRe[c + r*numTargAmps];</div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> uImElem = uIm[c + r*numTargAmps];</div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>  reVec[ind] += reAmps[c*stride+offset]*uReElem - imAmps[c*stride+offset]*uImElem;</div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>  imVec[ind] += reAmps[c*stride+offset]*uImElem + imAmps[c*stride+offset]*uReElem;</div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>  }</div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>  }</div>
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00095">flipBit()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00112">insertZeroBits()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a3ed30f823a59890be17441d97ce90c5c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a3ed30f823a59890be17441d97ce90c5c">◆ </a></span>statevec_multiControlledMultiRotateZ()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiControlledMultiRotateZ </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>targMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01621">1621</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01622"></a><span class="lineno"> 1622</span> { </div>
<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle = cos(angle/2.0);</div>
<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle = sin(angle/2.0);</div>
<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>  </div>
<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01628"></a><span class="lineno"> 1628</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="l01629"></a><span class="lineno"> 1629</span>  statevec_multiControlledMultiRotateZKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, ctrlMask, targMask, cosAngle, sinAngle);</div>
<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00668">multiControlledMultiRotateZ()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00453">statevec_multiControlledMultiRotatePauli()</a>.</p>
</div>
</div>
<a id="aac71aef8fca67e5a0547ea2d3426d40d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aac71aef8fca67e5a0547ea2d3426d40d">◆ </a></span>statevec_multiControlledMultiRotateZKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_multiControlledMultiRotateZKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>targMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>cosAngle</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>sinAngle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01599">1599</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>  {</div>
<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>  </div>
<div class="line"><a name="l01601"></a><span class="lineno"> 1601</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="l01602"></a><span class="lineno"> 1602</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="l01603"></a><span class="lineno"> 1603</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>  </div>
<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>  <span class="comment">// amplitudes corresponding to control qubits not all-in-one are unmodified</span></div>
<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>  <span class="keywordflow">if</span> (ctrlMask && ((ctrlMask & index) != ctrlMask))</div>
<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>  </div>
<div class="line"><a name="l01609"></a><span class="lineno"> 1609</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="l01610"></a><span class="lineno"> 1610</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="l01611"></a><span class="lineno"> 1611</span>  </div>
<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>  <span class="comment">// avoid warp divergence, setting fac = +- 1</span></div>
<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>  <span class="keywordtype">int</span> fac = 1-2*<a class="code" href="QuEST__gpu_8cu.html#a1775b7abce55ccfd036bd5f55707877c">getBitMaskParity</a>(targMask & index);</div>
<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateReal = stateVecReal[index];</div>
<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateImag = stateVecImag[index];</div>
<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>  </div>
<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>  stateVecReal[index] = cosAngle*stateReal + fac * sinAngle*stateImag;</div>
<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>  stateVecImag[index] = - fac * sinAngle*stateReal + cosAngle*stateImag; </div>
<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00086">getBitMaskParity()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="ac4ee5979d475e8c729294b8ef7e0270d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac4ee5979d475e8c729294b8ef7e0270d">◆ </a></span>statevec_multiControlledPhaseFlip()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiControlledPhaseFlip </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>controlQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numControlQubits</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01734">1734</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01735"></a><span class="lineno"> 1735</span> {</div>
<div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01737"></a><span class="lineno"> 1737</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#acc45bb8300922ea5933e294921e25ea2">getQubitBitMask</a>(controlQubits, numControlQubits);</div>
<div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01739"></a><span class="lineno"> 1739</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="l01740"></a><span class="lineno"> 1740</span>  statevec_multiControlledPhaseFlipKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, mask);</div>
<div class="line"><a name="l01741"></a><span class="lineno"> 1741</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__common_8c_source.html#l00050">getQubitBitMask()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00587">multiControlledPhaseFlip()</a>.</p>
</div>
</div>
<a id="ab1f13b1980ec46bac75e97c578d15e98"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab1f13b1980ec46bac75e97c578d15e98">◆ </a></span>statevec_multiControlledPhaseFlipKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_multiControlledPhaseFlipKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>mask</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01716">1716</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01717"></a><span class="lineno"> 1717</span> {</div>
<div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>  </div>
<div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01722"></a><span class="lineno"> 1722</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="l01723"></a><span class="lineno"> 1723</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="l01724"></a><span class="lineno"> 1724</span>  </div>
<div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>  </div>
<div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>  <span class="keywordflow">if</span> (mask == (mask & index) ){</div>
<div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>  stateVecReal [index] = - stateVecReal [index];</div>
<div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>  stateVecImag [index] = - stateVecImag [index];</div>
<div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>  }</div>
<div class="line"><a name="l01732"></a><span class="lineno"> 1732</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="aa662796ea6e0f471143c53becae8c12c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa662796ea6e0f471143c53becae8c12c">◆ </a></span>statevec_multiControlledPhaseShift()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiControlledPhaseShift </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>controlQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numControlQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01558">1558</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01559"></a><span class="lineno"> 1559</span> { </div>
<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle = cos(angle);</div>
<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle = sin(angle);</div>
<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>  </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> mask = <a class="code" href="QuEST__common_8c.html#acc45bb8300922ea5933e294921e25ea2">getQubitBitMask</a>(controlQubits, numControlQubits);</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>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01567"></a><span class="lineno"> 1567</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="l01568"></a><span class="lineno"> 1568</span>  statevec_multiControlledPhaseShiftKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, mask, cosAngle, sinAngle);</div>
<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__common_8c_source.html#l00050">getQubitBitMask()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00510">multiControlledPhaseShift()</a>.</p>
</div>
</div>
<a id="a11dc3581b1efe1332854eac7594bc647"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a11dc3581b1efe1332854eac7594bc647">◆ </a></span>statevec_multiControlledPhaseShiftKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_multiControlledPhaseShiftKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>mask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>cosAngle</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>sinAngle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01538">1538</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>  {</div>
<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealLo, stateImagLo;</div>
<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>  </div>
<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01544"></a><span class="lineno"> 1544</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="l01545"></a><span class="lineno"> 1545</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="l01546"></a><span class="lineno"> 1546</span>  </div>
<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</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>  <span class="keywordflow">if</span> (mask == (mask & index) ){</div>
<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>  stateRealLo = stateVecReal[index];</div>
<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>  stateImagLo = stateVecImag[index];</div>
<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>  stateVecReal[index] = cosAngle*stateRealLo - sinAngle*stateImagLo;</div>
<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>  stateVecImag[index] = sinAngle*stateRealLo + cosAngle*stateImagLo;</div>
<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>  }</div>
<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="affbd18d7c2ed8d5bd5edb67116501145"></a>
<h2 class="memtitle"><span class="permalink"><a href="#affbd18d7c2ed8d5bd5edb67116501145">◆ </a></span>statevec_multiControlledTwoQubitUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiControlledTwoQubitUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>q1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>q2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrix4.html">ComplexMatrix4</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This calls swapQubitAmps only when it would involve a distributed communication; if the qubit chunks already fit in the node, it operates the unitary direct. </p>
<p>Note the order of q1 and q2 in the call to twoQubitUnitaryLocal is important.</p>
<dl class="todo"><dt><b><a class="el" href="todo.html#_todo000001">Todo:</a></b></dt><dd><p class="startdd">refactor so that the 'swap back' isn't performed; instead the qubit locations are updated. </p>
<p class="enddd">the double swap (q1,q2 to 0,1) may be possible simultaneously by a bespoke swap routine. </p>
</dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01172">1172</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span> {</div>
<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>  <span class="keywordtype">int</span> threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01175"></a><span class="lineno"> 1175</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="l01176"></a><span class="lineno"> 1176</span>  statevec_multiControlledTwoQubitUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, ctrlMask, q1, q2, argifyMatrix4(u));</div>
<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__common_8c_source.html#l00620">densmatr_applyKrausSuperoperator()</a>, <a class="el" href="QuEST_8c_source.html#l00282">multiControlledTwoQubitUnitary()</a>, <a class="el" href="QuEST__common_8c_source.html#l00567">statevec_controlledTwoQubitUnitary()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00561">statevec_twoQubitUnitary()</a>.</p>
</div>
</div>
<a id="aed40f77bf851930363897f3d28a5093b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aed40f77bf851930363897f3d28a5093b">◆ </a></span>statevec_multiControlledTwoQubitUnitaryKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_multiControlledTwoQubitUnitaryKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>q1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>q2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ArgMatrix4 </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01096">1096</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>  {</div>
<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>  </div>
<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>  <span class="comment">// decide the 4 amplitudes this thread will modify</span></div>
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</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="l01100"></a><span class="lineno"> 1100</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="l01101"></a><span class="lineno"> 1101</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>  </div>
<div class="line"><a name="l01103"></a><span class="lineno"> 1103</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="l01104"></a><span class="lineno"> 1104</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="l01105"></a><span class="lineno"> 1105</span>  </div>
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>  <span class="comment">// find indices of amplitudes to modify (treat q1 as the least significant bit)</span></div>
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</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="l01108"></a><span class="lineno"> 1108</span>  ind00 = <a class="code" href="QuEST__gpu_8cu.html#a4760109974e9b52c60e9d60ccded3138">insertTwoZeroBits</a>(thisTask, q1, q2);</div>
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>  </div>
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>  <span class="comment">// modify only if control qubits are 1 for this state</span></div>
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>  <span class="keywordflow">if</span> (ctrlMask && (ctrlMask&ind00) != ctrlMask)</div>
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>  <span class="keywordflow">return</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>  ind01 = <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(ind00, q1);</div>
<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>  ind10 = <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(ind00, q2);</div>
<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>  ind11 = <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(ind01, q2);</div>
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>  </div>
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>  <span class="comment">// extract statevec amplitudes </span></div>
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re00, re01, re10, re11;</div>
<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> im00, im01, im10, im11;</div>
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>  re00 = reVec[ind00]; im00 = imVec[ind00];</div>
<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>  re01 = reVec[ind01]; im01 = imVec[ind01];</div>
<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>  re10 = reVec[ind10]; im10 = imVec[ind10];</div>
<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>  re11 = reVec[ind11]; im11 = imVec[ind11];</div>
<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>  </div>
<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>  <span class="comment">// apply u * {amp00, amp01, amp10, amp11}</span></div>
<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>  reVec[ind00] = </div>
<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>  u.r0c0.real*re00 - u.r0c0.imag*im00 +</div>
<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>  u.r0c1.real*re01 - u.r0c1.imag*im01 +</div>
<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>  u.r0c2.real*re10 - u.r0c2.imag*im10 +</div>
<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>  u.r0c3.real*re11 - u.r0c3.imag*im11;</div>
<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>  imVec[ind00] =</div>
<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>  u.r0c0.imag*re00 + u.r0c0.real*im00 +</div>
<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>  u.r0c1.imag*re01 + u.r0c1.real*im01 +</div>
<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>  u.r0c2.imag*re10 + u.r0c2.real*im10 +</div>
<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>  u.r0c3.imag*re11 + u.r0c3.real*im11;</div>
<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>  </div>
<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>  reVec[ind01] = </div>
<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>  u.r1c0.real*re00 - u.r1c0.imag*im00 +</div>
<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>  u.r1c1.real*re01 - u.r1c1.imag*im01 +</div>
<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>  u.r1c2.real*re10 - u.r1c2.imag*im10 +</div>
<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>  u.r1c3.real*re11 - u.r1c3.imag*im11;</div>
<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>  imVec[ind01] =</div>
<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>  u.r1c0.imag*re00 + u.r1c0.real*im00 +</div>
<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>  u.r1c1.imag*re01 + u.r1c1.real*im01 +</div>
<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>  u.r1c2.imag*re10 + u.r1c2.real*im10 +</div>
<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  u.r1c3.imag*re11 + u.r1c3.real*im11;</div>
<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>  </div>
<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>  reVec[ind10] = </div>
<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>  u.r2c0.real*re00 - u.r2c0.imag*im00 +</div>
<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>  u.r2c1.real*re01 - u.r2c1.imag*im01 +</div>
<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>  u.r2c2.real*re10 - u.r2c2.imag*im10 +</div>
<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>  u.r2c3.real*re11 - u.r2c3.imag*im11;</div>
<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>  imVec[ind10] =</div>
<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>  u.r2c0.imag*re00 + u.r2c0.real*im00 +</div>
<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>  u.r2c1.imag*re01 + u.r2c1.real*im01 +</div>
<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>  u.r2c2.imag*re10 + u.r2c2.real*im10 +</div>
<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>  u.r2c3.imag*re11 + u.r2c3.real*im11; </div>
<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>  </div>
<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>  reVec[ind11] = </div>
<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>  u.r3c0.real*re00 - u.r3c0.imag*im00 +</div>
<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>  u.r3c1.real*re01 - u.r3c1.imag*im01 +</div>
<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>  u.r3c2.real*re10 - u.r3c2.imag*im10 +</div>
<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>  u.r3c3.real*re11 - u.r3c3.imag*im11;</div>
<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>  imVec[ind11] =</div>
<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>  u.r3c0.imag*re00 + u.r3c0.real*im00 +</div>
<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>  u.r3c1.imag*re01 + u.r3c1.real*im01 +</div>
<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>  u.r3c2.imag*re10 + u.r3c2.real*im10 +</div>
<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>  u.r3c3.imag*re11 + u.r3c3.real*im11; </div>
<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00095">flipBit()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00106">insertTwoZeroBits()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a600bda10463e2078ce746ec28f2d39c9"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a600bda10463e2078ce746ec28f2d39c9">◆ </a></span>statevec_multiControlledUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiControlledUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlQubitsMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlFlipMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01305">1305</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>  {</div>
<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>  <span class="keywordtype">int</span> threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01311"></a><span class="lineno"> 1311</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="l01312"></a><span class="lineno"> 1312</span>  statevec_multiControlledUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>  qureg, ctrlQubitsMask, ctrlFlipMask, targetQubit, argifyMatrix2(u));</div>
<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00373">multiControlledUnitary()</a>, <a class="el" href="QuEST_8c_source.html#l00388">multiStateControlledUnitary()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00453">statevec_multiControlledMultiRotatePauli()</a>.</p>
</div>
</div>
<a id="a6d0bd05cfccc67102864429f1046ecc3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6d0bd05cfccc67102864429f1046ecc3">◆ </a></span>statevec_multiControlledUnitaryKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_multiControlledUnitaryKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlQubitsMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlFlipMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ArgMatrix2 </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>fix – no necessary for GPU version</p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01245">1245</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>  {</div>
<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>  <span class="comment">// ----- sizes</span></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> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>  <span class="comment">// ----- indices</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, <span class="comment">// current block</span></div>
<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>  </div>
<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01258"></a><span class="lineno"> 1258</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="l01259"></a><span class="lineno"> 1259</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01261"></a><span class="lineno"> 1261</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="l01262"></a><span class="lineno"> 1262</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="l01263"></a><span class="lineno"> 1263</span>  </div>
<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>  </div>
<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>  </div>
<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>  </div>
<div class="line"><a name="l01273"></a><span class="lineno"> 1273</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="l01274"></a><span class="lineno"> 1274</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="l01275"></a><span class="lineno"> 1275</span>  </div>
<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</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"> 1279</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>  </div>
<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>  <span class="keywordflow">if</span> (ctrlQubitsMask == (ctrlQubitsMask & (indexUp ^ ctrlFlipMask))) {</div>
<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>  </div>
<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>  </div>
<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>  <span class="comment">// state[indexUp] = u00 * state[indexUp] + u01 * state[indexLo]</span></div>
<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>  stateVecReal[indexUp] = u.r0c0.real*stateRealUp - u.r0c0.imag*stateImagUp </div>
<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>  + u.r0c1.real*stateRealLo - u.r0c1.imag*stateImagLo;</div>
<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>  stateVecImag[indexUp] = u.r0c0.real*stateImagUp + u.r0c0.imag*stateRealUp </div>
<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>  + u.r0c1.real*stateImagLo + u.r0c1.imag*stateRealLo;</div>
<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>  </div>
<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>  <span class="comment">// state[indexLo] = u10 * state[indexUp] + u11 * state[indexLo]</span></div>
<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>  stateVecReal[indexLo] = u.r1c0.real*stateRealUp - u.r1c0.imag*stateImagUp </div>
<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>  + u.r1c1.real*stateRealLo - u.r1c1.imag*stateImagLo;</div>
<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>  stateVecImag[indexLo] = u.r1c0.real*stateImagUp + u.r1c0.imag*stateRealUp </div>
<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>  + u.r1c1.real*stateImagLo + u.r1c1.imag*stateRealLo;</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> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a8d88b4ed94ab024e5e7b2f1f4f505b44"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8d88b4ed94ab024e5e7b2f1f4f505b44">◆ </a></span>statevec_multiRotateZ()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiRotateZ </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>mask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01588">1588</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01589"></a><span class="lineno"> 1589</span> { </div>
<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle = cos(angle/2.0);</div>
<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle = sin(angle/2.0);</div>
<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>  </div>
<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01595"></a><span class="lineno"> 1595</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="l01596"></a><span class="lineno"> 1596</span>  statevec_multiRotateZKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, mask, cosAngle, sinAngle);</div>
<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00652">multiRotateZ()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00414">statevec_multiRotatePauli()</a>.</p>
</div>
</div>
<a id="a754e4531aa159461177751dd12e988ed"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a754e4531aa159461177751dd12e988ed">◆ </a></span>statevec_multiRotateZKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_multiRotateZKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>mask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>cosAngle</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>sinAngle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01571">1571</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  </div>
<div class="line"><a name="l01573"></a><span class="lineno"> 1573</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="l01574"></a><span class="lineno"> 1574</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="l01575"></a><span class="lineno"> 1575</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</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>  <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="l01578"></a><span class="lineno"> 1578</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="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> fac = <a class="code" href="QuEST__gpu_8cu.html#a1775b7abce55ccfd036bd5f55707877c">getBitMaskParity</a>(mask & index)? -1 : 1;</div>
<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateReal = stateVecReal[index];</div>
<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateImag = stateVecImag[index];</div>
<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>  </div>
<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>  stateVecReal[index] = cosAngle*stateReal + fac * sinAngle*stateImag;</div>
<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>  stateVecImag[index] = - fac * sinAngle*stateReal + cosAngle*stateImag; </div>
<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00086">getBitMaskParity()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a1c82b5e914a8a39c5c7b782dbc16fa76"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1c82b5e914a8a39c5c7b782dbc16fa76">◆ </a></span>statevec_pauliX()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_pauliX </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01360">1360</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01364"></a><span class="lineno"> 1364</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="l01365"></a><span class="lineno"> 1365</span>  statevec_pauliXKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit);</div>
<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00432">pauliX()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00495">statevec_applyPauliProd()</a>.</p>
</div>
</div>
<a id="a61f547009235f367c6f983f8768dae19"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a61f547009235f367c6f983f8768dae19">◆ </a></span>statevec_pauliXKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_pauliXKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>fix – no necessary for GPU version</p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01316">1316</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>  {</div>
<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l01318"></a><span class="lineno"> 1318</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="l01319"></a><span class="lineno"> 1319</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l01321"></a><span class="lineno"> 1321</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="l01322"></a><span class="lineno"> 1322</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>  </div>
<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01325"></a><span class="lineno"> 1325</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="l01326"></a><span class="lineno"> 1326</span>  stateImagUp; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01328"></a><span class="lineno"> 1328</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="l01329"></a><span class="lineno"> 1329</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="l01330"></a><span class="lineno"> 1330</span>  </div>
<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></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="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>  </div>
<div class="line"><a name="l01339"></a><span class="lineno"> 1339</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="l01340"></a><span class="lineno"> 1340</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="l01341"></a><span class="lineno"> 1341</span>  </div>
<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>  </div>
<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>  </div>
<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>  stateImagUp = stateVecImag[indexUp];</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>  stateVecReal[indexUp] = stateVecReal[indexLo];</div>
<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>  stateVecImag[indexUp] = stateVecImag[indexLo];</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>  stateVecReal[indexLo] = stateRealUp;</div>
<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>  stateVecImag[indexLo] = stateImagUp;</div>
<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="af1cca787f3b0e0c91ffb2495f9ad8d5a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af1cca787f3b0e0c91ffb2495f9ad8d5a">◆ </a></span>statevec_pauliY()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_pauliY </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01393">1393</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span> {</div>
<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01397"></a><span class="lineno"> 1397</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="l01398"></a><span class="lineno"> 1398</span>  statevec_pauliYKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, 1);</div>
<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00443">pauliY()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00495">statevec_applyPauliProd()</a>.</p>
</div>
</div>
<a id="a81fbd2eccd0d0e5a3cece4df2f96cb92"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a81fbd2eccd0d0e5a3cece4df2f96cb92">◆ </a></span>statevec_pauliYConj()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_pauliYConj </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01401">1401</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01405"></a><span class="lineno"> 1405</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="l01406"></a><span class="lineno"> 1406</span>  statevec_pauliYKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, -1);</div>
<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00443">pauliY()</a>.</p>
</div>
</div>
<a id="a2b9beefe0873d2c2e8fec68f86e057fc"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2b9beefe0873d2c2e8fec68f86e057fc">◆ </a></span>statevec_pauliYKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_pauliYKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>conjFac</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01368">1368</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>  {</div>
<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>  </div>
<div class="line"><a name="l01370"></a><span class="lineno"> 1370</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="l01371"></a><span class="lineno"> 1371</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="l01372"></a><span class="lineno"> 1372</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="l01373"></a><span class="lineno"> 1373</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="l01374"></a><span class="lineno"> 1374</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>  </div>
<div class="line"><a name="l01376"></a><span class="lineno"> 1376</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="l01377"></a><span class="lineno"> 1377</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="l01378"></a><span class="lineno"> 1378</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="l01379"></a><span class="lineno"> 1379</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp, stateImagUp;</div>
<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>  </div>
<div class="line"><a name="l01381"></a><span class="lineno"> 1381</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="l01382"></a><span class="lineno"> 1382</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="l01383"></a><span class="lineno"> 1383</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>  </div>
<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>  <span class="comment">// update under +-{{0, -i}, {i, 0}}</span></div>
<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>  stateVecReal[indexUp] = conjFac * stateVecImag[indexLo];</div>
<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>  stateVecImag[indexUp] = conjFac * -stateVecReal[indexLo];</div>
<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>  stateVecReal[indexLo] = conjFac * -stateImagUp;</div>
<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>  stateVecImag[indexLo] = conjFac * stateRealUp;</div>
<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a535cc3c9962d511078691e4d64b4e272"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a535cc3c9962d511078691e4d64b4e272">◆ </a></span>statevec_phaseShiftByTerm()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_phaseShiftByTerm </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>term</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01491">1491</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01492"></a><span class="lineno"> 1492</span> { </div>
<div class="line"><a name="l01493"></a><span class="lineno"> 1493</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="l01494"></a><span class="lineno"> 1494</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="l01495"></a><span class="lineno"> 1495</span>  </div>
<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01498"></a><span class="lineno"> 1498</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="l01499"></a><span class="lineno"> 1499</span>  statevec_phaseShiftByTermKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, cosAngle, sinAngle);</div>
<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__common_8c_source.html#l00261">statevec_pauliZ()</a>, <a class="el" href="QuEST__common_8c_source.html#l00254">statevec_phaseShift()</a>, <a class="el" href="QuEST__common_8c_source.html#l00268">statevec_sGate()</a>, <a class="el" href="QuEST__common_8c_source.html#l00282">statevec_sGateConj()</a>, <a class="el" href="QuEST__common_8c_source.html#l00275">statevec_tGate()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00289">statevec_tGateConj()</a>.</p>
</div>
</div>
<a id="ad2c5cb1c21c9d6cab081b820d1ba4995"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad2c5cb1c21c9d6cab081b820d1ba4995">◆ </a></span>statevec_phaseShiftByTermKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_phaseShiftByTermKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>cosAngle</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>sinAngle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01463">1463</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>  {</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>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, sizeHalfBlock;</div>
<div class="line"><a name="l01466"></a><span class="lineno"> 1466</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="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> stateRealLo, stateImagLo; </div>
<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l01470"></a><span class="lineno"> 1470</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="l01471"></a><span class="lineno"> 1471</span>  </div>
<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>  sizeHalfBlock = 1LL << targetQubit;</div>
<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>  sizeBlock = 2LL * sizeHalfBlock;</div>
<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>  </div>
<div class="line"><a name="l01475"></a><span class="lineno"> 1475</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="l01476"></a><span class="lineno"> 1476</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="l01477"></a><span class="lineno"> 1477</span>  </div>
<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>  </div>
<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>  </div>
<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>  stateVecReal[indexLo] = cosAngle*stateRealLo - sinAngle*stateImagLo;</div>
<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>  stateVecImag[indexLo] = sinAngle*stateRealLo + cosAngle*stateImagLo;</div>
<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a1e57230c7995447039e62a84c0a36524"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1e57230c7995447039e62a84c0a36524">◆ </a></span>statevec_reportStateToScreen()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_reportStateToScreen </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQuESTEnv.html">QuESTEnv</a> </td>
<td class="paramname"><em>env</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>reportRank</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Print the current state vector of probability amplitudes for a set of qubits to standard out. </p>
<p>For debugging purposes. Each rank should print output serially. Only print output for systems <= 5 qubits </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00543">543</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  {</div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  <span class="keywordtype">int</span> rank;</div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(qureg); </div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#a0a86e8a50ea8c998b4a0a6640c5a1218">numQubitsInStateVec</a><=5){</div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</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="l00549"></a><span class="lineno"> 549</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>==rank){</div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  <span class="keywordflow">if</span> (reportRank) {</div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</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="l00552"></a><span class="lineno"> 552</span>  <span class="comment">//printf("\trank, index, real, imag\n");</span></div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  printf(<span class="stringliteral">"real, imag\n"</span>);</div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (rank==0) {</div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  printf(<span class="stringliteral">"Reporting state [\n"</span>);</div>
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  printf(<span class="stringliteral">"real, imag\n"</span>);</div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  }</div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  </div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</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="l00560"></a><span class="lineno"> 560</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="l00561"></a><span class="lineno"> 561</span>  }</div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</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="l00563"></a><span class="lineno"> 563</span>  }</div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <a class="code" href="group__debug.html#ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77">syncQuESTEnv</a>(env);</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"> 567</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00529">copyStateFromGPU()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00338">Qureg::numChunks</a>, <a class="el" href="QuEST_8h_source.html#l00329">Qureg::numQubitsInStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l00481">syncQuESTEnv()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01594">reportStateToScreen()</a>.</p>
</div>
</div>
<a id="aa121d55f2ca09c06a96ddcd433c60b0f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa121d55f2ca09c06a96ddcd433c60b0f">◆ </a></span>statevec_setAmps()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_setAmps </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>startInd</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reals</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>imags</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numAmps</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00153">153</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  {</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>.imag)), </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><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00157">initStateFromAmps()</a>, <a class="el" href="QuEST_8c_source.html#l01021">setAmps()</a>, and <a class="el" href="QuEST_8c_source.html#l01030">setDensityAmps()</a>.</p>
</div>
</div>
<a id="ad64a23933361fafc1b6b1787759c2663"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad64a23933361fafc1b6b1787759c2663">◆ </a></span>statevec_setWeightedQureg()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_setWeightedQureg </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>fac1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>fac2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>facOut</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>out</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03175">3175</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03175"></a><span class="lineno"> 3175</span>  {</div>
<div class="line"><a name="l03176"></a><span class="lineno"> 3176</span>  </div>
<div class="line"><a name="l03177"></a><span class="lineno"> 3177</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="l03178"></a><span class="lineno"> 3178</span>  </div>
<div class="line"><a name="l03179"></a><span class="lineno"> 3179</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l03180"></a><span class="lineno"> 3180</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l03181"></a><span class="lineno"> 3181</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l03182"></a><span class="lineno"> 3182</span>  statevec_setWeightedQuregKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l03183"></a><span class="lineno"> 3183</span>  fac1, qureg1, fac2, qureg2, facOut, out</div>
<div class="line"><a name="l03184"></a><span class="lineno"> 3184</span>  );</div>
<div class="line"><a name="l03185"></a><span class="lineno"> 3185</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01037">setWeightedQureg()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00538">statevec_applyPauliSum()</a>.</p>
</div>
</div>
<a id="a040a1c670457b4b5789c089a3d32bf8f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a040a1c670457b4b5789c089a3d32bf8f">◆ </a></span>statevec_setWeightedQuregKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_setWeightedQuregKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>fac1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>fac2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>facOut</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>out</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l03143">3143</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l03143"></a><span class="lineno"> 3143</span>  {</div>
<div class="line"><a name="l03144"></a><span class="lineno"> 3144</span>  </div>
<div class="line"><a name="l03145"></a><span class="lineno"> 3145</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="l03146"></a><span class="lineno"> 3146</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="l03147"></a><span class="lineno"> 3147</span>  <span class="keywordflow">if</span> (ampInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03148"></a><span class="lineno"> 3148</span>  </div>
<div class="line"><a name="l03149"></a><span class="lineno"> 3149</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="l03150"></a><span class="lineno"> 3150</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="l03151"></a><span class="lineno"> 3151</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="l03152"></a><span class="lineno"> 3152</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="l03153"></a><span class="lineno"> 3153</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="l03154"></a><span class="lineno"> 3154</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="l03155"></a><span class="lineno"> 3155</span>  </div>
<div class="line"><a name="l03156"></a><span class="lineno"> 3156</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="l03157"></a><span class="lineno"> 3157</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="l03158"></a><span class="lineno"> 3158</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="l03159"></a><span class="lineno"> 3159</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="l03160"></a><span class="lineno"> 3160</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="l03161"></a><span class="lineno"> 3161</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="l03162"></a><span class="lineno"> 3162</span>  </div>
<div class="line"><a name="l03163"></a><span class="lineno"> 3163</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re1,im1, re2,im2, reOut,imOut;</div>
<div class="line"><a name="l03164"></a><span class="lineno"> 3164</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = ampInd;</div>
<div class="line"><a name="l03165"></a><span class="lineno"> 3165</span>  </div>
<div class="line"><a name="l03166"></a><span class="lineno"> 3166</span>  re1 = vecRe1[index]; im1 = vecIm1[index];</div>
<div class="line"><a name="l03167"></a><span class="lineno"> 3167</span>  re2 = vecRe2[index]; im2 = vecIm2[index];</div>
<div class="line"><a name="l03168"></a><span class="lineno"> 3168</span>  reOut = vecReOut[index];</div>
<div class="line"><a name="l03169"></a><span class="lineno"> 3169</span>  imOut = vecImOut[index];</div>
<div class="line"><a name="l03170"></a><span class="lineno"> 3170</span>  </div>
<div class="line"><a name="l03171"></a><span class="lineno"> 3171</span>  vecReOut[index] = (facReOut*reOut - facImOut*imOut) + (facRe1*re1 - facIm1*im1) + (facRe2*re2 - facIm2*im2);</div>
<div class="line"><a name="l03172"></a><span class="lineno"> 3172</span>  vecImOut[index] = (facReOut*imOut + facImOut*reOut) + (facRe1*im1 + facIm1*re1) + (facRe2*im2 + facIm2*re2);</div>
<div class="line"><a name="l03173"></a><span class="lineno"> 3173</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>.</p>
</div>
</div>
<a id="ab7478fcaf6357ab202d72853b672e375"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab7478fcaf6357ab202d72853b672e375">◆ </a></span>statevec_swapQubitAmps()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_swapQubitAmps </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qb1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qb2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01769">1769</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01770"></a><span class="lineno"> 1770</span> {</div>
<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01773"></a><span class="lineno"> 1773</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="l01774"></a><span class="lineno"> 1774</span>  statevec_swapQubitAmpsKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, qb1, qb2);</div>
<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__common_8c_source.html#l00849">agnostic_applyQFT()</a>, and <a class="el" href="QuEST_8c_source.html#l00627">swapGate()</a>.</p>
</div>
</div>
<a id="a89a450a1932e4f4f94cf1487af9d263b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a89a450a1932e4f4f94cf1487af9d263b">◆ </a></span>statevec_swapQubitAmpsKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_swapQubitAmpsKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qb1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qb2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01743">1743</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  </div>
<div class="line"><a name="l01745"></a><span class="lineno"> 1745</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="l01746"></a><span class="lineno"> 1746</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="l01747"></a><span class="lineno"> 1747</span>  </div>
<div class="line"><a name="l01748"></a><span class="lineno"> 1748</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="l01749"></a><span class="lineno"> 1749</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="l01750"></a><span class="lineno"> 1750</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>  </div>
<div class="line"><a name="l01752"></a><span class="lineno"> 1752</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="l01753"></a><span class="lineno"> 1753</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re01, re10, im01, im10;</div>
<div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>  </div>
<div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>  <span class="comment">// determine ind00 of |..0..0..>, |..0..1..> and |..1..0..></span></div>
<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>  ind00 = <a class="code" href="QuEST__gpu_8cu.html#a4760109974e9b52c60e9d60ccded3138">insertTwoZeroBits</a>(thisTask, qb1, qb2);</div>
<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>  ind01 = <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(ind00, qb1);</div>
<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>  ind10 = <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(ind00, qb2);</div>
<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>  </div>
<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>  <span class="comment">// extract statevec amplitudes </span></div>
<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>  re01 = reVec[ind01]; im01 = imVec[ind01];</div>
<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>  re10 = reVec[ind10]; im10 = imVec[ind10];</div>
<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>  </div>
<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>  <span class="comment">// swap 01 and 10 amps</span></div>
<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>  reVec[ind01] = re10; reVec[ind10] = re01;</div>
<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>  imVec[ind01] = im10; imVec[ind10] = im01;</div>
<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00095">flipBit()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00106">insertTwoZeroBits()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="ac3735bd959600e57b2ee3a105666cddf"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac3735bd959600e57b2ee3a105666cddf">◆ </a></span>statevec_unitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_unitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00972">972</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00973"></a><span class="lineno"> 973</span> {</div>
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00976"></a><span class="lineno"> 976</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="l00977"></a><span class="lineno"> 977</span>  statevec_unitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, argifyMatrix2(u));</div>
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01084">applyMatrix2()</a>, and <a class="el" href="QuEST_8c_source.html#l00348">unitary()</a>.</p>
</div>
</div>
<a id="a19e364fb77ebe56afd7cd7cc6de12449"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a19e364fb77ebe56afd7cd7cc6de12449">◆ </a></span>statevec_unitaryKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_unitaryKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ArgMatrix2 </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>fix – no necessary for GPU version</p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00919">919</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00919"></a><span class="lineno"> 919</span>  {</div>
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l00921"></a><span class="lineno"> 921</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="l00922"></a><span class="lineno"> 922</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l00924"></a><span class="lineno"> 924</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="l00925"></a><span class="lineno"> 925</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  </div>
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00928"></a><span class="lineno"> 928</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="l00929"></a><span class="lineno"> 929</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l00930"></a><span class="lineno"> 930</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00931"></a><span class="lineno"> 931</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="l00932"></a><span class="lineno"> 932</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="l00933"></a><span class="lineno"> 933</span>  </div>
<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span>  </div>
<div class="line"><a name="l00937"></a><span class="lineno"> 937</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>  </div>
<div class="line"><a name="l00942"></a><span class="lineno"> 942</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="l00943"></a><span class="lineno"> 943</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="l00944"></a><span class="lineno"> 944</span>  </div>
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  </div>
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span>  </div>
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  </div>
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  stateImagLo = stateVecImag[indexLo];</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">// state[indexUp] = u00 * state[indexUp] + u01 * state[indexLo]</span></div>
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>  stateVecReal[indexUp] = u.r0c0.real*stateRealUp - u.r0c0.imag*stateImagUp </div>
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>  + u.r0c1.real*stateRealLo - u.r0c1.imag*stateImagLo;</div>
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  stateVecImag[indexUp] = u.r0c0.real*stateImagUp + u.r0c0.imag*stateRealUp </div>
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  + u.r0c1.real*stateImagLo + u.r0c1.imag*stateRealLo;</div>
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>  </div>
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>  <span class="comment">// state[indexLo] = u10 * state[indexUp] + u11 * state[indexLo]</span></div>
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>  stateVecReal[indexLo] = u.r1c0.real*stateRealUp - u.r1c0.imag*stateImagUp </div>
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  + u.r1c1.real*stateRealLo - u.r1c1.imag*stateImagLo;</div>
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  stateVecImag[indexLo] = u.r1c0.real*stateImagUp + u.r1c0.imag*stateRealUp </div>
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  + u.r1c1.real*stateImagLo + u.r1c1.imag*stateRealLo;</div>
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00346">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a31772904f024efd8d75a022e84c8207b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a31772904f024efd8d75a022e84c8207b">◆ </a></span>swapDouble()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void swapDouble </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> ** </td>
<td class="paramname"><em>a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> ** </td>
<td class="paramname"><em>b</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02057">2057</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *temp;</div>
<div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>  temp = *a;</div>
<div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>  *a = *b;</div>
<div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>  *b = temp;</div>
<div class="line"><a name="l02062"></a><span class="lineno"> 2062</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l03412">densmatr_calcExpecDiagonalOp()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02519">densmatr_calcFidelity()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02593">densmatr_calcHilbertSchmidtDistance()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02313">densmatr_calcInnerProduct()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02664">densmatr_calcPurity()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02064">densmatr_findProbabilityOfZero()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l03276">statevec_calcExpecDiagonalOp()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02393">statevec_calcInnerProduct()</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l02112">statevec_findProbabilityOfZero()</a>.</p>
</div>
</div>
</div><!-- contents -->
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65acb26952815118f5ced7703302dbeb556"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65acb26952815118f5ced7703302dbeb556">INVERSE_PRODUCT</a></div><div class="ttdeci">@ INVERSE_PRODUCT</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00233">QuEST.h:233</a></div></div>
<div class="ttc" id="agroup__type_html_ga1c703cf89629e4e9c7023cd402d67028"><div class="ttname"><a href="group__type.html#ga1c703cf89629e4e9c7023cd402d67028">pauliOpType</a></div><div class="ttdeci">pauliOpType</div><div class="ttdoc">Codes for specifying Pauli operators.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00096">QuEST.h:96</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#l01925">QuEST_gpu.cu:1925</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#l00529">QuEST_gpu.cu:529</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#l00481">QuEST_gpu.cu:481</a></div></div>
<div class="ttc" id="agroup__type_html_gga1c703cf89629e4e9c7023cd402d67028a085c85cff6ba79c52d8b1e61c42ddddf"><div class="ttname"><a href="group__type.html#gga1c703cf89629e4e9c7023cd402d67028a085c85cff6ba79c52d8b1e61c42ddddf">PAULI_Z</a></div><div class="ttdeci">@ PAULI_Z</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00096">QuEST.h:96</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65a2ad72f168181763513d7793c13bf2a91"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a2ad72f168181763513d7793c13bf2a91">DISTANCE</a></div><div class="ttdeci">@ DISTANCE</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00234">QuEST.h:234</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#l00364">QuEST.h:364</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#l01951">QuEST_gpu.cu:1951</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#l02057">QuEST_gpu.cu:2057</a></div></div>
<div class="ttc" id="astructDiagonalOp_html_ada3bffa8e414f883e415dd74e46cd879"><div class="ttname"><a href="structDiagonalOp.html#ada3bffa8e414f883e415dd74e46cd879">DiagonalOp::numChunks</a></div><div class="ttdeci">int numChunks</div><div class="ttdoc">The number of nodes between which the elements of this operator are split.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00304">QuEST.h:304</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#l00343">QuEST.h:343</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a5a34c2468f9c21c35ccca1b5e491e238"><div class="ttname"><a href="QuEST__gpu_8cu.html#a5a34c2468f9c21c35ccca1b5e491e238">statevec_findProbabilityOfZero</a></div><div class="ttdeci">qreal statevec_findProbabilityOfZero(Qureg qureg, int measureQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02112">QuEST_gpu.cu:2112</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#l00338">QuEST.h:338</a></div></div>
<div class="ttc" id="agroup__type_html_gga9c91c41aa42ae537995e89ffc616afe1a9aa2a35d92976c7de970506c4d19a96c"><div class="ttname"><a href="group__type.html#gga9c91c41aa42ae537995e89ffc616afe1a9aa2a35d92976c7de970506c4d19a96c">TWOS_COMPLEMENT</a></div><div class="ttdeci">@ TWOS_COMPLEMENT</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00269">QuEST.h:269</a></div></div>
<div class="ttc" id="astructDiagonalOp_html_aebb8af156861c4bc0dd4f35f6982570a"><div class="ttname"><a href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">DiagonalOp::deviceOperator</a></div><div class="ttdeci">ComplexArray deviceOperator</div><div class="ttdoc">A copy of the elements stored persistently on the GPU.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00312">QuEST.h:312</a></div></div>
<div class="ttc" id="astructDiagonalOp_html_aa91713a22c95a383bba55e56c4a4e37a"><div class="ttname"><a href="structDiagonalOp.html#aa91713a22c95a383bba55e56c4a4e37a">DiagonalOp::chunkId</a></div><div class="ttdeci">int chunkId</div><div class="ttdoc">The position of the chunk of the operator held by this process in the full operator.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00306">QuEST.h:306</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#l00346">QuEST.h:346</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65ae003ec1158e3a4e295616ced12af154e"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ae003ec1158e3a4e295616ced12af154e">NORM</a></div><div class="ttdeci">@ NORM</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00232">QuEST.h:232</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a01be2e229994aaffd9f73e966e515fd5"><div class="ttname"><a href="QuEST__gpu_8cu.html#a01be2e229994aaffd9f73e966e515fd5">densmatr_oneQubitDegradeOffDiagonal</a></div><div class="ttdeci">void densmatr_oneQubitDegradeOffDiagonal(Qureg qureg, int targetQubit, qreal dephFac)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02879">QuEST_gpu.cu:2879</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65ae5114537389194302c7a619e35e6e227"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ae5114537389194302c7a619e35e6e227">SCALED_INVERSE_DISTANCE</a></div><div class="ttdeci">@ SCALED_INVERSE_DISTANCE</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00234">QuEST.h:234</a></div></div>
<div class="ttc" id="agroup__type_html_gga9c91c41aa42ae537995e89ffc616afe1a7165f9a47792f47c718ca128556fb3ae"><div class="ttname"><a href="group__type.html#gga9c91c41aa42ae537995e89ffc616afe1a7165f9a47792f47c718ca128556fb3ae">UNSIGNED</a></div><div class="ttdeci">@ UNSIGNED</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00269">QuEST.h:269</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65a6313e6ff48163c11c47866c4fda4bfa0"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a6313e6ff48163c11c47866c4fda4bfa0">INVERSE_DISTANCE</a></div><div class="ttdeci">@ INVERSE_DISTANCE</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00234">QuEST.h:234</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_ae1b7788cf504ec3d79de3855f97929c7"><div class="ttname"><a href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a></div><div class="ttdeci">__forceinline__ __device__ long long int flipBit(const long long int number, const 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="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#l00329">QuEST.h:329</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#l00336">QuEST.h:336</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a5c6f1b2c71f43e57de4a1f818ddfbfd0"><div class="ttname"><a href="QuEST__gpu_8cu.html#a5c6f1b2c71f43e57de4a1f818ddfbfd0">insertZeroBit</a></div><div class="ttdeci">__forceinline__ __device__ long long int insertZeroBit(const long long int number, const 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="astructDiagonalOp_html_a85c3f52533efe831bbe40b9a48602388"><div class="ttname"><a href="structDiagonalOp.html#a85c3f52533efe831bbe40b9a48602388">DiagonalOp::imag</a></div><div class="ttdeci">qreal * imag</div><div class="ttdoc">The imaginary values of the 2^numQubits complex elements.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00310">QuEST.h:310</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a73167d054e4e8e7bfce4e3e8480c292d"><div class="ttname"><a href="QuEST__gpu_8cu.html#a73167d054e4e8e7bfce4e3e8480c292d">densmatr_findProbabilityOfZero</a></div><div class="ttdeci">qreal densmatr_findProbabilityOfZero(Qureg qureg, int measureQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02064">QuEST_gpu.cu:2064</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#l00332">QuEST.h:332</a></div></div>
<div class="ttc" id="astructPauliHamil_html_ac1c6c9f6299cf83bbba88123216c3cac"><div class="ttname"><a href="structPauliHamil.html#ac1c6c9f6299cf83bbba88123216c3cac">PauliHamil::termCoeffs</a></div><div class="ttdeci">qreal * termCoeffs</div><div class="ttdoc">The real coefficient of each Pauli product. This is an array of length PauliHamil....</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00283">QuEST.h:283</a></div></div>
<div class="ttc" id="astructPauliHamil_html_a4b8d38c403553c07ceddcd40c46ce6c8"><div class="ttname"><a href="structPauliHamil.html#a4b8d38c403553c07ceddcd40c46ce6c8">PauliHamil::pauliCodes</a></div><div class="ttdeci">enum pauliOpType * pauliCodes</div><div class="ttdoc">The Pauli operators acting on each qubit, flattened over every operator.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00281">QuEST.h:281</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#l00519">QuEST_gpu.cu:519</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="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65a31a29a30f92fe34c35098f941adbbc93"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a31a29a30f92fe34c35098f941adbbc93">SCALED_PRODUCT</a></div><div class="ttdeci">@ SCALED_PRODUCT</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00233">QuEST.h:233</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#l00365">QuEST.h:365</a></div></div>
<div class="ttc" id="astructDiagonalOp_html_a5131eeb67aafb4c19ac98270c3266742"><div class="ttname"><a href="structDiagonalOp.html#a5131eeb67aafb4c19ac98270c3266742">DiagonalOp::numQubits</a></div><div class="ttdeci">int numQubits</div><div class="ttdoc">The number of qubits this operator can act on (informing its size)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00300">QuEST.h:300</a></div></div>
<div class="ttc" id="astructPauliHamil_html_a737e46b40ef8990cf004d22eb9dbe2e4"><div class="ttname"><a href="structPauliHamil.html#a737e46b40ef8990cf004d22eb9dbe2e4">PauliHamil::numSumTerms</a></div><div class="ttdeci">int numSumTerms</div><div class="ttdoc">The number of terms in the weighted sum, or the number of Pauli products.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00285">QuEST.h:285</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_acc45bb8300922ea5933e294921e25ea2"><div class="ttname"><a href="QuEST__common_8c.html#acc45bb8300922ea5933e294921e25ea2">getQubitBitMask</a></div><div class="ttdeci">long long int getQubitBitMask(int *qubits, int numQubits)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00050">QuEST_common.c:50</a></div></div>
<div class="ttc" id="astructDiagonalOp_html"><div class="ttname"><a href="structDiagonalOp.html">DiagonalOp</a></div><div class="ttdoc">Represents a diagonal complex operator on the full Hilbert state of a Qureg.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00297">QuEST.h:297</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a9bac39238e100b0f845dc6e4deafc1c9"><div class="ttname"><a href="QuEST__gpu_8cu.html#a9bac39238e100b0f845dc6e4deafc1c9">insertZeroBits</a></div><div class="ttdeci">__forceinline__ __device__ long long int insertZeroBits(long long int number, int *inds, const 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="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65aa318172feec5b530e9a7849f2f7b44e7"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65aa318172feec5b530e9a7849f2f7b44e7">SCALED_INVERSE_SHIFTED_NORM</a></div><div class="ttdeci">@ SCALED_INVERSE_SHIFTED_NORM</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00232">QuEST.h:232</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#l00189">QuEST.h:189</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#l00348">QuEST.h:348</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aec1852e1a8e70d3690919ce8ab551ba0"><div class="ttname"><a href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a></div><div class="ttdeci">__forceinline__ __device__ int extractBit(const int locationOfBitFromRight, const 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="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#l02938">QuEST_gpu.cu:2938</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65ad4c32e295c08ebe224e2c5ba6497f043"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ad4c32e295c08ebe224e2c5ba6497f043">INVERSE_NORM</a></div><div class="ttdeci">@ INVERSE_NORM</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00232">QuEST.h:232</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a4760109974e9b52c60e9d60ccded3138"><div class="ttname"><a href="QuEST__gpu_8cu.html#a4760109974e9b52c60e9d60ccded3138">insertTwoZeroBits</a></div><div class="ttdeci">__forceinline__ __device__ long long int insertTwoZeroBits(const long long int number, const int bit1, const 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="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#l00190">QuEST.h:190</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65acb6911398e0068f545a31b82bcdef3e4"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65acb6911398e0068f545a31b82bcdef3e4">PRODUCT</a></div><div class="ttdeci">@ PRODUCT</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00233">QuEST.h:233</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#l00341">QuEST.h:341</a></div></div>
<div class="ttc" id="astructDiagonalOp_html_a2c6eab631ef48b4978db026c98180eee"><div class="ttname"><a href="structDiagonalOp.html#a2c6eab631ef48b4978db026c98180eee">DiagonalOp::numElemsPerChunk</a></div><div class="ttdeci">long long int numElemsPerChunk</div><div class="ttdoc">The number of the 2^numQubits amplitudes stored on each distributed node.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00302">QuEST.h:302</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#l00325">QuEST.h:325</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#l00188">QuEST.h:188</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aa31f0ef43a921c3ac73545d1d3670fa1"><div class="ttname"><a href="QuEST__gpu_8cu.html#aa31f0ef43a921c3ac73545d1d3670fa1">densmatr_mixDephasing</a></div><div class="ttdeci">void densmatr_mixDephasing(Qureg qureg, int targetQubit, qreal dephase)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02899">QuEST_gpu.cu:2899</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#l00327">QuEST.h:327</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#l00334">QuEST.h:334</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65ace23d4b924240a245d83193f0ce398d4"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ace23d4b924240a245d83193f0ce398d4">SCALED_DISTANCE</a></div><div class="ttdeci">@ SCALED_DISTANCE</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00234">QuEST.h:234</a></div></div>
<div class="ttc" id="astructDiagonalOp_html_a1d66088bed235d524cd452b107694d5c"><div class="ttname"><a href="structDiagonalOp.html#a1d66088bed235d524cd452b107694d5c">DiagonalOp::real</a></div><div class="ttdeci">qreal * real</div><div class="ttdoc">The real values of the 2^numQubits complex elements.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00308">QuEST.h:308</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#l01932">QuEST_gpu.cu:1932</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="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65a39111120b79016d6b3e773b711fa63f7"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a39111120b79016d6b3e773b711fa63f7">SCALED_INVERSE_SHIFTED_DISTANCE</a></div><div class="ttdeci">@ SCALED_INVERSE_SHIFTED_DISTANCE</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00234">QuEST.h:234</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="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65a93c0c1e166dd43c6a57f61e5490808e1"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a93c0c1e166dd43c6a57f61e5490808e1">SCALED_NORM</a></div><div class="ttdeci">@ SCALED_NORM</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00232">QuEST.h:232</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65a1a5168576607f460d3e60f184575cacb"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a1a5168576607f460d3e60f184575cacb">SCALED_INVERSE_PRODUCT</a></div><div class="ttdeci">@ SCALED_INVERSE_PRODUCT</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00233">QuEST.h:233</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#l00348">QuEST.h:348</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65ae8c96906c1ec109d295c491e572d01e2"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ae8c96906c1ec109d295c491e572d01e2">SCALED_INVERSE_NORM</a></div><div class="ttdeci">@ SCALED_INVERSE_NORM</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00232">QuEST.h:232</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>