C++ 从主CUDA声明设备变量

C++ 从主CUDA声明设备变量,c++,cuda,C++,Cuda,我是cuda的新手,所以我希望我的问题没有完全偏离主题。 我想在全局设备内存上创建一个数组,但我只知道它将在我的main函数中间(但在我访问这个设备之前)有多大。 因为我不知道在我的代码之前不能声明的大小: 设备myArr[] 所以我想在main中创建一个指针d_myArr,然后使用cudaMalloc(d_myArr,arrSize)在设备上分配内存,但我从来没有在设备上声明过变量 我不认为有理由将d_Arr发送到我的内核,因为它将只存在于该内核中(我想?),我只是希望该变量首先作为全局变量存

我是cuda的新手,所以我希望我的问题没有完全偏离主题。 我想在全局设备内存上创建一个数组,但我只知道它将在我的main函数中间(但在我访问这个设备之前)有多大。 因为我不知道在我的代码之前不能声明的大小: 设备myArr[]

所以我想在main中创建一个指针d_myArr,然后使用cudaMalloc(d_myArr,arrSize)在设备上分配内存,但我从来没有在设备上声明过变量

我不认为有理由将d_Arr发送到我的内核,因为它将只存在于该内核中(我想?),我只是希望该变量首先作为全局变量存在于我的设备上,并可由不同的内核访问

我可以在main中声明一个设备变量吗?例如:

int main(){
   .
   .
   __device__ myArr[size];
   .
   .
}
如果是这样的话,是因为某种原因而打折的(因为我找不到任何人这样做)。如果这是不允许的,我能做些什么?我看到有人提到cudaMemcpyToSymbol,但我不知道它是否与我想要的完全相关,如果是,我很高兴有人能确切地解释如何使用它来实现我的需要

在一个次要问题上,我还有一个常量变量,我希望它同时存在于我的设备和主机上。现在我只说了两遍,一次是用设备,一次是不用,有没有更好的方法

  • \uuuu设备\uuuu
    变量必须在全局范围内声明
  • 编译时必须知道与
    \uuu设备\uu
    变量关联的分配大小
  • 相反,只要知道所需的分配大小,就可以使用
    cudamaloc
    为变量分配空间。此方法允许动态分配全局变量。
    \uuuu设备\uuuu
    方法仅允许静态分配全局变量

    大概是这样的:

    int main(){
       // ...
       int *d_data;
       cudaMalloc(&d_data, size*sizeof(int));
       // ... 
       kernel1<<<...>>>(d_data,...);
       // ... 
       kernel2<<<...>>>(d_data,...);
       // ...
    }
    

    在全局范围内(即
    main
    )将允许在主机或设备代码中平等使用此类定义,而无需声明或管理两次。最后一种方法适用于POD数据类型(例如
    int
    float
    double
    ,等等),但不适用于复杂类型,如
    struct
    ,,这不起作用

  • \uuuu设备\uuuu
    变量必须在全局范围内声明
  • 编译时必须知道与
    \uuu设备\uu
    变量关联的分配大小
  • 相反,只要知道所需的分配大小,就可以使用
    cudamaloc
    为变量分配空间。此方法允许动态分配全局变量。
    \uuuu设备\uuuu
    方法仅允许静态分配全局变量

    大概是这样的:

    int main(){
       // ...
       int *d_data;
       cudaMalloc(&d_data, size*sizeof(int));
       // ... 
       kernel1<<<...>>>(d_data,...);
       // ... 
       kernel2<<<...>>>(d_data,...);
       // ...
    }
    


    在全局范围内(即
    main
    )将允许在主机或设备代码中平等使用此类定义,而无需声明或管理两次。最后一种方法适用于POD数据类型(例如
    int
    float
    double
    ,等等),但不适用于复杂类型,如
    struct

    ,感谢您的回复!这样我就可以确保我现在理解了,因为我在设备中分配了内存,它不会丢失,即使我不使用cudaMemcpy来回传递信息,我的第二个内核中的s_sata将与我的第一个内核结束时留下的相同,对吗?因此,只要我重新发送指向所有内核的指针,它们都有办法引用该变量,否则,如果我不重新发送该变量,它仍然存在于分配的内存中,但我没有一个访问它的引用?是的,一旦你用
    cudamaloc
    分配设备内存,它是持久的,直到您对其调用
    cudaFree
    操作(或者直到您的应用程序终止)。它的行为类似于任何其他内存。一旦你写了一些东西给它,后续的操作可以看到写了什么,无论是后续的内核还是后续的
    cudaMemcpy
    操作。谢谢你的回复!这样我就可以确保我现在理解了,因为我在设备中分配了内存,它不会丢失,即使我不使用cudaMemcpy来回传递信息,我的第二个内核中的s_sata将与我的第一个内核结束时留下的相同,对吗?因此,只要我重新发送指向所有内核的指针,它们都有办法引用该变量,否则,如果我不重新发送该变量,它仍然存在于分配的内存中,但我没有一个访问它的引用?是的,一旦你用
    cudamaloc
    分配设备内存,它是持久的,直到您对其调用
    cudaFree
    操作(或者直到您的应用程序终止)。它的行为类似于任何其他内存。一旦您向其写入内容,后续操作就可以看到所写入的内容,无论是后续内核还是后续
    cudaMemcpy
    操作。
     constant int myconstant=123;