使用 CUDA CI 有一个统计内核,当我在内核中的任何位置在 VS2012 中添加断点并将 stddev 行包含在前面的变量定义中时:
double mean, stddev, sumOfValues, sumOfValuesSquared;
unsigned int n;
// acquire greater than 0 values for: sumOfValues, sumOfValuesSquared, and n
stddev = (float)(sqrt((double)(n) * sumOfValuesSquared - (sumOfValues*sumOfValues)) / (double)(n));
断点永远不会到达,内核也不会执行。当我删除那一行时,内核就会执行。我认为它与sqrt有关,但事实并非如此。我还有一行:
mean = sumOfValues / n;
当我使用该行时,它也不会执行内核。关于 CUDA 中的类型转换,我缺少什么(这是寄存器问题,还是单精度与双精度)?
-- 更新 (10/2/2013 14:25 CST) --
我将线程数从 1 调整到 1024。第一次运行,它进入我的断点,第二次线程数高,内核不执行。请看下面的代码:
#include "stdafx.h"
#include <stdio.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
typedef struct
{
    unsigned int value;
} ValueStruct;
__global__ void FailsToExecute(ValueStruct *vs)
{
    unsigned int numerator = vs->value;
    unsigned int denominator= 3;
    bool eject = false;
    if(denominator > 0)
    {
         if(1.0f * numerator / denominator > 17.98f)
             eject = true;
         else
             eject = false;
    }
}
int _tmain(int argc, _TCHAR* argv[])
{
    ValueStruct *vsHost;
    ValueStruct *vsDevice;
    cudaMallocHost((void **)&vsHost, sizeof(ValueStruct));
    cudaMalloc((void **)&vsDevice, sizeof(ValueStruct));
    vsHost->value = 54;
    cudaMemcpy(vsDevice, vsHost, sizeof(ValueStruct), cudaMemcpyKind::cudaMemcpyHostToDevice);
    dim3 blocks(5);
    dim3 threads(1024);
    FailsToExecute<<<blocks, threads>>>(vsDevice);
    return 0;
}
我如何计算/处理寄存器边界,我对它们了解不多?