2013-06-28 2 views
0

나는 cuda 장치에 이중 연결 목록을 만들어야합니다.장치에서 이중 연결 목록을 반복합니다.

class Foo 
{ 
public: 
    int my_index; 
    static int count; 
    static int index; 
    static Foo* first; 
    static Foo* last; 
    Foo* next; 
    Foo* prev; 

    Foo(); //adds object to list 
    ~Foo(); //deletes object from list 
} 

Foo* Foo::first = 0; 
Foo* Foo::last = 0; 
int Foo::count = 0; 
int Foo::index = 0; 

내가 그것을 반복 할 :

for (Foo* pr = Foo::first; pr; pr = pr->next) 
{ 
    //do something 
} 

내 첫 번째 문제는 다음과 같습니다
나는 호스트 코드가
여러 다른 클래스가 있습니다Foo에서 상속
크기가 다르므로 어떻게해야합니까?

  • 중 장치도
  • 이상에 형 Foo의 모든 생성 된 클래스와 모든 파생 클래스를 복사, 완전히 장치에 Foo에서 전체를 연결리스트를 저장 내가 그나마

는 액세스 할 수 있습니다 호스트의 Foo 데이터,
장치에 만 필요합니다.

내 두 번째 문제 :
나는 여러 CUDA 장치 (3 CUDA 할 수있는 그래픽 카드)
가 어떻게 이중 두 장치 목록을 연결된 장치에 액세스 할 수 있나요?

  • 피어 투 피어 복사본?
  • 다른 건 없나요?
+1

실제로 달성하려는 것은 무엇입니까? CUDA 스레드에서 연결된 목록 통과의 성능은 실망 스럽습니다. –

+0

그것이 링크 된 목록이라는 것을 감안할 때, 클래스의 다른 크기가 문제가되는 것처럼 보이지는 않습니다. 실제로 개체 목록을 반복하는 데 문제가 있습니까?목록에는 기대하는 모든 것이 포함되어 있지 않다.) 또는 반복하는 동안 원하는대로 (어떻게 든 어떻게 든 객체를 복사하는) 방법을 모르는 문제 일까? –

+0

호스트에서 반복 작업은 완벽합니다. 내 유일한 문제는 전체 목록을 장치에 복사하는 것입니다. – bricklore

답변

-3

나는 CUDA에 대해 아무 것도 모른다. 그래서 더 좋은 대답이 될 것이다.

문제의 크기가 Foo 인 인스턴스를 결정하는 경우 클래스에 가상 size 메서드를 지정하지 않는 이유는 무엇입니까?

// In Foo: 
virtual size_t size() const; 

// In class T, a derivation of Foo: 
size_t size() const override { return sizeof(T); } 
1

나는 CUDA에 익숙하지 해요,하지만이 장치로 전송 될 수 있도록 당신이 어떤 형태로 각 개체를 변환 할 필요가 사운드 및 문제는 객체가 서로 다른 크기이며, 다른 가지고있다 내용. 그렇다면 각 개체를 형식에 따라 전송할 수있는 형식으로 변환하는 가상 함수로 문제를 해결할 수 있어야합니다.

물론
class Foo 
{ 
public: 
    // ... Everything else ... 

    virtual void *add_transfer_data(void *buffer) 
    { 
     // Copy whatever makes sense for a Foo object into the buffer. 
     memcpy(buffer, [something], n); 

     return reinterpret_cast<unsigned char *>(buffer) + n; 
    } 
}; 

class Bar: public Foo 
{ 
public: 
    // ... Everything else ... 

    virtual void *add_transfer_data(void *buffer) 
    { 
     // First, take care of the Foo part of the object. 
     buffer = Foo::add_transfer_data(buffer, buffer_size); 

     // Now copy whatever else a Bar object needs into the buffer. 
     memcpy(buffer, [something], m); 

     return reinterpret_cast<unsigned char *>(buffer) + m; 
    } 
}; 

void transfer_data(void *buffer) 
{ 
    void *next_location = buffer; 
    for (Foo* pr = Foo::first; pr; pr = pr->next) 
    { 
     next_location = pr->add_transfer_data(next_location); 
    } 

    // Send the contents of buffer to the device somehow. 
} 

add_transfer_data의 당신의 버전이 전송이 작동하는 방법의 세부 사항과 무엇에 따라 매우 다를 수 있습니다 : 당신이 void * 버퍼를 사용하여 바이너리로 데이터를 전송 한 경우와 같은 예를 들어,이 보일 수 있습니다 사물처럼 보입니다. 예를 들어, 단순한 Foo 객체를 위해 쓰는 것도 없을 것입니다. 다행히도, 이것은 중심 아이디어를 설명합니다.

관련 문제