我在同一个问题上看到了很多答案,但从未找到解决方案。只有一些建议在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;
}
我有两个未解决的问题:
请给我一些评论,有什么不对?
答案 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架构进行编译。