我对将数组复制到常量内存感到困惑。
根据programming guide,至少有一种方法可以分配常量内存并使用它来存储值数组。这称为静态内存分配:
__constant__ float constData[256];
float data[256];
cudaMemcpyToSymbol(constData, data, sizeof(data));
cudaMemcpyFromSymbol(data, constData, sizeof(data));
再次根据programming guide我们可以使用:
__device__ float* devPointer;
float* ptr;
cudaMalloc(&ptr, 256 * sizeof(float));
cudaMemcpyToSymbol(devPointer, &ptr, sizeof(ptr));
看起来使用动态常量内存分配,但我不确定。此处也没有使用限定符__constant__
。
所以这里有一些问题:
答案 0 :(得分:4)
开发人员可以在文件范围内声明最多64K的常量内存。在SM 1.0中,工具链使用的常量内存(例如,用于保存编译时常量)与开发人员可用的常量内存是分开的,并且我不认为这已经发生了变化。驱动程序动态管理常量内存的不同视图之间的切换,因为它启动驻留在不同编译单元中的内核。虽然您无法动态分配常量内存,但此模式已足够,因为64K限制不是系统范围的,它仅适用于编译单元。
使用您问题中引用的第一个模式:静态声明常量数据并在启动引用它的内核之前使用cudaMemcpyToSymbol
更新它。在第二种模式中,只有指针本身的读取才能通过常量存储器。使用读取指针将由正常的L1 / L2缓存层次结构提供服务。