【问题标题】:CUDA: argument of type float * is incompatible with parameter of type float (*)[32768]CUDA:float * 类型的参数与 float (*) 类型的参数不兼容 [32768]
【发布时间】:2017-02-19 18:40:59
【问题描述】:

在传递指向数组的指针时,出现以下错误: “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)

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

【问题讨论】:

  • 我应该补充一下,这与CUDA无关。如果您只定义一个常规的void op(float k_a[][N]) 并将float* 参数传递给它,您会收到相同(或相似)的错误消息。 Clang 给我error: cannot convert ‘float*’ to ‘float (*)[32768]’ for argument ‘1’ to ‘void op(float (*)[32768])’
  • 如果我使用float*,那么我对如何访问二维数组有点困惑。
  • @CygnusX1:如果您不使用 C 标记它(这就是我删除它的原因),每个人的生活都会轻松得多。否则某个C标签的巨魔会从他的桥下出现,并在cmets中掀起一场关于“CUDA不是C”的火焰战,就像他之前做过很多次一样
  • 我完全理解其中的道理,但这就是我们生活的现实。自我审查,或者每次提到C和CUDA时都享受一场火焰战争

标签: cuda


【解决方案1】:

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

如果op 例程要处理float 值的二维数组,最好将其参数设为指向float 的指针。在这种情况下,原始二维数组的所有M“行”,通过索引y访问,一个接一个地位于内存中,在一行中,如下所示:

[row0][row1][row2]...[rowM-1]

每个这样的行都包含N“列”,由索引x访问。要获得某个对 (x, y) 的值,我们必须生成一个将访问一维数组的全局索引:

index = y * N + x;

就这么简单。

【讨论】:

  • 它需要 长度为 N 的数组数组”不太正确。它需要一个指向长度为 N 的数组的 pointer,正如您所提到的,它可能后面跟着其他相同类型的数组,即它应该 point i> 到“长度为 N 的数组数组”的第一个元素。这揭示了一个概念问题,即所讨论的函数(此处为op()知道第二维
猜你喜欢
  • 2023-02-07
  • 2014-02-08
  • 2018-09-07
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 2012-11-06
相关资源
最近更新 更多