2015-02-07 2 views
0

저는 CUDA 프로그래밍에있어 초보자이지만이 상황은 복잡해 보이지 않지만 작동하지 않습니다.커널이 실행되지 않는 것 같습니다.

#include <cuda.h> 
#include <cuda_runtime.h> 

#include <iostream> 

__global__ void add(int *t) 
{ 
    t[2] = t[0] + t[1]; 
} 

int main(int argc, char **argv) 
{ 
    int sum_cpu[3], *sum_gpu; 

    sum_cpu[0] = 1; 
    sum_cpu[1] = 2; 
    sum_cpu[2] = 0; 

    cudaMalloc((void**)&sum_gpu, 3 * sizeof(int)); 

    cudaMemcpy(sum_gpu, sum_cpu, 3 * sizeof(int), cudaMemcpyHostToDevice); 

    add<<<1, 1>>>(sum_gpu); 

    cudaMemcpy(sum_cpu, sum_gpu, 3 * sizeof(int), cudaMemcpyDeviceToHost); 

    std::cout << sum_cpu[2]; 

    cudaFree(sum_gpu); 

    return 0; 
} 

내가 뭔가를 컴파일이

nvcc main.cu 

처럼 컴파일 합니다만, 반환 값이 나는 커널 내에서 인쇄 시도 0이며 그렇게 인쇄되지 않습니다 난 내가 '아무튼 가정 실행하지 마십시오. 이유를 설명해 주시겠습니까?

+3

[적절한 cuda 오류 검사] 추가 (http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for-errors-using-the-cuda-runtime-api)를 코드에 추가하십시오. 'cuda-memcheck'로 코드를 실행해볼 수도 있습니다. –

+0

힌트를 가져 주셔서 감사합니다. 첫 번째 cudaMalloc에서 '알 수없는 오류'라는 오류를 확인하는 중입니다. 'cuda-memcheck'는 0 에러를 감지합니다. – wiktus239

+2

기계 구성에 문제가 있습니다. CUDA가 제대로 설치되지 않았거나 다른 컴퓨터 문제로 인해 해당 컴퓨터에서 작동하지 않습니다. 확인 단계를 포함하여 [사용중인 OS에 적합한 시작 안내서] (http://docs.nvidia.com/cuda/index.html#getting-started-guides)의 지침을주의 깊게 따라야 할 수 있습니다. –

답변

0

코드를 검사했는데 문제가 없습니다. 그것은 나에게, 당신이 잘못 컴파일하고있는 것 같습니다 (CUDA SDK를 올바로 설치했다고 가정). 어쩌면 당신은 몇몇 깃발을 놓치고 있습니다 ... 그것은 생각하기에는 약간 복잡합니다. GPU의 컴퓨팅 성능을 확인하십시오.

모범 사례로서 저는 각 CUDA 프로젝트에 Makefile을 사용하고 있습니다. 처음 경로를 올바르게 설정할 때 사용하기가 쉽습니다. 내 CUDA에 cuda_base.cu

  • 경로를 호출 한 코드는 파일에 저장됩니다

    • 아치 리눅스 64을 사용하고

      NAME=base 
      # Compilers 
      NVCC = nvcc 
      CC = gcc 
      LINK = nvcc 
      CUDA_INCLUDE=/opt/cuda 
      CUDA_LIBS= -lcuda -lcudart 
      SDK_INCLUDE=/opt/cuda/include 
      # Flags 
      COMMONFLAGS =-O2 -m64 
      NVCCFLAGS =-gencode arch=compute_20,code=sm_20 -m64 -O2 
      CXXFLAGS = 
      CFLAGS = 
      INCLUDES = -I$(CUDA_INCLUDE) 
      LIBS = $(CUDA_LIBS) 
      ALL_CCFLAGS := 
      ALL_CCFLAGS += $(NVCCFLAGS) 
      ALL_CCFLAGS += $(addprefix -Xcompiler ,$(COMMONFLAGS)) 
      OBJS = cuda_base.o 
      # Build rules 
      .DEFAULT: all 
      
      all: $(OBJS) 
          $(LINK) -o $(NAME) $(LIBS) $(OBJS) 
      %.o: %.cu 
          $(NVCC) -c $(ALL_CCFLAGS) $(INCLUDES) $< 
      %.o: %.c 
          $(NVCC) -ccbin $(CC) -c $(ALL_CCFLAGS) $(INCLUDES) $< 
      %.o: %.cpp 
          $(NVCC) -ccbin $(CXX) -c $(ALL_CCFLAGS) $(INCLUDES) $< 
      clean: 
          rm $(OBJS) $(NAME) 
      

      설명 : 단순화 된 버전은 다음과 같습니다 SDK가 /opt/cuda (다른 경로 일 수 있습니다)

    • 가장 중요 : 카드를 가지고있는 컴퓨팅 기능은 무엇입니까? Mine은 최대 계산 기능 2.0을 갖춘 GTX 580입니다. 그래서 컴퓨팅 능력 Makefile을가 cuda_base.cu 외에 저장해야 2.0

    의 약자 NVCC 플래그 arch=compute_20,code=sm_20로 설정해야합니다. 난 그냥 & 다음 쉘

    $ make 
    nvcc -c -gencode arch=compute_20,code=sm_20 -m64 -O2 -Xcompiler -O2 -Xcompiler -m64 -I/opt/cuda cuda_base.cu 
    nvcc -o base -lcuda -lcudart cuda_base.o 
    $ ./base 
    3 
    

    에 입력이 파일에 코드를 붙여 넣기하고 결과를 얻었다 복사합니다.

    Me와 mine의 친구가 CUDA 코드 작성을위한 기본 템플릿을 만들었습니다. You can find it here if you like.

    희망이 ;-)

  • +0

    사람들이 왜 내 대답을 하향식하는지, 듣는 것이 좋을 것입니다. 나는 정말로이 질문에 초점을 맞추고, 코드를 검사하고, 내 컴퓨터에서 실행하고 발견했다. 어떤 경우에는 nvcc에 올바른 플래그를 설정하는 것이 필수적이다. Linux를 사용하기 때문에 Makefile을 사용하여 컴파일하는 것이 편리합니다. 이것은 CUDA 코드를 작성하여 터미널에서 컴파일하는 깨끗한 솔루션입니다. – n2o

    -1

    하는 데 도움이 나는 똑같은 문제를 했어. 나는 'CUDA by example'의 벡터 합계 예제 인 Sanders를 시도했다. & Kandrot. 나는 코드를 타이프하고, 벡터를 합쳐서 0을 만들었다.

    CUDA는 오류 메시지를 콘솔에 인쇄하지 않으며 CUDAMalloc 및 CUDAMemcpy와 같은 기능에서만 오류 코드를 반환합니다. 실제 예제를 얻으려는 바람에 오류 코드를 확인하지 않았습니다. 기본적인 실수. 그래서 Visual Studio에서 새로운 CUDA 프로젝트를 시작할 때로드되는 버전을 실행했을 때 오류 검사를 수행하면 빙고! 오류. 오류 메시지는 '잘못된 장치 기능'입니다.

    책 또는 동등한 프로그램을 사용하여, 내 카드의 연산 능력을 확인,이 것을 ...

    ... 그것을 위해 기다릴 표시 ...

    1.1

    그래서, 컴파일 옵션을 변경. Visual Studio 13에서 프로젝트 -> 속성 -> 구성 속성 -> CUDA C/C++ -> 장치 -> 코드 생성.

    항목을 compute_20, sm_20에서 compute_11, sm_11으로 변경했습니다. 이는 계산 기능이 가정 된 2.0이 아니라 1.1임을 나타냅니다.

    이제 재 작성된 코드가 예상대로 작동합니다.

    유용 할 것입니다.

    관련 문제