【问题标题】:CUDA: cudaMemcpy returns cudaErrorInvalidValue for __device__ arrayCUDA:cudaMemcpy 为 __device__ 数组返回 cudaErrorInvalidValue
【发布时间】:2011-03-06 00:36:36
【问题描述】:

当我在设备上定义一个数组(在本例中使用“Hello”字符串初始化)并尝试将其复制到主机时,我收到错误代码cudaErrorInvalidValue。但是,可以从内核内部访问d_helloStr[]。参考 CUDA 编程指南第 B.2.1 章,这样的变量也应该可以通过运行时库访问。为什么此示例代码不起作用?

#include <cuda.h>
#include <stdio.h>


__device__ char d_helloStr[] = {'H','e','l','l','o','\0'};

// Host function
int
main(int argc, char** argv)
{
  cudaError_t err;
  char h_helloStr [sizeof(d_helloStr)];

  // copy device string to host string: 
  err = cudaMemcpy(h_helloStr, d_helloStr, sizeof(d_helloStr), cudaMemcpyDeviceToHost);
  printf("err = %d\n", err);

  // result string:   
  printf("%s\n", h_helloStr);

  return 0;
}

【问题讨论】:

  • 如果你使用 cudaMalloc 来获取设备中字符的内存呢?
  • 这将是这个 hello-world 演示中使用的机制(实际上有效):forums.nvidia.com/index.php?showtopic=90044 我还使用 cudaMalloc 在设备上分配了一些内存,将字符串从 d_helloStr 变量复制到此内存并使用 cudaMemcpy 将此内存中的字符串复制回主机。这也有效。但是,我想知道为什么我不能直接通过 cudaMemcpy 访问 d_helloStr。

标签: c cuda memcpy


【解决方案1】:

您应该使用 cudaMemcpyFromSymbol。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    相关资源
    最近更新 更多