2013-08-24 1 views
1

cl_float2 값 배열을 상수 메모리에 복사하려고하면 Nvidia 플랫폼에서 예상대로 작동하지 않습니다. y 부분은 0 인 것 같습니다. AMD 및 Intel 플랫폼에서이 문제가 발생하지 않습니다.Nvidia 플랫폼에서 작동하지 않는 상수 메모리에 cl_float2 복사

// Host 
c_Quadrature_Filter_1 = clCreateBuffer(context, CL_MEM_READ_ONLY, FILTER_SIZE * FILTER_SIZE * sizeof(cl_float2), NULL, &createBufferErrorQuadratureFilter1); 

cl_float2* filter_temp = (cl_float2*)malloc(FILTER_SIZE * FILTER_SIZE * sizeof(cl_float2)); 
cl_float2 test; 
test.s[0] = 3.0f; 
test.s[1] = 13.0f; 

for (int xx = 0; xx < FILTER_SIZE; xx++) 
{ 
    for (int yy = 0; yy < FILTER_SIZE; yy++) 
    { 
     filter_temp[xx + yy * FILTER_SIZE].s[0] = test.s[0]; 
     filter_temp[xx + yy * FILTER_SIZE].s[1] = test.s[1];       
    } 
} 

clEnqueueWriteBuffer(commandQueue, c_Quadrature_Filter_1, CL_TRUE, 0, FILTER_SIZE * FILTER_SIZE * sizeof(cl_float2), filter_temp, 0, NULL, NULL); 
free(filter_temp); 

//Device 
__kernel(__global float2* Filter_Response, __constant float2* c_Quadrature_Filter_1, __private int DATA_W, __private int DATA_H, __private int DATA_D) 
{ 
    int x = get_global_id(0); 
    int y = get_global_id(1); 
    int z = get_global_id(2); 

    Filter_Response[Calculate3DIndex(x,y,z,DATA_W,DATA_H)].y = c_Quadrature_Filter_1[0].y; 
} 
+0

당신은'float4'를 사용하여 0으로 마지막 두 요소를 설정하려고 할 수 있습니까? 이것은 NVidia 구현의 버그 일 수 있습니다. 여기서 아무 것도 볼 수 없습니다. – Thomas

+0

모두 괜찮아 보입니다. 커널 밖의 입력과 출력을 다시 확인하십시오. 그 중 하나 또는 드라이버 버그. – DarkZeros

답변

0

내가 틀렸을 수도 있지만 GTX680 및 GTX260에서 작동하는 벡터 유형 계산을 한 번도 얻지 못했습니다. 이 때문에 FFT와 같은 일부 AMD 라이브러리는 NVIDIA 카드에서는 작동하지 않지만 AMD 및 Intel 하드웨어에서 제대로 작동합니다. NVIDIA는 OpenCL 앞에서 뒤떨어져있는 것 같습니다.

또 다른 주목해야 할 것은 OpenCL 장치가 리소스를 최대한 활용하는 데 필요한 기본 벡터 길이입니다. 예를 들어, 내 ATI7990은 1의 기본 벡터 길이를 부동화하고 i5는 8의 벡터 길이를가집니다. 따라서 i5를 최대한 활용하려면 float8을 사용하여 SIMD 사용을 최대화하십시오.

기본 벡터 길이를 확인하려면 clGetDeviceInfo에 CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT 옵션을 사용하십시오.

편집 :

아차, 네이티브 벡터 폭이 표시되어 있지만 기본 설정 벡터 폭과 동일합니다.

enter image description here

관련 문제