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中遇到了它。正如您所建议的,第二个选项非常适合,可能也会节省一些分配时间。