谁能帮我理解为什么下面的代码会导致分段错误?同样,任何人都可以帮助我理解为什么将标记为“坏”的两行换成标记为“好”的两行不会导致分段错误?
请注意,段错误似乎发生在 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);
}