2013-03-22 3 views
0

전적으로 CUDA를 처음 사용합니다. 장치에 하나의 개체를 만들고 다른 스레드에서 해당 개체에 액세스하려고합니다. nvcc -arch = sm_20 (Tesla M2090에서)을 사용하고 코드를 실행하면 '지정되지 않은 실행 실패'가 발생합니다. 여기 내 코드입니다 :스레드간에 CUDA 공유 객체

#include <stdio.h> 
#include <string> 

using namespace std; 

#ifdef __CUDACC__ 
#define CUDA_CALLABLE __host__ __device__ 
#else 
#define CUDA_CALLABLE 
#endif 

class SimpleClass { 
public: 
    int i; 
    CUDA_CALLABLE SimpleClass(){i=1;}; 
    CUDA_CALLABLE ~SimpleClass(){}; 
}; 

__global__ void initkernel(SimpleClass *a){ 
    a = new SimpleClass(); 
} 
__global__ void delkernel(SimpleClass *a){ 
    delete a; 
} 
__global__ void kernel(SimpleClass *a){ 
printf("%d\n", a->i); 
} 

int main() { 
    SimpleClass *a; 
    initkernel<<<1,1>>>(a); 
    cudaThreadSynchronize(); 
    kernel<<<1,10>>>(a); 
    cudaThreadSynchronize(); 
    delkernel<<<1,1>>>(a); 
    cudaThreadSynchronize(); 

    cudaError_t error = cudaGetLastError(); 
    string lastError = cudaGetErrorString(error); 
    printf("%s\n",lastError.c_str()); 
    return 0; 
} 
+0

커널 호출이 끝날 때마다 'each'커널 호출 후에 오류를 확인해야한다. 이것은 모든 CUDA API 호출에도 적용됩니다. – pQB

+0

cuda-memcheck를 사용하여 응용 프로그램을 실행하고 결과를 게시 할 수 있습니까? – Vyas

답변

0

'A는 호스트에 저장된 포인터이기 때문에 첫 번째 커널 코드 중'지정되지 않은 발사 실패 '를 얻을 수 있지만, 당신이 그것을 장치 기능에서 값을주고 싶다. 장치에 개체를 할당하려면 먼저 장치에 포인터를 할당해야하며 장치 (커널) 코드를 읽고 쓸 수는 있지만 이중 간접 지정이 필요하므로주의해야합니다.

코드는 모양이 같은 (같은 기능의 다른 유사하게 수정해야)한다 :

__global__ void initkernel(SimpleClass** a){ 
    *a = new SimpleClass(); 
} 

int main() { 
    SimpleClass** a; 
    cudaMalloc((void**)&a, sizeof(SimpleClass**)); 
    initkernel<<<1,1>>>(a); 
    cudaThreadSynchronize(); 
} 

PS : pQB 그것에 대해 절대적으로 옳다, 각 커널 이후 에러 체크를해야한다 가능한 한 빨리 오류를 감지하는 코드 (현재 코드에서 오류의 정확한 위치를 찾는다.)

+0

SqrtPi에 감사드립니다. 귀하의 제안으로 문제가 해결되었습니다. – robogos

관련 문제