微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将推力 device_vectors 传递给设备函数并修改它们

如何解决将推力 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 是一个对象/容器,它只能在主机代码中使用。这就是为什么您会收到有关“调用主机函数...”的消息的原因

对于您在此处显示的示例,要直接访问数据,您将(在主机代码中)提取指向每个容器(AB)中底层数据的设备指针,并将这些指针传递给指向您的 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 举报,一经查实,本站将立刻删除。