c++ - 为什么跨两个块的共享内存的指针位置相同?
问题描述
我认为 cuda 设备的共享内存是块私有的。但是,在我看来,跨两个块的共享内存指针是相同的:
#include <stdio.h>
__global__ void foo() {
__shared__ int ar[8];
printf("shared memory pointer %p at blockidx %i\n", ar, blockIdx.x);
}
int main() {
dim3 blockDim(1);
dim3 gridDim(2);
foo<<<gridDim, blockDim>>>();
cudaDeviceSynchronize();
}
运行上面的代码会产生:
shared memory pointer 0x7f88f5000000 at blockidx 0
shared memory pointer 0x7f88f5000000 at blockidx 1
使用这个程序,我希望创建两个不同的块,在每个块上初始化共享内存并获得两个不同的内存位置。我是不是误会了什么?还是这些指针确实具有不同的物理位置,但在一个块内地址似乎相同?
解决方案
共享内存是块私有的,即一个块中的线程不能访问另一个块的共享内存。
...出于这个原因,实际上可以预期共享内存的地址范围对于所有块都是相同的 - 但在每个块中,从这些地址加载或存储到这些地址会影响块本地共享内存。
直觉:这有点类似于在 CPU 上,两个进程中的代码可能使用相同的指针地址,但它们实际上会访问内存中的不同物理位置(通常)。
推荐阅读
- libreoffice - Libre Office 配置文件 bootstrap.ini 损坏
- swift - 如何解决扩展中的属性和类中的属性之间的歧义?
- java - javax.crypto.AEADBadTagException:AES/GCM/无填充加密器/解密器的标签不匹配
- swift - 使用 Webhook 从远程服务订阅事件
- java - Spring Boot 应用程序在 localhost 上运行,但在外部 Tomcat 上返回 404
- r - 是否有可用于连接到 IPV6Adress:Port 的 R 套接字功能?
- postgresql - 无法在 Ubuntu 18.04 上启动 postgresql - `无法绑定 IPv4 地址“127.0.0.1”:地址已在使用中`
- python - 如何使用 Python 附加我的数字签名 PDF 的公钥?
- amazon-web-services - 为什么使用 api 映射的带有 http api 的 api 网关失败并显示 404?
- haskell - Haskell 的“Const”函子是否类似于范畴论中的常数函子?