首页 文章

CUDA推力:从设备复制到设备

提问于
浏览
4

我使用标准CUDA malloc在CUDA中分配了一个内存数组,并将其传递给函数,如下所示:

void MyClass::run(uchar4 * input_data)

我还有一个类成员,它是一个推力device_ptr,声明为:

thrust::device_ptr<uchar4> data = thrust::device_malloc<uchar4(num_pts);

这里num_pts是数组中的值的数量,input_data指针保证为num_pts long .

现在,我想将输入数组复制到thrust_device_ptr中 . 我查看了推文文档,其中很多内容都是关于从设备复制到主机内存,反之亦然 . 我想知道什么是最佳的性能最佳方式来设备到设备复制推力或我应该只使用cudaMemcpy?

1 回答

  • 2

    这样做的规范方法就是使用 thrust::copy . thrust::device_ptr 具有标准指针语义,API将无缝地了解源指针和目标指针是否在主机或设备上,即:

    #include <thrust/device_malloc.h>
    #include <thrust/device_ptr.h>
    #include <thrust/copy.h>
    #include <iostream>
    
    int main()
    {
        // Initial host data
        int ivals[4] = { 1, 3, 6, 10 };
    
        // Allocate and copy to first device allocation
        thrust::device_ptr<int> dp1 = thrust::device_malloc<int>(4);
        thrust::copy(&ivals[0], &ivals[0]+4, dp1);
    
        // Allocate and copy to second device allocation
        thrust::device_ptr<int> dp2 = thrust::device_malloc<int>(4);
        thrust::copy(dp1, dp1+4, dp2);
    
        // Copy back to host
        int ovals[4] = {-1, -1, -1, -1};
        thrust::copy(dp2, dp2+4, &ovals[0]);
    
        for(int i=0; i<4; i++)
            std::cout << ovals[i] << std::endl;
    
    
        return 0;
    }
    

    这样做:

    talonmies@box:~$ nvcc -arch=sm_30 thrust_dtod.cu 
    talonmies@box:~$ ./a.out 
    1
    3
    6
    10
    

相关问题