openjij
Framework for the Ising model and QUBO.
Loading...
Searching...
No Matches
gpu.hpp
Go to the documentation of this file.
1// Copyright 2023 Jij Inc.
2// Licensed under the Apache License, Version 2.0 (the "License");
3// you may not use this file except in compliance with the License.
4// You may obtain a copy of the License at
5
6// http://www.apache.org/licenses/LICENSE-2.0
7
8// Unless required by applicable law or agreed to in writing, software
9// distributed under the License is distributed on an "AS IS" BASIS,
10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11// See the License for the specific language governing permissions and
12// limitations under the License.
13
14#pragma once
15
16#ifdef USE_CUDA
17
23
24namespace openjij {
25namespace updater {
26
32template <typename System> struct GPU;
33
38template <typename FloatType, std::size_t rows_per_block,
39 std::size_t cols_per_block, std::size_t trotters_per_block>
40struct GPU<system::ChimeraTransverseGPU<FloatType, rows_per_block,
41 cols_per_block, trotters_per_block>> {
42
46 using QIsing =
47 system::ChimeraTransverseGPU<FloatType, rows_per_block, cols_per_block,
48 trotters_per_block>;
60 template <curandRngType_t rng_type>
61 inline static void update(
62 QIsing &system,
63 utility::cuda::CurandWrapper<FloatType, rng_type> &random_number_engine,
64 const utility::TransverseFieldUpdaterParameter &parameter) {
65
66 // generate uniform random sequence
67 random_number_engine.generate_uniform(system.info.rows * system.info.cols *
68 system.info.trotters *
69 system.info.chimera_unitsize,
70 system.dev_random);
71 // do metropolis
72 system::chimera_cuda::metropolis_interface<
73 FloatType, rows_per_block, cols_per_block, trotters_per_block>(
74 0, system.spin.get(), system.dev_random.get(),
75 system.interaction.J_out_p.get(), system.interaction.J_out_n.get(),
76 system.interaction.J_in_04.get(), system.interaction.J_in_15.get(),
77 system.interaction.J_in_26.get(), system.interaction.J_in_37.get(),
78 system.interaction.h.get(), system.info, system.grid, system.block,
79 parameter.beta, system.gamma, parameter.s);
80
81 // generate uniform random sequence
82 random_number_engine.generate_uniform(system.info.rows * system.info.cols *
83 system.info.trotters *
84 system.info.chimera_unitsize,
85 system.dev_random);
86 // do metropolis
87 system::chimera_cuda::metropolis_interface<
88 FloatType, rows_per_block, cols_per_block, trotters_per_block>(
89 1, system.spin.get(), system.dev_random.get(),
90 system.interaction.J_out_p.get(), system.interaction.J_out_n.get(),
91 system.interaction.J_in_04.get(), system.interaction.J_in_15.get(),
92 system.interaction.J_in_26.get(), system.interaction.J_in_37.get(),
93 system.interaction.h.get(), system.info, system.grid, system.block,
94 parameter.beta, system.gamma, parameter.s);
95 }
96};
97
102template <typename FloatType, std::size_t rows_per_block,
103 std::size_t cols_per_block>
104struct GPU<
105 system::ChimeraClassicalGPU<FloatType, rows_per_block, cols_per_block>> {
106
110 using CIsing =
111 system::ChimeraClassicalGPU<FloatType, rows_per_block, cols_per_block>;
123 template <curandRngType_t rng_type>
124 inline static void update(
125 CIsing &system,
126 utility::cuda::CurandWrapper<FloatType, rng_type> &random_number_engine,
127 const utility::ClassicalUpdaterParameter &parameter) {
128
129 // cast to chimera transverse field system with single trotter slice.
130 return GPU<typename CIsing::Base>::update(
131 system, random_number_engine,
132 utility::TransverseFieldUpdaterParameter(parameter.beta, 1));
133 }
134};
135
136} // namespace updater
137} // namespace openjij
138
139#endif
Definition algorithm.hpp:24
double FloatType
Note:
Definition compile_config.hpp:37