使用 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;
}
我如何计算/处理寄存器边界,我对它们了解不多?