Cuda 有没有办法动态分配恒定内存?库达

Cuda 有没有办法动态分配恒定内存?库达,cuda,Cuda,我对将数组复制到常量内存感到困惑 根据这项研究,至少有一种方法可以分配常量内存并使用它来存储一个值数组。这称为静态内存分配: __constant__ float constData[256]; float data[256]; cudaMemcpyToSymbol(constData, data, sizeof(data)); cudaMemcpyFromSymbol(data, constData, sizeof(data)); 根据第二次报告,我们可以使用: __device__ flo

我对将数组复制到常量内存感到困惑

根据这项研究,至少有一种方法可以分配常量内存并使用它来存储一个值数组。这称为静态内存分配:

__constant__ float constData[256];
float data[256];
cudaMemcpyToSymbol(constData, data, sizeof(data));
cudaMemcpyFromSymbol(data, constData, sizeof(data));
根据第二次报告,我们可以使用:

__device__ float* devPointer;
float* ptr;
cudaMalloc(&ptr, 256 * sizeof(float));
cudaMemcpyToSymbol(devPointer, &ptr, sizeof(ptr));
看起来使用了动态常量内存分配,但我不确定。这里也没有使用限定符
\uuuuu常量\uuuuuu

下面是一些问题:

  • 该指针是否存储在常量内存中
  • 分配的内存(通过该指针)也存储在常量内存中吗
  • 这个指针是常数吗?不允许使用设备或主机函数更改指针。但是否禁止更改数组的值?如果允许更改数组的值,那么是否意味着不使用常量内存来存储这些值

  • 开发人员可以在文件范围内声明高达64K的常量内存。在SM 1.0中,工具链使用的常量内存(例如,保存编译时常量)与开发人员可用的常量内存是分开的,我认为这一点从那时起就没有改变过。驱动程序在启动驻留在不同编译单元中的内核时,动态管理恒定内存的不同视图之间的切换。尽管您不能动态分配常量内存,但这种模式已经足够了,因为64K限制不是系统范围的,它只适用于编译单元


    使用问题中引用的第一种模式:静态声明常量数据,并在启动引用它的内核之前使用
    cudaMemcpyToSymbol
    更新它。在第二种模式中,只有指针本身的读取将通过常量内存。使用指针的读取将由正常的一级/二级缓存层次结构提供服务。

    开发人员可以在文件范围内声明高达64K的恒定内存。在SM 1.0中,工具链使用的常量内存(例如,保存编译时常量)与开发人员可用的常量内存是分开的,我认为这一点从那时起就没有改变过。驱动程序在启动驻留在不同编译单元中的内核时,动态管理恒定内存的不同视图之间的切换。尽管您不能动态分配常量内存,但这种模式已经足够了,因为64K限制不是系统范围的,它只适用于编译单元


    使用问题中引用的第一种模式:静态声明常量数据,并在启动引用它的内核之前使用
    cudaMemcpyToSymbol
    更新它。在第二种模式中,只有指针本身的读取将通过常量内存。使用指针进行的读取将由正常的一级/二级缓存层次结构提供服务。

    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>与标准C/C++
    常量一样,表示“只读”而不是“不可变”。与CUDA中的情况类似,设备代码中的只读数据可以通过主机代码中的API调用进行修改,
    常量
    对象可以由声明代码范围之外的代理(例如ISR、DMA传输或硬件寄存器)更新。@njuffa,谢谢。但是,当我们使用第二个cudaMemspyToSymbol示例时,我们是否会自动分配内存?我试图找出计算能力2.1的常量内存大小。我试过了,但是没有结果。所以我搜索了一下,只找到了。没有对CC 2.1进行任何说明。它对CC 2.1也正确吗?常量内存是一种具有某些特性的缓存。在第一个代码段中,您使用的是常量内存缓存,在第二种情况下不是。在后一种情况下,您只是为指针保留全局内存空间。我不是专家,但据我所知,指针本身将位于常量内存或设备内存中(取决于分配指针“”时使用的限定符,它所指向的内存将位于常量内存中。硬件提供64 kB的常量内存。其中一些内存可能会被CUDA数学库中的
    \uuuuuuu constant\uuuuu
    数据占用。我确信这是有文档记录的,请查看CUDA C编程指南。常量内存是然而,全局内存的映射部分传统上是通过具有广播功能的小型恒定缓存(大小为几kB)进行访问,这意味着它支持统一访问(从同一地址读取的扭曲中的所有线程)。如果我没记错的话,在Maxwell体系结构中,常量缓存的功能已经被只读缓存所包含。
    \uuuuu constant\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>与标准C/C++
    const
    一样,表示“只读”而不是“不可变”。与CUDA中的情况类似,设备代码中的只读数据可以通过主机代码中的API调用进行修改,
    常量
    对象可以由声明该对象的代码范围之外的代理进行更新(例如ISR、DMA传输或硬WAE寄存器)@njuffa,谢谢。但是当我们使用第二个CudamSpytoSymbol示例时,我们是否会自动分配内存?我试图找出计算能力2.1的常量内存大小。我尝试了文档,但没有结果。所以我只在谷歌上搜索并找到了。对于CC 2.1没有任何说明。对于CC 2.1也正确吗?常量内存是缓存吗一些特性。在第一个代码段中,您使用的是常量内存缓存,而在第二种情况下不是。在后一种情况下,您只是为指针保留全局内存空间。我不是专家,但据我所知,指针本身将位于常量内存或设备内存中(取决于分配指针“”时使用的限定符,指针指向的内存将位于常量内存中。硬件提供64 kB的常量内存。其中一些内存可能会被CUDA数学库中的
    \uuuuu constant\uuuu
    数据占用。我确信这是有文档记录的,请检查CUDA C程序MI