Cudamalloc的神秘Seg断层

时间:2013-06-20 01:22:02

标签: c cuda segmentation-fault

任何人都可以帮助我理解为什么以下代码导致分段错误? 同样,任何人都可以帮助我理解为什么换掉标记为“好”的两行标记为“坏”的两行并不会导致分段错误?

请注意,seg故障似乎发生在cudaMalloc线上;如果我发表评论,我也没有看到分段错误。这些分配似乎互相踩踏,但我不明白如何。

代码的意图是设置三个结构: 主机上的h_P,将由CPU例程填充 设备上的d_P,将由GPU例程填充 主机上的h_P_copy,将通过将GPU数据结构复制回来填充。

通过这种方式,我可以验证正确的行为,并确定一对一的基准 所有这些都是四维数组。

(如果重要,有问题的卡是GTX 580,在SUSE Linux下使用nvcc 4.2)

#define NUM_STATES              32
#define NUM_MEMORY              16

int main( int argc, char** argv) {

        // allocate and create P matrix
        int P_size      = sizeof(float) * NUM_STATES * NUM_STATES * NUM_MEMORY * NUM_MEMORY;
        // float *h_P      = (float*) malloc (P_size);  **good**
        // float *h_P_copy = (float*) malloc (P_size);  **good**
        float h_P[P_size];                            //  **bad**
        float h_P_copy[P_size];                       //  **bad**
        float *d_P;
        cudaMalloc( (void**) &d_P, P_size);
        cudaMemset( d_P, 0.0, P_size);

}

2 个答案:

答案 0 :(得分:3)

这可能是由于某种堆栈损坏造成的。

注意:

  • “好”行分配出系统堆,即“坏”行 分配堆栈存储。
  • 通常,您可以从堆栈中分配的金额相当多 小于你可以从堆中分配的内容。
  • “好”和“坏”声明不保留相同数量 float存储。 “坏”分配4倍float 存储
  • 最后,cudaMemset,就像memset一样,设置字节并且 期望无符号的char数量,而不是float(0.0)数量。

由于cudaMalloc行是第一个在“坏”情况下实际“使用”(尝试设置)任何分配的堆栈存储的行,因此它就是发生seg错误的地方。如果您添加了类似的附加声明:

    float *d_P;
    float myval;  //add
    myval = 0.0f; //add2
    cudaMalloc( (void**) &d_P, P_size);

我怀疑你可能会在“add2”行上看到seg错误,因为它将是第一个使用损坏的堆栈存储的。

答案 1 :(得分:1)

标有 good 的两行分配 262144 * sizeof(float)字节。标记为错误的两行分配 262144 * sizeof(float)* sizeof(float)字节。