2013-04-10 3 views
0

나는 시간이 지남에 따라 대부분 정적 데이터를 축적하는 프로세스를 가지고 있으며, 그 중 많은 데이터 요소가 수백만 개가 있습니다. 데이터의 작은 부분이 때때로 변경 될 수도 있지만 대체로 변경되지는 않습니다.GPU에서 데이터 시각화 최적화?

그러나 모양과 색상 모두에서 데이터를 보는 방법을 자유롭게 변경할 수 있습니다.

데이터를 GPU에 데이터로 저장할 수있는 방법이 있습니까? 그런 다음 해당 데이터를 GPU에서 렌더링 가능한 것으로 변환하는 여러 가지 방법이 있습니다. 사용자는 알고리즘 중에서 선택할 수 있으며 우리는 데이터를 전혀 건드리지 않고 효율적으로 교체 할 수 있습니다. 또한 데이터에 색상 ID가 있지만 사용자는 데이터를 건드리지 않고 각 ID가 일치해야하는 색상을 변경할 수 있습니다.

따라서, 예를 들어, 아마도 다음 데이터있다

:

[1000, 602, 1, 1] 는 [1003, 602.5, 2, 2]

주 : 데이터가 NOT 정점 인 오히려 어떤 계산이나 룩업이 꼭지점으로 변환되어야 할 수도 있습니다.

사용자는 시각화 알고리즘 중에서 선택할 수 있습니다. (0, 602, 0)과 (3, 602.5, 100)에 각각 2 개의 큐브를 표시한다고합시다. 사용자는 색상 ID 1 = 파란색 및 2 = 녹색을 선택합니다. 따라서 원점 큐브는 파란색으로 표시되고 원점 큐브는 녹색으로 표시됩니다.

데이터를 전혀 수정하지 않고 사용자가 다른 시각화를 선택하면 이제 구가 (10, 602, 10) 및 (13, 602.5, 20)에 표시되고 사용자가 색상 매핑을 변경했습니다.

그러나 모든 데이터 요소 또는 4의 각 세트에 대한 사각형 사이에 선을 표시 할 수 있습니다 다른 시각화 등

는 간단한 방법으로 수행 할 수 있습니다 위의 설명 뭔가 있습니까? 어떻게 최선을 다하겠습니까?

끝에 추가하면 새 데이터가 추가된다는 점에 유의하십시오. 초당 수천의 버스트 가능성이 있습니다. 기존 데이터의 수정은 더 드뭅니다. 이러한 경우에 대한 성능 저하는 허용됩니다. 사용자가 알고리즘과 색상 매핑을 변경하는 경우는 상대적으로 드뭅니다.

크로스 플랫폼 API (OS 및 GPU를 통해)를 사용하여이 작업을 수행하고 싶습니다. 따라서 OpenGL을 사용한다고 가정합니다.

답변

1

VBO (GPU 메모리)에 데이터를 저장하고 변경하면 업데이트 할 수 있습니다.

GPU 쪽에서는 지오메트리 셰이더를 사용하여 더 많은 지오메트리를 생성 할 수 있습니다. 선에서 입방체로 전환하는 방법을 잘 모르겠지만 각 위치에서 삼각형을 그리는 경우 GS는 "여분의"삼각형 (선과 점에도 맞음)을 출력 할 수 있습니다.

색상 변경 기능은 해당 논리를 버텍스 쉐이더로 구울 수 있습니다. idx (1, 2, ...)는 정점 속성이어야합니다. VS에서 idx -> 색상 매핑을 제공하는 테이블을 찾아 보도록하십시오. (이것은 작은 텍스처로 저장 될 수 있습니다). 텍스처를 업데이트하여 실시간으로 색상 매핑을 변경할 수 있습니다.

+0

감사합니다. VBO에 추가하는 것을 최적화 할 수있는 방법이 있습니까? 이후로 나는 그것에 데이터를 아주 빨리 추가 할 수 있습니다. 또한 기하 구조 셰이더에서 한 번에 둘 이상의 점에 액세스 할 수 있으므로 한 점에서는 점 하나당 하나의 모양을 만들 수 있지만 다른 경우 여러 점당 하나의 모양이 만들어 질 수 있습니까? – mentics

+0

'glBindBuffer'는 * target * param (이 VBO가 버텍스 또는 인덱스 데이터를 보유할지 여부를 알려줍니다)를 허용합니다. 'glBufferData'는 * usage * param (데이터가 정적, 동적 또는 스트림인지, 그리고 앱이 읽기, 복사 또는 그리기 여부를 암시 함)을 허용합니다. –

+0

또한 정확한 힌트 조합을 통해 ** 최상의 성능을 프로파일 링을 통해서만 발견 할 수 있습니다. 정말 하드웨어 + OpenGL 드라이버 버전에 달려 있습니다. –

0

여러분의 응용 프로그램에는 특별한 GPGPU 프로그래밍 인프라가 있습니다 : CUDA 및 OpenCL. OpenCL은 교차 공급 업체 시스템입니다. CUDA는 크로스 플랫폼이지만 NVidia GPU 만 지원합니다. 또한 OpenGL은 OpenGL-4.2 (계산 쉐이더)에서 범용 컴퓨팅 기능을 도입했습니다.데이터 요소

수백만의

과 많은

, 수백만의 하나의 요소는 다음 TRANSFERT 단지 100 MiB 크기 것 100 바이트를 소비하더라도, 매우 많은 수 없습니다. 최신 GPU는 호스트 시스템 메모리에서 /로 약 10 GiB/s를 전송할 수 있습니다.

위의 설명은 간단한 방법으로 수행 할 수 있습니까? 어떻게 최선을 다하겠습니까?

예. 가능합니다. 그러나 문제를 병렬화하고 메모리 액세스 패턴을 GPU가 선호하는 것에 맞춰야 만 실제로 성능을 볼 수 있습니다. 특히 메모리 액세스 패턴이 좋지 않으면 성능 손실이 몇 배 정도 커질 수 있습니다.