을 실행하지 않는 커널의 원인 부동의 혼합을 두 번하는 것은 통계 커널을 그 어디에서도 커널 내에서 VS2012에서 중단 점을 추가하고 이전의 변수 정의와 STDDEV 라인을 포함 할 때 :CUDA는 CUDA CI를 사용
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에서 타입 변환에 대해 빠뜨린 것은 무엇입니까 (레지스터 문제입니까, 단 정밀도와 배정 밀도입니까?).
- 나는 1 스레드의 수를 조정 한 다음 1024을 처음 실행, 그것은과 두 번째, 내 브레이크 포인트로 이동
- UPDATE (2013년 10월 2일 중부 표준시 14시 25분) 스레드 수가 많으면 커널이 실행되지 않습니다. 아래 코드를 참조하십시오.
#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 –