gpt4 book ai didi

cuda - 3D 图像索引

转载 作者:行者123 更新时间:2023-12-04 01:14:12 26 4
gpt4 key购买 nike

我有一个尺寸为 512 x 512 x 512 的图像。我需要单独处理所有体素。我怎样才能得到线程ID来做到这一点?如果我使用 1D 线程 ID, block 数将超过 65536。

    int id = blockIdx.x*blockDim.x + threadIdx.x;

注意:- 我的卡不支持 3D 网格

最佳答案

您可以在 CUDA 4.0 和计算能力 2.0+ 中使用 3D 指标。示例代码:

int blocksInX = (nx+8-1)/8;
int blocksInY = (ny+8-1)/8;
int blocksInZ = (nz+8-1)/8;

dim3 Dg(blocksInX, blocksInY, blocksInZ);
dim3 Db(8, 8, 8);
foo_kernel<<Dg, Db>>(R, nx, ny, nz);

...

__global__ void foo_kernel( float* R, const int nx, const int ny, const int nz )
{
unsigned int xIndex = blockDim.x * blockIdx.x + threadIdx.x;
unsigned int yIndex = blockDim.y * blockIdx.y + threadIdx.y;
unsigned int zIndex = blockDim.z * blockIdx.z + threadIdx.z;

if ( (xIndex < nx) && (yIndex < ny) && (zIndex < nz) )
{
unsigned int index_out = xIndex + nx*yIndex + nx*ny*zIndex;
...
R[index_out] = ...;
}
}

如果您的设备不支持计算能力 2.0,则有一些技巧:

int threadsInX = 16;
int threadsInY = 4;
int threadsInZ = 4;

int blocksInX = (nx+threadsInX-1)/threadsInX;
int blocksInY = (ny+threadsInY-1)/threadsInY;
int blocksInZ = (nz+threadsInZ-1)/threadsInZ;

dim3 Dg = dim3(blocksInX, blocksInY*blocksInZ);
dim3 Db = dim3(threadsInX, threadsInY, threadsInZ);

foo_kernel<<<Dg, Db>>>(R, nx, ny, nz, blocksInY, 1.0f/(float)blocksInY);

__global__ void foo_kernel(float *R, const int nx, const int ny, const int nz,
unsigned int blocksInY, float invBlocksInY)
{

unsigned int blockIdxz = __float2uint_rd(blockIdx.y * invBlocksInY);
unsigned int blockIdxy = blockIdx.y - __umul24(blockIdxz, blocksInY);
unsigned int xIndex = __umul24(blockIdx.x, blockDim.x) + threadIdx.x;
unsigned int yIndex = __umul24(blockIdxy, blockDim.y) + threadIdx.y;
unsigned int zIndex = __umul24(blockIdxz, blockDim.z) + threadIdx.z;

if ( (xIndex < nx) && (yIndex < xIndex) && (zIndex < nz) )
{
unsigned int index = xIndex + nx*yIndex + nx*ny*zIndex;
...
R[index] = ...;
}

}

关于cuda - 3D 图像索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7318002/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com