1

当我运行这段代码时,编译器说我正在从设备调用一个主机函数。我不太明白怎么做。

   __global__ void kernel(thrust::device_vector<float*> d_V) {

       float *var = d_V[0];
   }

   int main() {

      thrust::host_vector<float*> V;
      thrust::host_vector<float*> d_V;

      float f[10];
      for (int i = 0; i < 10; i++) {
          f[i] = i;
      }
      V.push_back(f);
      d_V = V;
      kernel<<<1, 1>>>(d_V);

      return 0;     
   }
4

1 回答 1

4

推力功能/方法设计用于主机(CPU)端。它们不能在 CUDA 内核的设备(GPU)端调用。

您在代码中演示的实际上是将一些数据传递给内核。数据可以由内核参数列表中的推力容器以外的原始指针引用。

__global__ void kernel(float* p)
{
   float *var = p;
}

int main()
{
    thrust::device_vector<float> d_v(
        thrust::make_counting_iterator((float)0),
        thrust::make_counting_iterator((float)0)+10);
    kernel<<<1,1>>>(thrust::raw_pointer_cast(&d_v[0])); 
}
于 2013-07-23T15:26:07.443 回答