我一直在阅读与常量内存相关的许多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 的值时,只获得一个随机值.有人能指出我正确的方向来理解这一点吗?
这一行:
__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)