如何解决将推力 device_vectors 传递给设备函数并修改它们
当我运行这段代码时,编译器说我正在从全局函数调用一个宿主函数。 我想为 A[i] 和 B[i] 分配比零更复杂的东西,但我只是想测试功能。 我需要修改两个向量中的值。 后来我想减少表A。
int main(void){
const int numElements = 100000;
thrust::device_vector<double> A(numElements);
thrust::device_vector<double> B(numElements);
int threadsPerBlock = 256;
int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;
vectorCount<<<blocksPerGrid,threadsPerBlock>>>(A,B,numElements);
}
__global__ void vectorCount(thrust::device_vector<double> A,thrust::device_vector<double> B,int numElements,int sequence_k){
int i = blockDim.x * blockIdx.x + threadIdx.x;
A[i] = 0;
B[i] = 0;
}
我已经尝试将其更改为
struct saxpy_functor
{
const int numElements;
saxpy_functor(int _a) : numElements(_a) {}
__host__ __device__
double operator()(double& x) const {
x = 0;
return 0;
}
};
//in main
thrust::transform(A.begin(),A.end(),B.begin(),saxpy_functor(numElements));
但是我找不到如何获得 i 就像前面的例子一样,因为我想根据 Vector 中的 位置 执行计算?
解决方法
尽管命名,thrust::device_vector
不能直接在 CUDA 设备代码中使用。 device_vector
是一个对象/容器,它只能在主机代码中使用。这就是为什么您会收到有关“调用主机函数...”的消息的原因
对于您在此处显示的示例,要直接访问数据,您将(在主机代码中)提取指向每个容器(A
和 B
)中底层数据的设备指针,并将这些指针传递给指向您的 CUDA 内核的指针。
像这样:
int main(void){
const int numElements = 100000;
thrust::device_vector<double> A(numElements);
thrust::device_vector<double> B(numElements);
double *d_A = thrust::raw_pointer_cast(A.data());
double *d_B = thrust::raw_pointer_cast(B.data());
int threadsPerBlock = 256;
int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;
vectorCount<<<blocksPerGrid,threadsPerBlock>>>(d_A,d_B,numElements);
}
__global__ void vectorCount(double *A,double *B,int numElements){
int i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < numElements){
A[i] = 0;
B[i] = 0;}
}
thrust::transform
/functor 方法的普通用法不允许随机访问基础数据。但是,如果您愿意,您可以使用“类似非推力”的方法,例如 this 来使用函子方法并允许随机访问。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。