【问题标题】:Mysterious Seg Faults with CudamallocCudamalloc 的神秘 Seg 错误
【发布时间】:2013-06-16 17:36:36
【问题描述】:

谁能帮我理解为什么下面的代码会导致分段错误? 同样,谁能帮我理解为什么用标记为“好”的两行替换标记为“坏”的两行不会导致分段错误?

请注意,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);

}

【问题讨论】:

  • 不熟悉cuda,但你不需要经常打电话给synchronize吗?
  • 对我来说看起来不错,但是也许这些变量是在堆栈上创建的,而不是在程序的数据段中创建的。因此,如果它们太大,您可能会导致段错误? malloc 解决方案将它们放在堆上,因此您的程序又神秘地工作了。您可以尝试#defining P_size 而不是计算它,以便它是静态的并且程序使用数据段而不是堆空间。

标签: c cuda segmentation-fault


【解决方案1】:

标记为 good 的两行正在分配 262144 * sizeof(float) 字节。标有 bad 的两行正在分配 262144 * sizeof(float) * sizeof(float) 字节。

【讨论】:

  • 并非所有编译器都支持作为 GCC 扩展、C99 和 C++11 支持的可变长度堆栈数组。通常不鼓励将 MB 的数据放在堆栈上。请参阅how do I find the Maximum Stack Size 以获取有关如何查找和调整进程堆栈大小的更多信息。
【解决方案2】:

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

注意事项:

  • “好”行从系统堆中分配,“坏”行 分配堆栈存储。
  • 通常你可以从堆栈分配的数量是相当多的 比你可以从堆中分配的要小。
  • “好”和“坏”声明的保留量不同 float 存储。 “坏”分配了 4 倍的 float 存储。
  • 最后,cudaMemsetmemset 一样,正在设置 bytes 和 需要一个无符号字符数量,而不是浮点 (0.0) 数量。

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

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

我怀疑您可能会在“add2”行看到 seg 错误,因为它会首先使用损坏的堆栈存储。

【讨论】:

  • 啊,我应该比这更清楚。很可能是堆栈/堆问题,但我非常担心 Cuda 方面,我为简单的 C 部分关闭了大脑。
猜你喜欢
  • 2015-03-13
  • 2017-04-20
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多