【发布时间】:2021-12-24 10:03:36
【问题描述】:
我正在使用内联 PTX ld.shared 从共享内存中加载数据:
__shared__ float As[BLOCK_SIZE][BLOCK_SIZE]; //declare a buffer in shared memory
float Csub = 0;
As[TY][TX] = A[a + wA * TY + TX]; //load data from global memory to shared memory
__syncthreads();
float t;
asm("ld.shared.f32 %0, [%1];" :"=f"(t) : "r"((int)&As[TY][k])); //load data from shared memory into t
Csub += t;
__syncthreads();
但遇到错误:
C:/ProgramData/NVIDIA Corporation/CUDA Samples/v11.2/0_Simple/matrixMul_mine/matrixMul.cu:196 code=700(cudaErrorIllegalAddress) "cudaStreamSynchronize(stream)" 出现 CUDA 错误
我转储 SASS 并发现 LDS 发生的时间甚至早于 LDG 和 2 bar.sync。好像编译器丢失了数据依赖的轨迹;
所以我的问题是:
- 我的内联 PTX 中是否有任何错误导致 cudaErrorIllegalAddress?
- 内联 PTX 会干扰数据依赖性吗?
【问题讨论】:
-
也许除了 talonmies 答案之外,您还必须将 As 声明为 volatile,非法地址可能与订单无关 - 但我们看不到您的参数 a、wA、TY、TK、k 的位置来自,全局数组有多大,或者你的内核被调用的块和网格大小。
-
刚刚得知地址需要像弯刀中的link一样用"cvta"转换。正如塞巴斯蒂安所说,应该在“asm”之后添加“volatile”。
标签: cuda inline shared-memory ptx