繁体   English   中英

GPU以相同的间隔重复出现错误,这是一个硬错误吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM