Cuda 无效的设备指针错误

Cuda 无效的设备指针错误,cuda,Cuda,我有以下示例代码 struct Data { float* arr_f_ptr; int* arr_i_ptr; short* arr_s_ptr; size_t arr_f_size; size_t arr_f_size_bytes; size_t arr_i_size; size_t arr_i_size_bytes; size_t arr_s_size; size_t arr_s_size_bytes); }; void processing (Data &d) { //

我有以下示例代码

struct Data
{
float* arr_f_ptr;
int* arr_i_ptr;
short* arr_s_ptr;

size_t arr_f_size;
size_t arr_f_size_bytes;
size_t arr_i_size;
size_t arr_i_size_bytes;
size_t arr_s_size;
size_t arr_s_size_bytes);
};


void processing (Data &d)
{

// call some kernels on d.arr_f_ptr, d.arr_i_ptr, d.arr_s_ptr

// using cufftExecR2C on d.arr_f_ptr, d.arr_i_ptr, d.arr_s_ptr

}

Data d;

// filling the sizes of the arrays
d.arr_f_size = ....;
d.arr_f_size_bytes = d.arr_f_size * sizeof(float);
d.arr_i_size = ....;
d.arr_i_size_bytes = d.arr_i_size * sizeof(int);
d.arr_s_size = ....;
d.arr_s_size_bytes = d.arr_s_size * sizeof(short);

size_t total_size_bytes = arr_f_size_bytes + arr_i_size_bytes + arr_s_size_bytes;

// allocate device memory
char *device_pointer;
gpuErrchk(cudaMalloc((void**)&device_pointer, total_size_bytes));

// map memory to pointers
size_t index = 0;
d.arr_f_ptr = (float*)&device_pointer[index];   index += d.arr_f_size_bytes;
d.arr_i_ptr = (int*)&device_pointer[index];     index += d.arr_i_size_bytes;
d.arr_s_ptr = (short*)&device_pointer[index];

// copy data from host to arrays in data
....
// call processing function
processing(d);
// deallocate
....
我尝试在设备内存中分配线性阵列,然后将三个不同的阵列(不同类型)映射到此线性阵列上的连续位置。
问题是,当在处理函数中调用内核时,会出现未指定的启动失败错误。另外,当我在这个数据上使用cufftExecR2C时,我会得到无效的设备内存指针错误

在处理函数中,我从主机复制了输入数据(在d中),并进行了检查。它似乎完全正确,并且与主机中的数据相匹配。因此,我知道复制到主机是正确的,并且设备内存包含正确的数据

那么,我在这里犯这种错误的原因是什么??
非常感谢您的帮助。

谢谢你忘了对齐。它可以是字节、字、双字等等

因此,数据的大小可以随之改变

sizeof(数据)可能不是sizeof(每个成员)的总和

通过代码检查 (arr_f_size_字节+arr_i_size_字节+arr_s_size_字节==sizeof(数据))
如果为false,则表示对齐错误。

您忘记了对齐。它可以是字节、字、双字等等

因此,数据的大小可以随之改变

sizeof(数据)可能不是sizeof(每个成员)的总和

通过代码检查 (arr_f_size_字节+arr_i_size_字节+arr_s_size_字节==sizeof(数据))
如果为false,则表示对齐错误。

这是对齐问题,您可以使用3
cudamaloc
分别为每个数组分配空间

驻留在全局内存中或由一个变量返回的变量的任何地址 来自驱动程序或运行时API的内存分配例程的 始终与至少256个字节对齐


这是对齐问题,您可以使用3
cudamaloc
分别为每个阵列分配空间

驻留在全局内存中或由一个变量返回的变量的任何地址 来自驱动程序或运行时API的内存分配例程的 始终与至少256个字节对齐


它与
sizeof(Data)
无关。它与
sizeof(Data)
无关。非常感谢您的回答,很抱歉我的回复太晚。我试图确保内存已对齐256字节,但仍然提供无效的设备内存。您是否有分配大内存并将其映射到多个数组的代码链接?如果内存大,为什么不能使用3个单独的malloc?您可能希望尝试这种方式,至少可以确保这不是一个问题,而不是错位。我很少看到有人以你的方式使用它。谢谢Eric的及时回复。实际上,上面的代码只是示例代码。我需要为数组创建十。就性能而言,我发现分配一个大阵列并管理此内存,并将其映射到多个阵列比分配多次更快。这就是我只需要使用一个Cudamaloc进行分配的原因。也许你计算错了对齐方式。也许在这个时候,正确性第一。也许你仍然会在使用单独的malloc时出错。我有一个使用单独的malloc的版本,它工作正常。当我使用一个大的malloc时出现的错误。对于对齐,对于每个数组,我使用的内存大小是256的倍数,我想这样所有数组都应该对齐,不是吗?非常感谢您的回答,很抱歉我的回复太晚。我试图确保内存已对齐256字节,但仍然提供无效的设备内存。您是否有分配大内存并将其映射到多个数组的代码链接?如果内存大,为什么不能使用3个单独的malloc?您可能希望尝试这种方式,至少可以确保这不是一个问题,而不是错位。我很少看到有人以你的方式使用它。谢谢Eric的及时回复。实际上,上面的代码只是示例代码。我需要为数组创建十。就性能而言,我发现分配一个大阵列并管理此内存,并将其映射到多个阵列比分配多次更快。这就是我只需要使用一个Cudamaloc进行分配的原因。也许你计算错了对齐方式。也许在这个时候,正确性第一。也许你仍然会在使用单独的malloc时出错。我有一个使用单独的malloc的版本,它工作正常。当我使用一个大的malloc时出现的错误。对于对齐,对于每个数组,我使用的内存大小是256的倍数,我想这样所有数组都应该对齐,不是吗?