2011-11-16 3 views
3

CUDA 커널에서 문자열, 벡터, 맵 또는 세트와 같은 표준 클래스를 사용하는 방법이 없다는 것을 알고 있습니다. 그러나, 그들 없이는 매우 불편합니다. CUDA 커널에 많은 코드를 작성해야하므로 적어도 문자열과 벡터를 사용하고 싶습니다. 나는 추력 같은 것에 대해 말하는 것이 아닙니다. 이 512 개 스레드를 생성해야CUDA 커널의 STD 클래스

__global__ void kernel() 
{ 
    cuda_vector<int> a; 
    for(int i=0;i<10;i++) 
     a.push_back(i); 
} 

int main() 
{ 
    kernel<<<1,512>>>(); 
    return 0; 
} 

각 스레드에서 나는 cuda_vector 클래스를 생성하고 표준 : : 벡터로 사용하려는 :이 같은 것을 쓸 수 있어야합니다. 나는 인터넷에서 어떤 해결책도 찾지 못했고 나는 나 자신의 수업을 쓰기 시작했다. 이 클래스의 각 함수는 "__ host __"및 "__ device __"함수로 정의되어 CPU와 GPU에서 모두 사용할 수 있습니다. 이론적으로는 Fermi 아키텍처에서만 구현 될 수 있습니다. 왜냐하면, 우리는 메모리를 동적으로 할당해야합니다. 나는 GTX 580을 가지고 있고 내 자신의 Vector를 작성하기 시작했다. 그러나 피곤하고 많은 시간이 필요합니다. 사용할 수있는 구현이 없습니까? 나는 아무 것도 없다고 믿을 수 없다. CUDA가 없으면 많은 소프트웨어 개발자가이를 작성합니까? 아무도 자신의 버전을 쓰려고하지 않았습니까?

+0

성능이 좋지는 않습니다. Cuda C 프로그래밍 가이드와 베스트 프랙티스 가이드를 읽어 보면 그 이유를 이해할 수 있습니다. – jmsu

+0

그 점을 이해합니다. 그러나 나는 드물게 문자열과 벡터가 필요하다. 계산적으로 강렬한 부분에서는 사용할 필요가 없습니다. 따라서 성능에 큰 영향을 미치지 않습니다. –

답변

0

아직 사용하지 않았지만 CuPP framework이 특히 유용 할 수 있습니다. 특히 vector<T> 구현입니다. 그것은 당신이 필요로하는 것을 할 수있는 것처럼 보입니다.

+0

답변 해 주셔서 감사합니다. forums.nvidia.com (경험이 있었는데 ...)에서 질문하면 아마 며칠 만 기다려야했습니다.하지만 필요한 것이 아닙니다. 이 cupp :: vector 은 호스트 코드에 사용됩니다. 난 단지 그것 자체가 아닌 커널 자체에서 벡터를 사용하고 싶다. –

2

cuda에 대해 std :: vector와 같은 것을 찾지 못한 이유는 성능입니다. 전통적인 벡터 오브젝트는 CUDA 모델과 잘 맞지 않습니다. 512 개의 쓰레드만을 사용할 계획이라면 각 객체는 CPU와 동일한 코드를 실행하는 것보다 성능이 떨어지는 객체와 같은 std :: vector를 관리하게 될 것입니다.

GPU 스레드는 CPU 스레드와 같지 않으므로 가능한 한 가볍습니다. 스레드 블록과 공유 메모리를 사용하여 스레드를 협업시킵니다. 문자열을 조작하는 경우 각 스레드는 한 문자로 작업해야합니다. CPU의 벡터를 사용하여 GPU에 배열을 전달하고 각 스레드가 하나의 요소에서 작동하도록해야합니다. 기본적으로 CUDA 프로그래밍 모델로 문제를 해결하는 방법을 CPU 접근법으로 해결 한 다음 CUDA로 변환하는 방법에 대해 생각해보십시오.

+0

나는이 두 모델의 차이점을 안다. 나는 내가 왜 그것을 필요로하는지 설명해야한다고 생각한다. 내가 큰 작업을하고 많은 다른 데이터 (~ 10000)에 대해 정확히 동일한 작업을 수행해야한다고 가정 해 봅시다. 이 작업이 지금 구현됨에 따라 CPU는 10000 개의 서로 다른 데이터에서 동일한 작업을 수행합니다. 이제이 데이터를 다른 cuda 코어에 전파하고 싶지만 코드를 너무 많이 변경하고 싶지는 않습니다. 따라서 각 코어는 많은 작업을 수행하지만 동시에 완료됩니다. 따라서 CPU에 10000 개의 벡터가 있고 순차적으로 연산을 수행하면 GPU가 병렬로 처리합니다. 나는 그것이 훨씬 더 빠를 것임에 틀림 없다 :) –