[英]Repeated errors with GPU at identical intervals, is this a hard error?
问题:
我正在尝试使用cudafy.net使用我的图形卡进行一些计算。 我已经运行了我的内核的2个版本,并且我在特定的时间间隔不断收到错误,即数组中的每个第二个位置均为0.0,但应该更大一些。 下表列出了GPU返回的值与正确的值。 注意:我读过比较浮点数并不是理想的选择,但是当我应该获取大到6.34419e17的值时得到0.0似乎是错误的。
I GPU Correct Value
16,777,217 0.0 6.34419E17
16,777,219 0.0 6.34419E17
... ... .....
通过快速扫描它们,它们似乎出现在每第二个i值处。
到目前为止检查:
Ive还以不同的起始值运行以下代码,因为我认为这可能是数据问题,但对于每个错误,我仍然获得相同的i值。
Ive还更改了将内存分配到GPU的顺序,但这似乎并不影响结果。 注意:由于即时通讯是在VS中进行调试,因此我停止后即时通讯不会显式清除GPU上的内存。 我停止调试后,这个问题会清除吗? 重新启动电脑后,错误仍然存在。
显卡:
我的显卡如下: EVGA GTX 660 SC。
码:
我的内核:(注意:我有几个变量在下面没有使用,但是我还没有删除,因为我想一次删除1件事以便确定导致此错误的原因)
[Cudafy]
public static void WorkerKernelOnGPU(GThread thread, float[] value1, float[] value2, float[] value3, float[] dateTime, float[,] output)
{
float threadIndex = thread.threadIdx.x;
float blockIndex = thread.blockIdx.x;
float threadsPerBlock = thread.blockDim.x;
int tickPosition = (int)(threadIndex + (blockIndex * threadsPerBlock));
//Check to ensure threads dont go out of range.
if (tickPosition < dateTime.Length)
{
output[tickPosition, 0] = dateTime[tickPosition];
output[tickPosition, 1] = -1;
}
}
下面是一段代码,我用来调用内核,然后检查结果。
CudafyModule km = CudafyTranslator.Cudafy();
_gpu = CudafyHost.GetDevice(eGPUType.Cuda);
_gpu.LoadModule(km);
float[,] Output = new float[SDS.dateTime.Length,2];
float[] pm = new float[]{0.004f};
//Otherwise need to allocate then specify the pointer in the CopyToDevice so it know which pointer to add data to
float[] dev_tpc = _gpu.CopyToDevice(pm);
float[] dev_p = _gpu.CopyToDevice(SDS.p);
float[] dev_s = _gpu.CopyToDevice(SDS.s);
float[,] dev_o = _gpu.CopyToDevice(Output);
float[] dev_dt = _gpu.CopyToDevice(SDS.dateTime);
dim3 grid = new dim3(20000, 1, 1);
dim3 block = new dim3(1024, 1, 1);
Stopwatch sw = new Stopwatch();
sw.Start();
_gpu.Launch(grid, block).WorkerKernelOnGPU(dev_tpc,dev_p, dev_s, dev_dt, dev_o);
_gpu.CopyFromDevice(dev_o, Output);
sw.Stop(); //0.29 seconds
string resultGPU = sw.Elapsed.ToString();
sw.Reset();
//Variables used to record errors.
bool failed = false;
float[,] wrongValues = new float[Output.Length, 3];
int counterError = 0;
//Check the GPU values are as expected. If not record GPU value, Expected value, position.
for (int i = 0; i < 20480000; i++)
{
float gpuValue = Output[i, 0];
if (SDS.dateTime[i] == gpuValue) { }
else
{
failed = true;
wrongValues[counterError, 0] = gpuValue;
wrongValues[counterError, 1] = SDS.dateTime[i];
wrongValues[counterError, 2] = (float)i;
counterError++;
}
}
我在atm处只有一张图形卡,因此我无法快速查看它是否与图形卡错误。 该卡的使用期限不到8个月,在购买时是新的。
关于什么可能导致上述错误的任何想法?
谢谢你的时间。
编辑:只是试图降低我的gtx 660到660的库存速度。虽然仍然遇到错误。
Edit2 Ive使用了_gpu.FreeMemory; 确定我是否超出了卡的内存。 我还剩下1,013,202,944字节。
Edit3 Ive刚刚将输出数组的数据类型更改为long而不是float。 我现在似乎卡上有500MB以上的可用空间,但是我仍然从相同的值(即i = 16,777,217)中得到错误的结果。 我想这似乎暗示可能与索引多数民众赞成在问题有关?
float threadIndex = thread.threadIdx.x;
float blockIndex = thread.blockIdx.x;
float threadsPerBlock = thread.blockDim.x;
int tickPosition = (int)(threadIndex + (blockIndex * threadsPerBlock));
问题是事实是我在float中使用了ThreadIndex等。将其更改为int后,问题就解决了。
是时候让这个傻瓜远离电脑了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.