2013-07-26 2 views
-1

카메라에서 가져온 일련의 이미지가 있고이 이미지를 CUDA 장치 메모리에 저장하고 OpenGL을 사용하여 렌더링해야합니다. 이러한 이미지는 연속적으로 버퍼에 저장해야합니다. 내가 가진CUDA - 쓰레드 사용법 - 하나의 이미지를 다른 이미지로 버퍼에 복사하기

질문은 다음과 같습니다

  1. 내가 올바른 스레드 할당을해야합니까 어떻게 버퍼에 저장해야 할 10 개 개의 이미지,이 있으라?
  2. 내가 작성한 프로그램이 정확한지 알고 싶습니다.

나는 커널 코드 만 붙여 넣었습니다. 나는 별도로 호스트 코드에 BufferEnergyImg 메모리를 할당 :

const unsigned int tidx = blockDim.x * blockIdx.x + threadIdx.x; 
const unsigned int tidy = blockDim.y * blockIdx.y + threadIdx.y; 

const unsigned int adx = tidx + tidy * blockDim.x * gridDim.x; 

const unsigned int bdx = adx; 

int TotalFrames = 10; 

for(int a = 1; a<=TotalFrames; a++) 
{ 

    int SingleFrame = (m_ImageHeight * m_ImageWidth); 

    int CurrentFrame = a * (m_ImageHeight * m_ImageWidth); 
    // (first/next) frame is stored till the end of this value 

    int PreviousFrame = (a-1) * (m_ImageHeight * m_ImageWidth); 
    // next frame will be stored in memory from the end of previous frame 

    if ( (a==1)) 
    {    
     if (adx < CurrentFrame) 
     { 
      Buffer[adx] = EnergyImg[adx];               
     } 
    } 

    else if((a > 1) && (a <= TotalFrames)) 
    { 
     if(((adx > PreviousFrame) && (adx <= CurrentFrame))) 
     { 
      while (bdx < SingleFrame) 
      { 
       Buffer[adx] = EnergyImg[bdx];                   
      } 
     } 
    } 
} 
+0

왜 코드를 실행하고 볼 수 없습니다 먼저 올바른 결과를 산출한다면? –

+0

나는했다. 디버깅과 릴리스 모두에서 완벽하게 컴파일되고 빌드됩니다. 그러나 실시간으로 처리하고 렌더링하려고하면 액세스 위반 오류가 발생합니다. 아마도 버퍼에 저장되는 입력이 없으므로 렌더링 할 것이 없기 때문일 것입니다. – Eagle

답변

1

이 코드는 매우 나에게 깨진 보이는,하지만 당신은 아마도 잘못 짚었하고 있습니다.

  1. 에 표시된 다른 코드에서 오는 액세스 위반은이 코드와 관련 없을 것입니다. 이 코드 은 내가 볼 수있는 할당을하지 않으며 GPU 장치 코드가 OGL에서 렌더링에 사용할 버퍼를 만드는 것을 기대하지 않습니다. 이 코드는 확실히 버퍼의 데이터에 영향을 미칠 수 있지만 사용 가능한 버퍼의 크기 나 수에 영향을주지 않아야합니다.
  2. 이 코드에는 여러 가지 문제가있을 수 있습니다. 예를 들어, 이와 같은 구조가 거의 확실하게 깨졌습니다.

    while (bdx < SingleFrame) 
        { 
         Buffer[adx] = EnergyImg[bdx]; 
        } 
    

    이 코드가 무한 루프로 이어질 수 있는지 여부를 고려하십시오. CUDA 또는 GPU는 신경 쓰지 마십시오. 이것이 바로 C 코드라면, 어떤 상황에서 while 루프가 입력되면 실제로 빠져 나올 수 있습니까? const으로 선언 했으므로 bdx은 확실히 수정할 수 없습니다. bdx 번 동안의 조건을 만족하는 경우, (당신의 while 루프에서 아무것도 이후 또는이 값이 설립 된 후에는 어디서든 코드는 SingleFrame을 수정합니다.) 영원히 동안의 조건을 만족

+0

1. 분명히 큰 덩어리의 코드 조각 인 것입니다. 메모리를 할당하기 위해 cudaMalloc을 사용하고 ImageHeight 및 ImageWidth에 필요한 데이터를 cudaMemcpy로 복사했습니다. 액세스 위반 오류가 발생하는 이유는이 코드가 포함 된 프로젝트를 컴파일하고 빌드 할 때 Labview와 통합되어야하는 응용 프로그램을 얻게되기 때문입니다. Labview에는 두 개의 DLL이로드되어 OCT 이미지를 수집하고 사전 처리합니다. 필자가 작성한 코드는 전처리의 확장이다. – Eagle

+0

귀하의 의견이 내가 말한 내용에 영향을 미치는지 확신하지 못합니다. 1.이 코드는 버퍼를 적절하게 채우거나 쓰레기를 버리 든간에 다른 곳에서는 액세스 위반의 원인이 될 수 없습니다. 2.이 코드는 그 안에 무한 루프가 있습니다. (다른 방법으로는 잘 깨질 수 있습니다.) –

+0

이미지를 렌더링하기 위해 'CUDA- by example'텍스트 북에서 사용할 수있는 간단한 CUDA-GL interop 프로세스를 사용합니다 . 실제로 액세스 위반 오류가 발생하는 것은 렌더링 중입니다. 2. 무한 루프로 이어지는이 코드에 대해 생각해 보았습니다. 이것이 내가 당신의 두 번째 의견을 필요로 한 이유입니다. while 루프를 종료해야한다면 데이터에 대한 조건문을 수정해야 할 것입니다. – Eagle

관련 문제