Cuda 如何从推力函子中取消对推力::设备\向量的引用?

Cuda 如何从推力函子中取消对推力::设备\向量的引用?,cuda,thrust,Cuda,Thrust,我正在做一个推力变换,需要从函子中访问一个推力::设备向量。我不是在设备向量上迭代。它允许我声明函子,传递设备向量引用,但不允许我用begin()或操作符[]取消引用它 1> C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include\stress/detail/function.h(187):警告:不允许从主机设备函数(“stress::detail::host\u device\u function::operator()”

我正在做一个推力变换,需要从函子中访问一个推力::设备向量。我不是在设备向量上迭代。它允许我声明函子,传递设备向量引用,但不允许我用begin()或操作符[]取消引用它

1> C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include\stress/detail/function.h(187):警告:不允许从主机设备函数(“stress::detail::host\u device\u function::operator()”调用主机函数(“stress::detail::host\u device\u function::operator()”)


我假设我能够传入基本指针并自己进行指针计算,但是有什么原因不支持它吗?

只是扩展@JaredHoberock已经指出的内容。我想他不会介意的

可通过推力使用的函子(在大多数情况下)必须符合任何CUDA设备代码的要求

推力::主机_向量
推力::设备_向量
都是主机代码容器,分别用于操作主机数据和设备数据。无法在设备代码中成功使用对主机代码容器的引用。这意味着,即使您成功地传递了对容器的引用,您也无法在设备代码中使用它(例如,无法执行
.push_back()

对于设备代码(如函子或内核)中的直接操作,您必须从推力中提取原始设备指针,并使用您自己的指针算法直接使用这些指针。高级功能(如
.push_back()
)将不可用

有多种方法可以提取与推力数据对应的原始设备指针,下面的示例代码演示了两种可能性:

$ cat t651.cu
#include <thrust/device_vector.h>
#include <thrust/sequence.h>

__global__ void printkernel(float *data){

  printf("data = %f\n", *data);
}

int main(){

  thrust::device_vector<float> mydata(5);
  thrust::sequence(mydata.begin(), mydata.end());
  printkernel<<<1,1>>>(mydata.data().get());
  printkernel<<<1,1>>>(thrust::raw_pointer_cast(&mydata[2]));
  cudaDeviceSynchronize();
  return 0;
}
$ nvcc -o t651 t651.cu
$ ./t651
data = 0.000000
data = 2.000000
$
$cat t651.cu
#包括
#包括
__全局无效打印内核(浮点*数据){
printf(“数据=%f\n”,*数据);
}
int main(){
推力:设备向量mydata(5);
序列(mydata.begin(),mydata.end());
printkernel(mydata.data().get());
printkernel(推力:raw_pointer_cast(&mydata[2]);
cudaDeviceSynchronize();
返回0;
}
$nvcc-o t651 t651.cu
美元/t651
数据=0.000000
数据=2.000000
$

只是对@JaredHoberock已经指出的内容进行了扩展。我想他不会介意的

可通过推力使用的函子(在大多数情况下)必须符合任何CUDA设备代码的要求

推力::主机_向量
推力::设备_向量
都是主机代码容器,分别用于操作主机数据和设备数据。无法在设备代码中成功使用对主机代码容器的引用。这意味着,即使您成功地传递了对容器的引用,您也无法在设备代码中使用它(例如,无法执行
.push_back()

对于设备代码(如函子或内核)中的直接操作,您必须从推力中提取原始设备指针,并使用您自己的指针算法直接使用这些指针。高级功能(如
.push_back()
)将不可用

有多种方法可以提取与推力数据对应的原始设备指针,下面的示例代码演示了两种可能性:

$ cat t651.cu
#include <thrust/device_vector.h>
#include <thrust/sequence.h>

__global__ void printkernel(float *data){

  printf("data = %f\n", *data);
}

int main(){

  thrust::device_vector<float> mydata(5);
  thrust::sequence(mydata.begin(), mydata.end());
  printkernel<<<1,1>>>(mydata.data().get());
  printkernel<<<1,1>>>(thrust::raw_pointer_cast(&mydata[2]));
  cudaDeviceSynchronize();
  return 0;
}
$ nvcc -o t651 t651.cu
$ ./t651
data = 0.000000
data = 2.000000
$
$cat t651.cu
#包括
#包括
__全局无效打印内核(浮点*数据){
printf(“数据=%f\n”,*数据);
}
int main(){
推力:设备向量mydata(5);
序列(mydata.begin(),mydata.end());
printkernel(mydata.data().get());
printkernel(推力:raw_pointer_cast(&mydata[2]);
cudaDeviceSynchronize();
返回0;
}
$nvcc-o t651 t651.cu
美元/t651
数据=0.000000
数据=2.000000
$

您需要传入
向量.data()的结果。
。CUDA
\uuuu设备\uuuuu
函数通常无法取消对主机指针的引用,因此尝试为您的函子提供对
您的\u向量的引用是没有意义的。您需要传入
您的\u向量.data()的结果。
。CUDA
\uuuuu设备\uuuuuu
函数通常无法取消对主机指针的引用,因此尝试为函子提供对向量
的引用是没有意义的。