우리는 GPGPU 코스에 대한 과제를 진행하고 있습니다. 우리는 알고리즘을 선택하여 CPU에서 구현했으며 이제 OpenCL로 변환합니다.OpenCL : 가변 길이의 배열 출력
선택한 알고리즘은 모델을 삼각형 집합으로로드하고이를 복셀로 래스터 화합니다. 복셀은 점 데이터의 VBO로 정의됩니다. 그런 다음 기하학 쉐이더를 사용하여이 점들을 삼각형 모양의 보셀로 변환합니다.
따라서 OpenCL 프로그램은 삼각형 목록을 가져와 점의 변수 목록을 출력해야합니다.
가변 길이 배열을 출력하는 것이 문제인 것처럼 보입니다.
우리가 찾은 해결책은 카운터를 원자 적으로 증가시키고 해당 카운터를 출력 배열의 인덱스와 배열의 최종 크기로 사용하는 것입니다. 예외는 ... 두 GPU 모두 원자 연산 확장을 지원하지 않습니다.
이것은 우리가 지금까지 무엇을 가지고 :
#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable
#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable
#pragma OPENCL EXTENSION cl_khr_int64_extended_atomics : enable
#define POS1 i0 * 3 + 0
#define POS2 i0 * 3 + 1
#define POS3 i0 * 3 + 2
void WritePosition(__global float* OutBuffer, uint inIndex, __global float* inPosition)
{
OutBuffer[ inIndex * 3 ] = inPosition[0];
OutBuffer[ inIndex * 3 + 1] = inPosition[1];
OutBuffer[ inIndex * 3 + 2] = inPosition[2];
}
__kernel void Voxelize(
__global float* outPointcloudBuffer,
__global float* inTriangleBuffer,
__global uint* inoutIndex
)
{
size_t i0 = get_global_id(0);
size_t i1 = get_local_id(0);
WritePosition(outPointcloudBuffer, inIndex[0], &inTriangleBuffer[ i0 ]);
//atomic_inc(inoutIndex[0]);
inoutIndex[0] = max(inoutIndex[0], i0);
}
그리고 이것의 출력이 매우 이상하다. 우리는 매우 작은 모델 (삼각형 12 개, 위치 36 개, 부동 소수점 108 개)을 테스트하고 있으며, 결과는 31, 63 또는 95입니다. 항상 16에서 1을 뺀 것입니다.
어떻게 길이를 구할 수 있습니까? 우리의 가변 길이 출력 배열?
미리 감사드립니다.
전체 워프에서 커널을 실행 중이므로 결과가 16N - 1입니다. 수정하려면 총 삼각형 수를 커널에 전달하십시오. 'global_id'가 삼각형 수보다 크면 반환합니다. 이 방법은 삼각형이있는만큼 많은 커널을 실행합니다. –