【发布时间】:2026-02-11 21:55:02
【问题描述】:
我一直在用 cuda 开发一款生活游戏。我想找到每个元素的数组索引,以便我可以计算该元素的邻居,以便我可以将新值写入该数组。我发现的所有关于此的事情都在使用指向行的指针,我只是无法弄清楚这究竟是如何转换为索引的。为了更好地理解我的意思,我必须遵循代码(一些 sn-ps):
#define THREADSPERBLOCK 1024
lifeState *d_gameStateInitial;
size_t d_gameStateInitial_pitch;
int sizeX = 100;
int sizeY = 100;
int numBlocks = ((sizeX * sizeY) % THREADSPERBLOCK) + 1;
int numThreadsPerBlock;
if(numBlocks == 1)
{
numThreadsPerBlock = sizeX * sizeY;
}
else
{
numThreadsPerBlock = THREADSPERBLOCK;
}
cudaMallocPitch((void **)&d_gameStateInitial, &d_gameStateInitial_pitch, sizeX * sizeof(lifeState), sizeY);
doTheGame<<<numBlocks, numThreadsPerBlock>>>(d_gameStateInitial, d_gameStateInitial_pitch, d_gameStateNew, d_gameStateNew_pitch, sizeX, sizeY);
“lifestate *”只是一个包含死/活枚举的结构。两个数组,初始数组和新数组都以完全相同的方式进行 malloc。在 doTheGame 内核中,我现在想知道如何计算索引,我正在考虑这样的事情,但我认为这是错误的:
__global__ void doTheGame(lifeState *initialArray, size_t initialArrayPitch,
lifeState *newArray, size_t newArrayPitch,
int sizeX, int sizeY)
{
int initialArrayThreadIndex = (blockIdx.x * initialArrayPitch) + threadIdx.x;
int newArrayThreadIndex = (blockIdx.x * initialArrayPitch) + threadIdx.x;
}
到目前为止,我发现的所有内容都与 cudaMallocPitch 示例基本相同:
T* pElement = (T*)((char*)BaseAddress + Row * pitch) + Column;
但我只是看不出它如何准确地转换为块、线程以及 x 和 y。
提前致谢。
【问题讨论】:
-
我在这里没有真正看到问题。你到底想知道什么?
标签: c++ c arrays cuda conways-game-of-life