1

当我尝试将 cl_float2 值的数组复制到常量内存时,它无法按 Nvidia 平台的预期工作,.y 部分似乎为零。对于 AMD 和 Intel 平台,我没有遇到这个问题。

// 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;
}
4

1 回答 1

0

我可能错了,但我从来没有让矢量类型数学在 GTX680 和 GTX260 上工作。正因为如此,FFT 等一些 AMD 库不适用于 NVIDIA 卡,但可以在 AMD 和 Intel 硬件上正常工作。NVIDIA 似乎在 OpenCL 方面落后了。

要查看的另一件事是 OpenCL 设备的首选向量长度,以最好地利用资源。例如,我的 ATI7990 的 float Preferred Vector Length 为 1,而我的 i5 的 av Vector Length 为 8。因此,为了充分利用 i5,我将使用 float8 来最大限度地利用 SIMD。

要检查首选矢量长度,请使用clGetDeviceInfoCL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT 选项。

编辑:

糟糕,显示了本机矢量宽度,但它与首选矢量宽度相同。

在此处输入图像描述

于 2013-08-25T17:58:54.010 回答