cudaMemcpyToSymbol:__ conststant__变量中的值为零

时间:2014-07-16 00:53:21

标签: c++ c cuda

我在同一个问题上看到了很多答案,但从未找到解决方案。只有一些建议在cudaMemcpyToSymbol(...)等中使用char simbol。

我使用来自cudaMemcpyToSymbol using or not using string

的100%工作代码创建了新的CUDA项目(VS2012 + CUDA 6.0)
//file: main.cu
#include <stdio.h>
#include <stdlib.h>
#include <cuda.h>

__constant__ float constData[256];
__device__ float devData;
__device__ float* devPointer;

int main(int argc, char **argv)
{
  cudaFree(0);

  float data[256];

  /**>>>>>>>**/   data[0] = 1.0f; 

  cudaError_t err = cudaMemcpyToSymbol(constData, data, sizeof(data));
  printf("Err id: %d, str: %s\n", err, cudaGetErrorString(err));

  /**>>>>>>>**/   printf("constData[0]: %f ", constData[0]);

  float value = 3.14f;
  err = cudaMemcpyToSymbol(devData, &value, sizeof(float));
  printf("Err id: %d, str: %s\n", err, cudaGetErrorString(err));

  /**>>>>>>>**/   printf("devData: %f ", devData);

  float* ptr;
  cudaMalloc(&ptr, 256 * sizeof(float));
  err = cudaMemcpyToSymbol(devPointer, &ptr, sizeof(ptr));
  printf("Err id: %d, str: %s\n", err, cudaGetErrorString(err));
  cudaFree(ptr);

  return EXIT_SUCCESS;
}

我有两个未解决的问题:

  1. 错误&#34;设备符号无效&#34;在运行时,如果没有 &#34; compute_10,sm_10&#34;在项目属性中。
  2. Debugger和printf显示,constData [0] = 0.000000和devData = 0.000000
  3. 请给我一些评论,有什么不对?

1 个答案:

答案 0 :(得分:2)

编译此代码时,我收到2条警告:

t481.cu(20): warning: a __constant__ variable "constData" cannot be directly read in a host function
t481.cu(26): warning: a __device__ variable "devData" cannot be directly read in a host function

您不应忽略这些警告。尽管它们是“警告”,但它们代表了代码中的重大问题。第20行看起来像这样:

/**>>>>>>>**/   printf("constData[0]: %f ", constData[0]);

constData是设备上的变量。您无法在普通主机代码中访问此类变量(例如将其传递给printf)。这是CUDA中的一般规则:设备变量不能用于普通的主机代码,主机变量不能用于普通的设备代码。

第26行类似。无论如何,这些线对我们来说并没有真正做多少,所以让我们摆脱它们。如果要打印第20行和第26行的值,则需要在打印之前将这些值复制回主机(例如使用cudaMemcpyFromSymbol())。

除此之外,如果我编译正确的GPU架构,你的程序将为我运行而没有任何错误。您看到的设备符号无效错误是由于您的设备是cc1.0设备,需要compute_10, sm_10代码生成。如果为另一个(更高)体系结构进行编译,则不会加载内核,因为设备代码与您的体系结构不匹配。由于没有匹配的设备代码,静态设备变量(包括__constant__变量)不会被实例化。因为它们没有实例化,所以符号无效,这是程序中第一个出现错误的指示。

因此,您需要针对与您的设备匹配的GPU架构进行编译。