带有Cudamaloc的神秘Seg断层
有人能帮我理解为什么下面的代码会导致分段错误吗? 同样,有人能帮助我理解为什么将标有“坏”的两行替换为标有“好”的两行不会导致分割错误吗 注意,seg故障似乎发生在Cudamaloc线路上;如果我对此进行评论,我也不会看到分割错误。这些分配似乎相互影响,但我不明白如何 本规范旨在建立三个结构: 主机上的h_P,将由CPU例程填充 设备上的d_P,将由GPU例程填充 主机上的h_P_copy,将通过将GPU数据结构复制回来填充 这样,我就可以验证正确的行为,并对其中一种行为与另一种行为进行基准测试。带有Cudamaloc的神秘Seg断层,c,cuda,segmentation-fault,C,Cuda,Segmentation Fault,有人能帮我理解为什么下面的代码会导致分段错误吗? 同样,有人能帮助我理解为什么将标有“坏”的两行替换为标有“好”的两行不会导致分割错误吗 注意,seg故障似乎发生在Cudamaloc线路上;如果我对此进行评论,我也不会看到分割错误。这些分配似乎相互影响,但我不明白如何 本规范旨在建立三个结构: 主机上的h_P,将由CPU例程填充 设备上的d_P,将由GPU例程填充 主机上的h_P_copy,将通过将GPU数据结构复制回来填充 这样,我就可以验证正确的行为,并对其中一种行为与另一种行为进行基准测试
事实上,所有这些都是四维数组 (如果有必要,所讨论的卡是GTX 580,在SUSE Linux下使用nvcc 4.2)
这可能是由于某种堆栈损坏造成的 注:
- “好”行从系统堆中分配,“坏”行 分配堆栈存储
- 通常,您可以从堆栈中分配的数量是相当多的 小于您可以从堆中分配的值
- “好”和“坏”声明保留的金额不相同
浮动的存储。“坏”分配了4倍的
储藏室float
- 最后,
,就像cudaMemset
,正在设置字节和 应为无符号字符数量,而不是浮点(0.0)数量memset
cudamaloc
行是第一个在“坏”情况下实际“使用”(尝试设置)任何分配的堆栈存储的行,因此发生seg故障的地方。如果您添加了这样的附加声明:
float *d_P;
float myval; //add
myval = 0.0f; //add2
cudaMalloc( (void**) &d_P, P_size);
我怀疑您可能会在“add2”行上看到seg故障,因为它将是第一个使用损坏的堆栈存储的设备。这可能是由于某种类型的堆栈损坏 注:
- “好”行从系统堆中分配,“坏”行 分配堆栈存储
- 通常,您可以从堆栈中分配的数量是相当多的 小于您可以从堆中分配的值
- “好”和“坏”声明保留的金额不相同
浮动的存储。“坏”分配了4倍的
储藏室float
- 最后,
,就像cudaMemset
,正在设置字节和 应为无符号字符数量,而不是浮点(0.0)数量memset
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部分关闭了大脑。