Memory management CUDA中静态分配的全局内存结构

Memory management CUDA中静态分配的全局内存结构,memory-management,cuda,Memory Management,Cuda,CUDA中是否可以定义staticglobal memorystruct struct ABC { int nIntArray[3]; float rFLoatArray[3]; }; __device__ static ABC xABCStruct = {{1, 2, 3}, {1.f, 2.f, 3.f}}; 如何在CUDA内存中查看此结构实例 提前谢谢。是的,这是可能的。请看下面的代码,其中还显示了如何访问它的示例: #include<stdio.h> /

CUDA中是否可以定义
static
global memory
struct

struct ABC
{
    int nIntArray[3];
    float rFLoatArray[3];
};

__device__ static ABC xABCStruct = {{1, 2, 3}, {1.f, 2.f, 3.f}};
如何在CUDA内存中查看此结构实例


提前谢谢。

是的,这是可能的。请看下面的代码,其中还显示了如何访问它的示例:

#include<stdio.h>

/********************/
/* CUDA ERROR CHECK */
/********************/
#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
inline void gpuAssert(cudaError_t code, char *file, int line, bool abort=true)
{
    if (code != cudaSuccess) 
    {
        fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
        if (abort) exit(code);
    }
}

struct ABC { int nIntArray[3]; float rFLoatArray[3];};

__device__ static ABC xABCStruct = {{1, 2, 3}, {1.f, 2.f, 3.f}};

__device__ static float test_float = 3.f;

__global__ void kernel1() { printf("%f\n", test_float); }

__global__ void kernel2() { 
    printf("%i\n", xABCStruct.nIntArray[0]); 
    printf("%i\n", xABCStruct.nIntArray[1]); 
    printf("%i\n", xABCStruct.nIntArray[2]); 
    printf("%f\n", xABCStruct.rFLoatArray[0]); 
    printf("%f\n", xABCStruct.rFLoatArray[1]); 
    printf("%f\n", xABCStruct.rFLoatArray[2]); 
}

void main() {
    kernel1<<<1,1>>>();
    gpuErrchk(cudaPeekAtLastError());
    gpuErrchk(cudaDeviceSynchronize());

    kernel2<<<1,1>>>();
    gpuErrchk(cudaPeekAtLastError());
    gpuErrchk(cudaDeviceSynchronize());
}
#包括
/********************/
/*CUDA错误检查*/
/********************/
#定义gpuerchk(ans){gpuAssert((ans),_文件_,_行__)}
内联void gpuAssert(cudaError\u t代码,char*文件,int行,bool abort=true)
{
如果(代码!=cudaSuccess)
{
fprintf(标准,“GPUassert:%s%s%d\n”,cudaGetErrorString(代码)、文件、行);
如果(中止)退出(代码);
}
}
结构ABC{int-nIntArray[3];float-rFLoatArray[3];};
__设备uuu静态ABC xABCStruct={{1,2,3},{1.f,2.f,3.f};
__装置\uuuuuu静态浮动试验\u浮动=3.f;
__全局uuvoid kernel1(){printf(“%f\n”,test_float);}
__全局\uuuuvoid kernel2(){
printf(“%i\n”,xABCStruct.nIntArray[0]);
printf(“%i\n”,xABCStruct.nIntArray[1]);
printf(“%i\n”,xABCStruct.nIntArray[2]);
printf(“%f\n”,xABCStruct.rFLoatArray[0]);
printf(“%f\n”,xABCStruct.rFLoatArray[1]);
printf(“%f\n”,xABCStruct.rFLoatArray[2]);
}
void main(){
内核1();
gpuerchk(cudaPeekAtLastError());
gpuErrchk(cudaDeviceSynchronize());
内核2();
gpuerchk(cudaPeekAtLastError());
gpuErrchk(cudaDeviceSynchronize());
}

Thx插孔。我在主机函数中使用这个设备结构,如下所示。设备ABC xABCStruct2={{1,2,3},{1.f,2.f,3.f};void assign(){device ABC xABCStruct1;xABCStruct1=xABCStruct2;}在这种情况下,是否实现了赋值?我不能在调试时查看内存。总之,我可以在主机功能中使用设备变量进行操作吗?调试时观察?除了
cudaMemcpyToSymbol
cudaMemcpyToSymbol
之外,您不能在主机函数中直接使用
\uuuuuu设备
变量。如果您正在进行设备调试,您可以在调试时观察设备变量,使用其中一个设备调试器,例如Nsight VSE或cuda-gdb。谢谢Robert,我知道了