【问题标题】:Pass thrust device_vectors to device function and modify them将推力 device_vectors 传递给设备函数并修改它们
【发布时间】:2021-07-27 04:54:55
【问题描述】:

当我运行这段代码时,编译器说我正在从全局函数调用主机函数。 我想为 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 中的 位置 执行计算?

【问题讨论】:

    标签: c++ cuda thrust


    【解决方案1】:

    尽管有它的命名,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 的“非推力”方法来使用函子方法并允许随机访问。

    【讨论】:

      猜你喜欢
      • 2014-03-01
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 2011-09-19
      • 2020-06-01
      相关资源
      最近更新 更多