非常感谢@横扫千军、@ice 两位版主对问题3的详细解释。
关于问题1,还是直接上两个测试程序吧。
代码一:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
__constant__ int de[9][2]={{0,0},{1,0},{0,1},{-1,0},{0,-1},{1,1},{-1,1},{-1,-1},{1,-1}};
__global__ void kernel()
{
printf("hello\n");
printf("%d\n",de[8][1]);
}
int main()
{
kernel<<<1,1>>>();
cudaDeviceReset();
return 0;
}
Nsight调试正常。kernel中打印无问题。
[attach]3275[/attach][indent]
代码二:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
__constant__ int de[9][2]={{0,0},{1,0},{0,1},{-1,0},{0,-1},{1,1},{-1,1},{-1,-1},{1,-1}};
__constant__ int dw[9];
__global__ void kernel(int *a)
{
printf("hello\n");
printf("%d\n",de[8][1]);
*a=de[8][0];
}
int main()
{
int w[9];
for (int i=0;i<9;i++)
{
w[i]=i;
}
cudaMemcpyToSymbol(dw, w, sizeof(int)*9);
int *a,b;
cudaMalloc((void **) &a, sizeof(int));
kernel<<<1,1>>>(a);
cudaMemcpy(&b,a,sizeof(int), cudaMemcpyDeviceToHost);
printf("%d\n",b);
cudaDeviceReset(); //保证kernel中的printf能正常打印
return 0;
}
此时,de的值显示错误,但dw的值显示正确,kernel中和main函数中的打印输出都正确。
[attach]3276[/attach]
[attach]3277[/attach]
[/indent]