前提・実現したいこと
cuda用にクラスのオブジェクトの持つメンバ変数をgpuに送れるようにデータの加工を行おうとしています。
コード内にあるクラスGame,Board,Stateは他ファイルにて定義されるクラスです。
Gameクラスはゲーム全体を管理するクラスでメンバの1つとしてBoardクラスの変数を持っています。
Boardクラスはゲームの盤面情報を持つクラスです。ここでのゲームはオセロを想定しています。
StateクラスはGameクラスを変数として持つクラスです。このStateクラスをcudaで使えるようなデータに加工しようとしています。
発生している問題・エラーメッセージ
Segmentation fault (core dumped)
以下に示すvoidの戻り値の関数trans_data()を呼び出した後、呼び出し元に戻るときにsegmentation faultのエラーが発生します。
該当のソースコード
trans_data.cpp
c++
1 2#include "header/trans_data.hpp" 3 4void trans_data(State state, DATA_FOR_CUDA* dfc){ 5 Game game = state.game; 6 Board board = game.get_board(); 7 8 trans_board(board, dfc->board); 9 dfc->turn = game.get_turn(); 10 dfc->player = player_to_int(game.get_current_player()); 11 dfc->winner = -255; // PLAYER::NONE 12 dfc->was_passed = game.get_was_passed(); 13 14 cout << "end of trans_data()" << endl; 15 16 return; 17}
#test.cpp
c++
1#include "header/trans_data.hpp" 2 3int main(void){ 4 Game game; 5 State state = State(game); 6 7 DATA_FOR_CUDA* dfc = (DATA_FOR_CUDA*)malloc(sizeof(DATA_FOR_CUDA)); 8 trans_data(state, dfc); 9 cout << "ok trans_data()" << endl; 10 cout << dfc->turn << ", " << dfc->player << ", " << dfc->winner << ", " << dfc->was_passed << endl; 11}
#trans_data.hpp
#include <vector> #include <iostream> #include "state.hpp" #include "game.hpp" #include "board.hpp" #include "enum.hpp" #define BOARD_SIZE 8 typedef struct _DATA_FOR_CUDA { int board[BOARD_SIZE][BOARD_SIZE]; /* EMPTY = 0, WHITE = -1, BLACK = 1, WALL = 2, NONE = -255 */ int turn; int player, winner, start_player; /* WHITE = -1, BLACK = 1, DRAW = 0, NONE = -255 */ bool was_passed; } DATA_FOR_CUDA; void trans_data(State state, DATA_FOR_CUDA* dfc); void trans_board(Board board, int bArray[BOARD_SIZE][BOARD_SIZE]); int player_to_int(PLAYER p); int board_state_to_int(BOARD_STATE bs);
試したこと
標準出力std::coutを用いてどこでsegmentation faultが発生しているのか特定し、関数trans_data()から呼び出し元に戻るときにエラーが発生していることを突き止めました。
呼び出し元に戻った時に"ok trans_data()"と出力されず、また、関数内で"end of trans_data"と出力されることから呼び出し元に戻る際にエラーが発生していることがわかります。
補足情報(FW/ツールのバージョンなど)
コンパイラはnvccを用いており、その中でのg++のバージョンは9.3.0となっています。
今回、teratailでの初めての質問ですので、質問内容がわかりづらいかもしれません。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/09 08:25
2021/12/09 08:36
2021/12/09 09:22
2021/12/09 11:52
2021/12/09 12:32
2021/12/09 14:30
2021/12/09 15:52
2021/12/10 05:20