【发布时间】: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