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

Pass thrust device_vectors to device function and modify them

当我在 运行 这段代码时,编译器说我正在从全局函数调用宿主函数。 我想向 A[i] 和 B[i] 分配比零更复杂的东西,但我只是想测试功能。 我需要修改两个向量中的值。 稍后我想减少 table 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 就像前面的例子一样,因为我想根据 possition 执行计算在向量中?

尽管如此命名,thrust::device_vector 不能直接用于 CUDA 设备代码。 device_vector 是一个 object/container,它只能在主机代码中使用。这就是为什么您收到有关“调用主机函数...”的消息的原因。

对于您在此处显示的示例,要直接访问数据,您将(在主机代码中)提取指向每个容器(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 这样的“非推力类”方法来使用仿函数方法并允许随机访问。