使用CUDA CI有一個統計的內核,當我在VS2012中添加內核內的任何地方一個斷點,包括與前一個變量定義STDDEV行:CUDA混合float和double導致內核不執行
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中的類型轉換(這是一個寄存器問題,還是單精度與雙精度)?
- 更新(2013年10月2日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;
}
如何計算/應付寄存器界限,我不很瞭解他們嗎?
您是否正在構建支持'double'的體系結構的代碼,即計算能力爲1.3或更高? – njuffa
看起來你沒有足夠的寄存器。嘗試減少每個塊的線程數以查看它是否可以運行。 – kangshiyin
我想這不是你的實際代碼。嘗試使用cuda-memcheck運行您的代碼。您的for循環中可能存在數據訪問衝突。或者提供一個完整的重現代碼。 SSCCE.org –