我正在开展一个示例项目,首先使用串行算法,然后编写一个CUDA并行实现来比较结果和速度。
该项目是一个简单的Connect Four游戏。 如果你不知道它的名字,那么这是游戏的Picture。
因此,因为我将重用CUDA实现的代码,这些代码必须与cudaMalloc和cudaMemcpy一起使用,所以我使用malloc创建了串行实现。
我的问题出在我的GameBoard类中,它包含初始化和访问字段的方法。我正在使用:
分配矩阵this->board = static_cast<int*>(malloc(sizeof(int) * GameBoard::BOARD_SIZE));
for (int i = 0; i < GameBoard::BOARD_SIZE; i++)
{
this->board[i] = 0;
}
*我没有使用calloc来保持它与CUDA实现类似,因为没有cudaCalloc
BOARD_SIZE
的位置:
static const int BOARD_HEIGHT = 6;
static const int BOARD_WIDTH = 7;
static const int BOARD_SIZE = BOARD_HEIGHT * BOARD_WIDTH;
我必须使用一个数组并进行数学运算并假装它是一个矩阵,以便稍后进行简单的CUDA实现(指针类型的数组在GPU上不是一个好主意)。
这是我获得“数学”作品的方法:
int GameBoard::getPiece(int x, int y)
{
std::cout << x * GameBoard::BOARD_WIDTH + y << ", ";
std::cout << this->board[x * GameBoard::BOARD_WIDTH + y];
return this->board[x * GameBoard::BOARD_WIDTH + y];
}
这就是我所说的,在printBoard()方法中应该打印当前的电路板状态:
void GameBoard::printBoard()
{
for (int i = 0; i < BOARD_HEIGHT; i++)
for (int j = 0; j < BOARD_WIDTH; j++)
std::cout << getPiece(i, j) << " ";
...
}
我得到的结果是,一个矩阵充满了 -572662307 的“破碎指针”值。但是如果我在初始化方法中粘贴带有测试输出的循环,它会打印出零,就像它应该做的那样。
为什么我得到这种行为,在一个方法中指针工作正常,在下一个方法中,它完全被破坏了?我正在使用相同的getPiece()方法来访问元素,并且在这两个方法调用之间没有任何内容,它们一个接一个地被称为:
// in main
game.startGame();
game.runGame();
// initialization in startGame() with the constructor
this->game_board_ = GameBoard();
// first step in game loop of runGame(), nothing else is done before
game_board_.printBoard();