我的环境是
- 视窗 7 x64
- Matlab 2012a x64
- 库达 SDK 4.2
- 特斯拉 C2050 GPU
我无法弄清楚为什么我的 GPU 因“遇到无法纠正的 ECC 错误”而崩溃。仅当我使用 512 个线程或更多线程时才会出现此错误。我不能发布内核,但我会尝试描述它的作用。
通常,内核采用许多参数并生成由线程大小 M 和另一个数字 N 定义的 2 个复杂矩阵。因此返回的矩阵大小为 MxN。典型配置是 512x512,但每个数字都是独立的,可以上下变化。当数字为 256x256 时,内核工作。
每个线程(内核)根据线程 id 从二维数组中提取一个 999 大小的向量,即大小为 999xM,然后循环遍历输出矩阵的行 (0 .. N-1) 进行计算。计算了许多中间参数,仅使用 pow、sin 和 cos 其中+ - * /
运营商。为了计算其中一个输出矩阵,需要执行一个额外的循环来总结之前提取的 999 个向量的贡献。该循环进行一些中间计算以确定允许贡献的值范围。然后按由计算的分数值的余弦值和正弦值确定的因子对贡献进行缩放。这是它崩溃的地方。如果我坚持一个常数值或 1.0 或任何其他值,内核将毫无问题地执行。但是,当只包含一个调用(cos 或 sine)时,内核会崩溃。
一些伪代码如下:
kernel()
{
/* Extract 999 vector from 2D array 999xM - one 999 vector for each thread. */
for (int i = 0; i < 999; i++)
{
.....
}
/* Cycle through the 2nd dimension of the output matricies */
for (int j = 0; j < N; j++)
{
/* Calculate some intermediate variables */
/* Calculate the real and imaginary components of the first output matrix */
/* real = cos(value), imaginary = sin(value) */
/* Construct the first output matrix from some intermediate variables and the real and imaginary components */
/* Calculate some more intermediate variables */
/* cycle through the extracted vector (0 .. 998) */
for (int k = 0; k < 999; k++)
{
/* Calculate some more intermediate variables */
/* Determine the range of allowed values to contribute to the second output matrix. */
/* Calculate the real and imaginary components of the second output matrix */
/* real = cos(value), imaginary = sin(value) */
/* This is were it crashes, unless real and imaginary are constant values (1.0) */
/* Sum up the contributions of the extracted vector to the second output matrix */
}
/* Construct the Second output matrix from some intermediate variables and the real and imaginary components */
}
}
我认为这可能是由于寄存器限制,但占用计算器表明情况并非如此,我使用的寄存器少于 512 个线程的 32,768 个寄存器。任何人都可以就造成这种情况的原因提出任何建议吗?
这是ptasx信息:
ptxas info : Compiling entry function '_Z40KerneliidddddPKdS0_S0_S0_iiiiiiiiiPdS1_S1_S1_S1_S1_S1_S1_S1_S1_' for 'sm_20'
ptxas info : Function properties for _Z40KerneliidddddPKdS0_S0_S0_iiiiiiiiiPdS1_S1_S1_S1_S1_S1_S1_S1_S1_
8056 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Function properties for __internal_trig_reduction_slowpathd
40 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 53 registers, 232 bytes cmem[0], 144 bytes cmem[2], 28 bytes cmem[16]
tmpxft_00001d70_00000000-3_MexFunciton.cudafe1.cpp