CUDA常量内存值不正确

BRa*_*t27 0 cuda nvcc

我一直在阅读与常量内存相关的许多SO问题,但我仍然不明白为什么我的程序无效.总的来说,它看起来如下

Common.cuh

__constant__ int numElements;

__global__
void kernelFunction();
Run Code Online (Sandbox Code Playgroud)

Common.cu

#include "Common.cuh"
#include <stdio.h>

__global__
kernelFunction()
{
   printf("NumElements = %d", numElements);
}
Run Code Online (Sandbox Code Playgroud)

Test.cu

#include "Common.cuh"

int main()
{
   int N = 100;
   cudaMemcpyToSymbol(numElements,&N,sizeof(int));
   kernelFunction<<<1,1>>>();
   cudaDeviceSynchronize();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

它编译时没有错误,但是当打印numElementsI 的值时,只获得一个随机值.有人能指出我正确的方向来理解这一点吗?

Rob*_*lla 5

这一行:

__constant__ int numElements;
Run Code Online (Sandbox Code Playgroud)

编译单元范围.如果你把它编译成一个模块,也到另一个模块,这两个模块都会有不同的实例是指numElements__constant__内存中.

解决方案是使用单独的编译和链接,将两个模块设备链接在一起,此时符号将由设备链接器在两个模块之间解析.

nvcc -arch=sm_20 -rdc=true -o test common.cu test.cu
Run Code Online (Sandbox Code Playgroud)

例:

$ cat common.cuh
#ifndef COMMON_CU
extern __constant__ int numElements;
#endif
__global__
void kernelFunction();
$ cat common.cu
#define COMMON_CU
#include "common.cuh"
#include <stdio.h>

__constant__ int numElements;
__global__
void kernelFunction()
{
   printf("NumElements = %d\n", numElements);
}
$ cat test.cu
#define TEST_CU
#include "common.cuh"

int main()
{
   int N = 100;
   cudaMemcpyToSymbol(numElements,&N,sizeof(int));
   kernelFunction<<<1,1>>>();
   cudaDeviceSynchronize();
   return 0;
}

$ nvcc -arch=sm_20 -rdc=true -o test common.cu test.cu
$ ./test
NumElements = 100
$
Run Code Online (Sandbox Code Playgroud)