CUDA:float*类型的参数与float(*)类型的参数不兼容[32768]

CUDA:float*类型的参数与float(*)类型的参数不兼容[32768],cuda,Cuda,在将指针传递到数组时,我得到以下错误: 类型为“float”的参数与类型为“float()[32768]的参数不兼容 我的代码的相关片段如下: #define N 32768 __global__ void op(float k_a[][N]) { //some operation } float *ptr_a=(float*)malloc(N*N*sizeof(float)); float *d_ptr_a;cudaMalloc((void**)&d_ptr_a,N*N*siz

在将指针传递到数组时,我得到以下错误: 类型为“float”的参数与类型为“float()[32768]的参数不兼容

我的代码的相关片段如下:

#define N  32768

__global__ void op(float k_a[][N])
{
 //some operation
}
float *ptr_a=(float*)malloc(N*N*sizeof(float));

float *d_ptr_a;cudaMalloc((void**)&d_ptr_a,N*N*sizeof(float));

cudaMemcpy(d_ptr_a,ptr_a,N*N*sizeof(float),cudaMemcpyHostToDevice);

op<<<nblocks,nthreadsperblock>>>(d_ptr_a)
#定义N 32768
__全局无效操作(浮动k_a[][N])
{
//一些手术
}
float*ptr_a=(float*)malloc(N*N*sizeof(float));
浮动*d_ptr_a;cudaMalloc((void**)和d_ptr_a,N*N*sizeof(浮动));
cudaMemcpy(d_ptr_a,ptr_a,N*N*sizeof(float),cudaMemcpyHostToDevice);
op(d_ptr_a)

有人能告诉我出了什么问题吗?我是CUDA的初学者。

我们这里的是指针和数组的错误使用。根据例程
op
的定义,它需要一个指针指向长度为N的数组,类型为
float
。另一方面,当它被称为指针指向类型时
float
作为参数提供,从而导致类型不兼容的错误消息

如果
op
例程要处理一个包含
float
值的2D数组,最好让它的参数是指向
float
的指针。在这种情况下,原始2D数组的所有
M
“行”(使用索引
y
访问)都会一行接一行地位于内存中,如下所示:

[row0][row1][row2]...[rowM-1]
每个这样的行都包含
N
“列”,可通过索引
x
访问。要获取某对
(x,y)
的值,我们必须生成一个全局索引来访问1D数组:

index = y * N + x;

就这么简单。

我们这里使用的是指针和数组的错误用法。根据例程
op
的定义,它需要一个指针指向长度为N的数组,类型为
float
。另一方面,当它被称为指针指向类型
float
时,作为参数提供t、 从而导致类型不兼容的错误消息

如果
op
例程要处理一个包含
float
值的2D数组,最好让它的参数是指向
float
的指针。在这种情况下,原始2D数组的所有
M
“行”(使用索引
y
访问)都会一行接一行地位于内存中,如下所示:

[row0][row1][row2]...[rowM-1]
每个这样的行都包含
N
“列”,可通过索引
x
访问。要获取某对
(x,y)
的值,我们必须生成一个全局索引来访问1D数组:

index = y * N + x;

就这么简单。

我应该补充一点,这与CUDA无关。如果您只定义一个常规的
void op(float k_a[][N])
并将
float*
参数传递给它,您会得到相同(或类似)的错误消息。Clang给我
错误:无法将参数“1”转换为“float*”[32768]”(float(*)[32768])”
如果我使用float*,那么我对如何访问数组的二维空间有点困惑。读一读@CygnusX1:如果你不使用C标记,每个人的生活都会容易得多(这就是为什么我删除了它)。否则,C标记中的某个巨魔将从他的桥下出现,并在关于“的评论中引发一场火焰战争”CUDA不是C”,在我完全理解其原理之前,他已经做过很多次了,但这是我们生活的现实。自我审查,或者每次提到C和CUDA时都会享受一场火焰之战,我应该补充一点,这与CUDA无关。如果你只是定义一个常规的
void op(float k_a[][N])
并将一个
float*
参数传递给它,您会得到相同(或类似)的错误消息。Clang给我
错误:无法将参数“1”的“float*”转换为“float(*)[32768]”而将参数“1”转换为“void op(float(*)[32768]”“
如果我使用float*,那么我对如何访问数组的二维空间有点困惑。读一读@CygnusX1:如果你不使用C标记,每个人的生活都会轻松得多(这就是为什么我删除了它)。否则,C标记中的某个巨魔将从他的桥下出现,并在关于“CUDA不是C”的评论中引发一场火焰战,正如他以前多次所做的那样,我完全理解其原理,但这是我们生活的现实。自我审查,或享受火焰之战每次C和CUDA同时被提到“它需要长度为N的数组”不完全正确。它需要一个指向长度为N的数组的指针,正如您所提到的,该数组后面可能跟有其他相同类型的数组,也就是说,它应该指向“长度为N的数组数组”的第一个元素。这揭示了一个概念性问题,即所讨论的函数(
op()
此处)不知道第二个维度!“它需要长度为N的数组”不太正确。它需要一个指向长度为N的数组的指针,正如您所提到的,该数组后面可能跟有其他相同类型的数组,也就是说,它应该指向“长度为N的数组数组”的第一个元素。这揭示了一个概念问题,即所讨论的函数(
op()
)不知道第二维度!