Memory 复制CudamAllocPicch分配的内存

Memory 复制CudamAllocPicch分配的内存,memory,cuda,Memory,Cuda,cudaMemcpy能否用于使用CudamAllocPicch分配的内存?如果没有,你能告诉我应该使用哪个函数吗。cudaMallocPitch返回线性内存,因此我认为应该使用cudaMemcpy。您当然可以使用cudaMemcpy复制倾斜设备内存,但使用cudaMemcpy2D更为常见。从主机到设备的倾斜拷贝示例如下所示: #include "cuda.h" #include <assert.h> typedef float real; int main(void) {

cudaMemcpy能否用于使用CudamAllocPicch分配的内存?如果没有,你能告诉我应该使用哪个函数吗。cudaMallocPitch返回线性内存,因此我认为应该使用cudaMemcpy。

您当然可以使用
cudaMemcpy
复制倾斜设备内存,但使用
cudaMemcpy2D
更为常见。从主机到设备的倾斜拷贝示例如下所示:

#include "cuda.h"
#include <assert.h>

typedef float real;

int main(void)
{

    cudaFree(0); // Establish context

    // Host array dimensions
    const size_t dx = 300, dy = 300; 

    // For the CUDA API width and pitch are specified in bytes
    size_t width = dx * sizeof(real), height = dy;

    // Host array allocation
    real * host = new real[dx * dy];
    size_t pitch1 = dx * sizeof(real);

    // Device array allocation
    // pitch is determined by the API call
    real * device;
    size_t pitch2;
    assert( cudaMallocPitch((real **)&device, &pitch2, width, height) == cudaSuccess );

    // Sample memory copy - note source and destination pitches can be different
    assert( cudaMemcpy2D(device, pitch2, host, pitch1, width, height, cudaMemcpyHostToDevice) == cudaSuccess );

    // Destroy context
    assert( cudaDeviceReset() == cudaSuccess );

    return 0;
}
#包括“cuda.h”
#包括
typedef浮点实数;
内部主(空)
{
cudaFree(0);//建立上下文
//主机阵列维度
常数大小dx=300,dy=300;
//对于CUDA API,宽度和间距以字节为单位指定
尺寸\u t宽度=dx*sizeof(实数),高度=dy;
//主机阵列分配
real*host=new real[dx*dy];
尺寸1=dx*sizeof(实值);
//设备阵列分配
//音高由API调用决定
真实设备;
大小2;
断言(cudamallocitch((real**)和设备,以及pitch2、宽度、高度)=cudaSuccess);
//示例内存副本-注意源和目标音高可能不同
断言(cudaMemcpy2D(设备、pitch2、主机、pitch1、宽度、高度、cudaMemcpyHostToDevice)=cudaSuccess);
//破坏上下文
断言(cudaDeviceReset()==cudaSuccess);
返回0;
}

(注意:未测试,cavaet emptor等等…)

可以,但更常见的做法是使用cudaMemcpy2D复制倾斜分配。cudaMemcpy2D使用dpitch和spitch的语法,但我不确定从设备复制到主机时这些值是什么。你能说出或举个例子吗。谢谢,谢谢。它编译得很好。我添加了delete和cudaFree等,并进行了检查,它完成了任务。