任何人都可以帮助我理解为什么以下代码导致分段错误? 同样,任何人都可以帮助我理解为什么换掉标记为“好”的两行标记为“坏”的两行并不会导致分段错误?
请注意,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);
}
答案 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)字节。