Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有Cudamaloc的神秘Seg断层_C_Cuda_Segmentation Fault - Fatal编程技术网

带有Cudamaloc的神秘Seg断层

带有Cudamaloc的神秘Seg断层,c,cuda,segmentation-fault,C,Cuda,Segmentation Fault,有人能帮我理解为什么下面的代码会导致分段错误吗? 同样,有人能帮助我理解为什么将标有“坏”的两行替换为标有“好”的两行不会导致分割错误吗 注意,seg故障似乎发生在Cudamaloc线路上;如果我对此进行评论,我也不会看到分割错误。这些分配似乎相互影响,但我不明白如何 本规范旨在建立三个结构: 主机上的h_P,将由CPU例程填充 设备上的d_P,将由GPU例程填充 主机上的h_P_copy,将通过将GPU数据结构复制回来填充 这样,我就可以验证正确的行为,并对其中一种行为与另一种行为进行基准测试

有人能帮我理解为什么下面的代码会导致分段错误吗? 同样,有人能帮助我理解为什么将标有“坏”的两行替换为标有“好”的两行不会导致分割错误吗

注意,seg故障似乎发生在Cudamaloc线路上;如果我对此进行评论,我也不会看到分割错误。这些分配似乎相互影响,但我不明白如何

本规范旨在建立三个结构: 主机上的h_P,将由CPU例程填充 设备上的d_P,将由GPU例程填充 主机上的h_P_copy,将通过将GPU数据结构复制回来填充

这样,我就可以验证正确的行为,并对其中一种行为与另一种行为进行基准测试。
事实上,所有这些都是四维数组

(如果有必要,所讨论的卡是GTX 580,在SUSE Linux下使用nvcc 4.2)


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

注:

  • “好”行从系统堆中分配,“坏”行 分配堆栈存储
  • 通常,您可以从堆栈中分配的数量是相当多的 小于您可以从堆中分配的值
  • “好”和“坏”声明保留的金额不相同 浮动的存储。“坏”分配了4倍的
    float
    储藏室
  • 最后,
    cudaMemset
    ,就像
    memset
    ,正在设置字节和 应为无符号字符数量,而不是浮点(0.0)数量
由于
cudamaloc
行是第一个在“坏”情况下实际“使用”(尝试设置)任何分配的堆栈存储的行,因此发生seg故障的地方。如果您添加了这样的附加声明:

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

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

这可能是由于某种类型的堆栈损坏

注:

  • “好”行从系统堆中分配,“坏”行 分配堆栈存储
  • 通常,您可以从堆栈中分配的数量是相当多的 小于您可以从堆中分配的值
  • “好”和“坏”声明保留的金额不相同 浮动的存储。“坏”分配了4倍的
    float
    储藏室
  • 最后,
    cudaMemset
    ,就像
    memset
    ,正在设置字节和 应为无符号字符数量,而不是浮点(0.0)数量
由于
cudamaloc
行是第一个在“坏”情况下实际“使用”(尝试设置)任何分配的堆栈存储的行,因此发生seg故障的地方。如果您添加了这样的附加声明:

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

我怀疑您可能会看到seg故障发生在“add2”行上,因为它将首先使用损坏的堆栈存储。

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

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

不熟悉cuda,但您不需要每隔一段时间调用某种类型的
synchronize
?我觉得这没什么问题,但是这些变量可能是在堆栈上创建的,而不是在程序的数据段中创建的。因此,如果它们太大,可能会导致seg故障?malloc解决方案将它们放在堆上,因此您的程序会神秘地再次工作。您可以尝试定义P#U大小,而不是计算它,这样它是静态的,并且程序使用数据段而不是堆空间。不熟悉cuda,但您不需要经常调用某种类型的
同步
?我觉得没问题,但是,这些变量可能是在堆栈上创建的,而不是在程序的数据段中创建的。因此,如果它们太大,可能会导致seg故障?malloc解决方案将它们放在堆上,因此您的程序会神秘地再次工作。您可以尝试#定义P#U大小而不是计算P#U大小,使其成为静态的,并且程序使用数据段而不是堆空间。并非所有编译器都支持GCC扩展、C99和C++11支持的可变长度堆栈数组。通常不鼓励将MB的数据放在堆栈上。有关如何查找和调整进程堆栈大小的详细信息,请参阅。并非所有编译器都支持GCC扩展、C99和C++11支持的可变长度堆栈数组。通常不鼓励将MB的数据放在堆栈上。请参阅以获取有关如何查找和调整进程堆栈大小的更多信息。啊,我应该知道更多。这很可能是堆栈/堆的问题,但是我非常担心Cuda方面的问题,我把脑子都转到了简单的C部分。啊,我应该知道得更清楚。这很可能是堆栈/堆的问题,但我非常担心Cuda方面的问题,所以我对简单的C部分关闭了大脑。