Cuda 基于三维阵列的断层图像分割

Cuda 基于三维阵列的断层图像分割,cuda,Cuda,我尝试在CUDA(200x200x100)中使用3D阵列 当我将z维度(model_num)从4更改为5时,我得到了一个分段错误。为什么,我怎样才能修复它 const int nrcells = 200; const int nphicells = 200; const int model_num = 5; //So far, 4 is the maximum model_num that works. At 5 and after, there is a segmentation fault

我尝试在CUDA(200x200x100)中使用3D阵列

当我将z维度(model_num)从4更改为5时,我得到了一个分段错误。为什么,我怎样才能修复它

const int nrcells = 200;
const int nphicells = 200;
const int model_num = 5; //So far, 4 is the maximum model_num that works. At 5 and after, there is a segmentation fault

    __global__ void kernel(float* mgridb) 
{
    const unsigned long long int  i = (blockIdx.y * gridDim.x + blockIdx.x) * blockDim.x + threadIdx.x;

    if(tx >= 0 && tx < nphicells && ty >=0 && ty < nrcells && tz >= 0  && tz < model_num){
        //Do stuff with mgridb[i]
    }
}

int main (void)
{

    unsigned long long int size_matrices = nphicells*nrcells*model_num; 
    unsigned long long int mem_size_matrices = sizeof(float) * size_matrices;

    float *h_mgridb = (float *)malloc(mem_size_matrices);
    float mgridb[nphicells][nrcells][model_num];

    for(int k = 0; k < model_num; k++){
        for(int j = 0; j < nrcells; j++){
            for(int i = 0; i < nphicells; i++){
                mgridb[i][j][k] = 0;
            }
        }
    }
    float *d_mgridb;

    cudaMalloc( (void**)&d_mgridb, mem_size_matrices );
    cudaMemcpy(d_mgridb, h_mgridb, mem_size_matrices, cudaMemcpyHostToDevice);

    int threads = nphicells;
    uint3 blocks = make_uint3(nrcells,model_num,1);
    kernel<<<blocks,threads>>>(d_mgridb);
    cudaMemcpy( h_mgridb, d_mgridb, mem_size_matrices, cudaMemcpyDeviceToHost);
    cudaFree(d_mgridb);
    return 0;
}
const int nrcell=200;
const int nphicells=200;
const int model_num=5//到目前为止,4是有效的最大型号。在5和之后,出现分段错误
__全局无效内核(float*mgridb)
{
const unsigned long long int i=(blockIdx.y*gridDim.x+blockIdx.x)*blockDim.x+threadIdx.x;
如果(tx>=0&&tx=0&&ty=0&&tz
这将存储在堆栈上:

float mgridb[nphicells][nrcells][model_num];
您的堆栈空间有限。当您超过了可以存储在堆栈上的数量时,无论是在分配时,还是在尝试访问堆栈时

改用
malloc
。这将分配堆存储,而堆存储具有更高的限制

以上这些都与CUDA无关

您可能还需要调整访问数组的方式,但使用指针索引并不困难


您的代码实际上看起来很奇怪,因为您正在使用
malloc
创建一个大小合适的数组
h\u mgridb
,然后将该数组复制到设备(到
d\u mgridb
)。不清楚
mgridb
在代码中起什么作用
h_mgridb
mgridb
不一样。

这将存储在堆栈上:

float mgridb[nphicells][nrcells][model_num];
您的堆栈空间有限。当您超过了可以存储在堆栈上的数量时,无论是在分配时,还是在尝试访问堆栈时

改用
malloc
。这将分配堆存储,而堆存储具有更高的限制

以上这些都与CUDA无关

您可能还需要调整访问数组的方式,但使用指针索引并不困难


您的代码实际上看起来很奇怪,因为您正在使用
malloc
创建一个大小合适的数组
h\u mgridb
,然后将该数组复制到设备(到
d\u mgridb
)。不清楚
mgridb
在代码中起什么作用
h_mgridb
mgridb
不一样。

请注意您在问题中发布的代码的格式和内容。您发布的代码不必要地难以阅读,并且包含不平衡的{}。请注意您在问题中发布的代码的格式和内容。你发布的代码不必要地难以阅读,并且包含不平衡的{}。谢谢你,罗伯特!这解决了问题。这解决了问题。我将float-mgridb[nphicells][nrcell][model\u num]更改为float-mgridb=(float*)malloc(mem\u size\u矩阵)。另外,在初始化“for”循环中,我将其引用为1D数组,因此mgridb[I+(jnphicells)+(knphicellsnrcells)]=0。我明白你的意思,如果我已经分配了mgridb,那么拥有h_mgridb没有多大意义。谢谢你,罗伯特!这解决了问题。这解决了问题。我将float-mgridb[nphicells][nrcell][model\u num]更改为float-mgridb=(float*)malloc(mem\u size\u矩阵)。另外,在初始化“for”循环中,我将其引用为1D数组,因此mgridb[I+(jnphicells)+(knphicellsnrcells)]=0。我明白你的意思,如果我已经在分配mgridb,那么拥有h_mgridb没有多大意义。