【问题标题】:Memory allocated using cudaMalloc() is accessable by host or not?主机是否可以访问使用 cudaMalloc() 分配的内存?
【发布时间】:2013-10-04 23:48:50
【问题描述】:

在《CUDA By Example》一书第 26 页上写道:

您可以将使用 cudaMalloc() 分配的指针传递给那些 在主机上执行。

您不能使用 cudaMalloc() 分配的指针来读取或写入 来自在主机上执行的代码的内存。

为了演示第一个概念,我在这里编写代码:

main()
{
int * ad, N;

cudaMalloc((void **)&ad, Sizeof(int) *N);

GPUFunction<<<...>>>(ad);
Hostfunction(ad);

}


Hostfunction(int * AD)

{

int c ;

c=AD[N-1];

printf("%d", c);

}


  __global__ void GPUFunction(int *AD)

{

AD[threadIdx.x]= threadidx.x;
}

这就是上面第 1 点所解释的吗?如果是这样,则与上面的第 2 点相矛盾,如您所见,主机功能正在读取记忆广告。那么我的理解哪里出了问题?

【问题讨论】:

    标签: cuda nvidia


    【解决方案1】:

    这两点并不矛盾。

    第一点只是意味着您可以将AD指针传递给HostFunction,但这并不意味着您可以直接访问设备内存

    c=AD[N-1];
    

    正如第二点告诉你的那样。

    您可以做的是使用指针执行其他cudaMemcpy 操作,或将该指针传递给__global__ 函数。

    所以,HostFunction 可能是

    __global__ void GPUFunction(int *AD)
    {
        AD[threadIdx.x]= threadidx.x;
    }
    
    Hostfunction(int * AD)
    {
        GPUFunction<<<...,...>>>(AD);
    }
    

    【讨论】:

      【解决方案2】:

      无法看到主机函数正在读取内存ad。您当然已经编写了一些尝试这样做的代码,但它是无效代码并且会出现段错误。

      由于您在此处提供的代码不完整或无法编译,因此无法演示任何内容。

      这是一个与您输入的内容非常接近的可编译示例,它表明您的Hostfunction 在传递ad 时将无法正常工作:

      $ cat t251.cu
      #include <stdio.h>
      
        __global__ void GPUFunction(int *AD)
      
      {
      
      AD[threadIdx.x]= threadIdx.x;
      }
      
      void Hostfunction(int * AD, int N)
      
      {
      
      int c ;
      
      printf("preparing to read ad in host code\n");
      c=AD[N-1];
      
      printf("%d", c);
      
      }
      
      int main()
      {
      int * ad, N;
      N = 1;
      cudaMalloc((void **)&ad, sizeof(int) *N);
      
      GPUFunction<<<1,1>>>(ad);
      Hostfunction(ad, N);
      
      }
      
      
      $ nvcc -arch=sm_20 -o t251 t251.cu
      $ ./t251
      preparing to read ad in host code
      Segmentation fault (core dumped)
      $
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-23
        • 1970-01-01
        • 2021-11-02
        相关资源
        最近更新 更多