CUDA:指向指针内存访问的指针
我想不出是什么导致了这个问题。最后一行出现“访问冲突写入位置”错误。我没有正确分配内存吗CUDA:指向指针内存访问的指针,cuda,dynamic-memory-allocation,access-violation,pointer-to-pointer,Cuda,Dynamic Memory Allocation,Access Violation,Pointer To Pointer,我想不出是什么导致了这个问题。最后一行出现“访问冲突写入位置”错误。我没有正确分配内存吗 typedef struct { doubleXYZW cen_sum; //struct with 4 doubles double STS[6]; XYZW *Points;// //struct with 4 floats }BUNDLE; BUNDLE *cpu_data = NULL; size_t bundle_size = NUM_POINTS * sizeo
typedef struct {
doubleXYZW cen_sum; //struct with 4 doubles
double STS[6];
XYZW *Points;// //struct with 4 floats
}BUNDLE;
BUNDLE *cpu_data = NULL;
size_t bundle_size = NUM_POINTS * sizeof(XYZW) + sizeof(doubleXYZW) + 6*sizeof(double);
HANDLE_ERROR(cudaMallocHost((BUNDLE**)&cpu_data, bundle_size));
//error in the next line
cpu_data->Points[0].x = 0; //x is the first element in the XYZW struct
您有两个必须完成的分配,并且您只执行其中一个 您正在为
cpu\u数据
指针分配一些存储空间,但尚未为点
指针分配任何存储空间。因此,在取消参照点时:
cpu_data->Points[0].x = 0;
^ ^
| this dereferences the Points pointer (NOT allocated!)
|
this dereferences the cpu_data pointer (allocated)
您正在取消引用尚未分配的指针,因此该指针无效。试图以这种方式访问某些内容将生成无效访问
您(至少)有两个选项可以修复它:
cpu\u点
分配空间后,您可以对cpu\u点->点
点
数组的大小(看起来您知道-NUM_Points
),那么您可以静态地为其分配:
typedef struct {
doubleXYZW cen_sum; //struct with 4 doubles
double STS[6];
XYZW Points[NUM_POINTS];// //struct with 4 floats
}BUNDLE;
bundle\u size
计算是以建议使用第二种方法的方式编制的。如果使用第一种方法,则您的束大小计算不正确。在任何情况下,无论使用哪种方法,只需将bundle\u size
计算为sizeof(bundle)
要明确的是,这里没有CUDA特定的内容(例如,如果您使用malloc
而不是cudamallocost
,则会出现错误)。问题的根源在于对C语言的基本理解,而不是CUDA。您必须完成两个分配,并且您只执行其中一个
您正在为cpu\u数据
指针分配一些存储空间,但尚未为点
指针分配任何存储空间。因此,在取消参照点时:
cpu_data->Points[0].x = 0;
^ ^
| this dereferences the Points pointer (NOT allocated!)
|
this dereferences the cpu_data pointer (allocated)
您正在取消引用尚未分配的指针,因此该指针无效。试图以这种方式访问某些内容将生成无效访问
您(至少)有两个选项可以修复它:
为cpu\u点
分配空间后,您可以对cpu\u点->点
如果您知道点
数组的大小(看起来您知道-NUM_Points
),那么您可以静态地为其分配:
typedef struct {
doubleXYZW cen_sum; //struct with 4 doubles
double STS[6];
XYZW Points[NUM_POINTS];// //struct with 4 floats
}BUNDLE;
请注意,您的bundle\u size
计算是以建议使用第二种方法的方式编制的。如果使用第一种方法,则您的束大小计算不正确。在任何情况下,无论使用哪种方法,只需将bundle\u size
计算为sizeof(bundle)
要明确的是,这里没有CUDA特定的内容(例如,如果您使用malloc
而不是cudamallocost
,则会出现错误)。问题的根源在于对C语言的基本理解,而不是CUDA。感谢您提供的详细课程。这是有道理的。一、 显然,我们还没有在C中实现这种复杂程度,所以在CUDA中遇到了它。正如您所建议的,第二个选项很适合,可能也节省了一些分配时间。感谢您提供详细的课程。这是有道理的。一、 显然,我们还没有在C中实现这种复杂程度,所以在CUDA中遇到了它。正如您所建议的,第二个选项非常适合,可能也会节省一些分配时间。