OpenCL内核中赋值给uint32_t*导致程序挂起问题求助
OpenCL ECC公钥生成内核挂起问题
我在尝试用OpenCL从私钥生成公钥时,内核执行出现挂起,已将问题定位到secp256k1_fe_sqr_inner函数(无需关注其具体密码学功能):
#define uint32_t uint #define uint64_t ulong static void secp256k1_fe_sqr_inner(uint32_t *r, const uint32_t *a) { uint64_t c, d; uint64_t u0, u1, u2, u3, u4, u5, u6, u7, u8; uint32_t t9, t0, t1, t2, t3, t4, t5, t6, t7; const uint32_t M = 0x3FFFFFFUL, R0 = 0x3D10UL, R1 = 0x400UL; d = (uint64_t)(a[0]*2) * a[9] + (uint64_t)(a[1]*2) * a[8] + (uint64_t)(a[2]*2) * a[7] + (uint64_t)(a[3]*2) * a[6] + (uint64_t)(a[4]*2) * a[5]; t9 = d & M; d >>= 26; c = (uint64_t)a[0] * a[0]; d += (uint64_t)(a[1]*2) * a[9] + (uint64_t)(a[2]*2) * a[8] + (uint64_t)(a[3]*2) * a[7] + (uint64_t)(a[4]*2) * a[6] + (uint64_t)a[5] * a[5]; u0 = d & M; d >>= 26; c += u0 * R0; t0 = c & M; c >>= 26; c += u0 * R1; c += (uint64_t)(a[0]*2) * a[1]; d += (uint64_t)(a[2]*2) * a[9] + (uint64_t)(a[3]*2) * a[8] + (uint64_t)(a[4]*2) * a[7] + (uint64_t)(a[5]*2) * a[6]; u1 = d & M; d >>= 26; c += u1 * R0; t1 = c & M; c >>= 26; c += u1 * R1; c += (uint64_t)(a[0]*2) * a[2] + (uint64_t)a[1] * a[1]; d += (uint64_t)(a[3]*2) * a[9] + (uint64_t)(a[4]*2) * a[8] + (uint64_t)(a[5]*2) * a[7] + (uint64_t)a[6] * a[6]; u2 = d & M; d >>= 26; c += u2 * R0; t2 = c & M; c >>= 26; c += u2 * R1; c += (uint64_t)(a[0]*2) * a[3] + (uint64_t)(a[1]*2) * a[2]; d += (uint64_t)(a[4]*2) * a[9] + (uint64_t)(a[5]*2) * a[8] + (uint64_t)(a[6]*2) * a[7]; u3 = d & M; d >>= 26; c += u3 * R0; t3 = c & M; c >>= 26; c += u3 * R1; c += (uint64_t)(a[0]*2) * a[4] + (uint64_t)(a[1]*2) * a[3] + (uint64_t)a[2] * a[2]; d += (uint64_t)(a[5]*2) * a[9] + (uint64_t)(a[6]*2) * a[8] + (uint64_t)a[7] * a[7]; u4 = d & M; d >>= 26; c += u4 * R0; t4 = c & M; c >>= 26; c += u4 * R1; c += (uint64_t)(a[0]*2) * a[5] + (uint64_t)(a[1]*2) * a[4] + (uint64_t)(a[2]*2) * a[3]; d += (uint64_t)(a[6]*2) * a[9] + (uint64_t)(a[7]*2) * a[8]; u5 = d & M; d >>= 26; c += u5 * R0; t5 = c & M; c >>= 26; c += u5 * R1; c += (uint64_t)(a[0]*2) * a[6] + (uint64_t)(a[1]*2) * a[5] + (uint64_t)(a[2]*2) * a[4] + (uint64_t)a[3] * a[3]; d += (uint64_t)(a[7]*2) * a[9] + (uint64_t)a[8] * a[8]; u6 = d & M; d >>= 26; c += u6 * R0; t6 = c & M; c >>= 26; c += u6 * R1; c += (uint64_t)(a[0]*2) * a[7] + (uint64_t)(a[1]*2) * a[6] + (uint64_t)(a[2]*2) * a[5] + (uint64_t)(a[3]*2) * a[4]; d += (uint64_t)(a[8]*2) * a[9]; u7 = d & M; d >>= 26; c += u7 * R0; t7 = c & M; c >>= 26; c += u7 * R1; c += (uint64_t)(a[0]*2) * a[8] + (uint64_t)(a[1]*2) * a[7] + (uint64_t)(a[2]*2) * a[6] + (uint64_t)(a[3]*2) * a[5] + (uint64_t)a[4] * a[4]; d += (uint64_t)a[9] * a[9]; u8 = d & M; d >>= 26; c += u8 * R0; // --> 挂起点 r[3] = t3; r[4] = t4; r[5] = t5; r[6] = t6; r[7] = t7; r[8] = c & M; c >>= 26; c += u8 * R1; c += d * R0 + t9; r[9] = c & (M >> 4); c >>= 22; c += d * (R1 << 4); d = c * (R0 >> 4) + t0; r[0] = d & M; d >>= 26; d += c * (R1 >> 4) + t1; r[1] = d & M; d >>= 26; d += t2; r[2] = d; }
r是一个大小为10的uint32_t数组,程序执行到r[3] = t3时出现挂起。内核编译通过并能启动,但触发挂起后,GPU-Z显示GPU无负载、温度处于空闲状态,仅风扇转速异常偏高。
我尝试过创建局部数组uint32_t temp[10],按照原逻辑给temp赋值后执行r = temp,这种方式能避免挂起,但计算结果完全错误——无论输入是什么,输出都相同。
开发环境
- 编译工具:Visual Studio 2022
- OpenCL依赖:CUDA SDK 12.2自带的OpenCL库,同时安装Intel oneAPI用于CPU端运行OpenCL代码
- 硬件:Windows 10设备,Intel处理器 + RTX 3080移动GPU
- 编译选项:
clBuildProgram中设置-cl-std=CL1.2
内容的提问来源于stack exchange,提问作者MrPuzzler
相关产品推荐
相关产品推荐

