Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance OpenCL内核在更快的GPU上执行速度较慢_Performance_Optimization_Opencl_Gpu_Nvidia - Fatal编程技术网

Performance OpenCL内核在更快的GPU上执行速度较慢

Performance OpenCL内核在更快的GPU上执行速度较慢,performance,optimization,opencl,gpu,nvidia,Performance,Optimization,Opencl,Gpu,Nvidia,我是OpenCL的新手,一直在尝试实现DSP算法 将其在不同GPU上的性能与标准CPU实现进行比较。 虽然我已经获得了巨大的性能提升,但奇怪的是,我在GT240上获得的提升几乎与更快的GTX 480相同。我的程序执行两个内核,当一个在GTX 480上加速时,另一个减慢 GT240:内核1:226us,内核2:103us GTX 480:内核1:35us,内核2:293us 这些数字是使用视觉轮廓仪获得的。 下面是内核2的代码,在更大的卡上,它的速度几乎慢了3倍。这个内核获取一个内存块,它是iTo

我是OpenCL的新手,一直在尝试实现DSP算法 将其在不同GPU上的性能与标准CPU实现进行比较。 虽然我已经获得了巨大的性能提升,但奇怪的是,我在GT240上获得的提升几乎与更快的GTX 480相同。我的程序执行两个内核,当一个在GTX 480上加速时,另一个减慢

GT240:内核1:226us,内核2:103us

GTX 480:内核1:35us,内核2:293us

这些数字是使用视觉轮廓仪获得的。 下面是内核2的代码,在更大的卡上,它的速度几乎慢了3倍。这个内核获取一个内存块,它是iTotalBins x iNumAngles big,并计算每行iNumAngles长度的最大值,并将一条曲线拟合到3个相邻的值

__kernel void max_curve_fit_gpu (__global float* fCorrelationResult,
                          const int iNumAngles,
                          const int iTotalBins,
                          __global float* fResult){

// Get the thread ID which is used as the index the bin the direction is being calculated for
const int iBinNum = get_global_id(0);
const int iOffset = iBinNum*iNumAngles;

// Find the max for this bin
float fMax = 0;
int iMaxIndex = 0;
for (int iAngle=0; iAngle<iNumAngles; iAngle++)
{
    if (fMax < fCorrelationResult[iOffset + iAngle])
    {
        fMax = fCorrelationResult[iOffset + iAngle];
        iMaxIndex = iAngle;
    }
}

// Do the curve fit
float fPrev, fNext, fA, fB, fAxis;
fPrev = fCorrelationResult[iOffset + (iMaxIndex + iNumAngles - 1) % iNumAngles];
fNext = fCorrelationResult[iOffset + (iMaxIndex + iNumAngles + 1) % iNumAngles];

fB = (fPrev - fNext)*0.5f;
fA = (fNext + fPrev) - fMax*2.0f;
fAxis = fB / fA;

    // Store the result
fResult[iBinNum] = iMaxIndex + fAxis; }
\uuu内核void max\u曲线\u拟合\uu gpu(\uu全局浮点*fCorrelationResult,
恒温器,
伊托塔宾斯常数,
__全局浮点*fResult){
//获取线程ID,该ID用作计算方向的容器的索引
const int-iBinNum=获取全局id(0);
常数int iOffset=iBinNum*iNumAngles;
//找到这个箱子的最大值
浮动fMax=0;
int-iMaxIndex=0;

对于使用OpenCL的(intiAngle=0;iAngle),当内核在特定GPU上运行时,是否可以进入较低的级别,了解有关寄存器和共享内存使用的信息


从我对NVIDIA CUDA的有限接触来看,利用率可能是关键。GT240是计算能力1.2,GTX480是2.0,因此后者有2倍的寄存器和3倍的共享内存。我猜OpenCL为第二个内核生成的代码无法在480上利用这些资源。例如,可能存在共享内存库冲突有了OpenCL,当内核在特定的GPU上运行时,是否有可能到较低的层次去了解寄存器和共享内存的使用情况


从我对NVIDIA CUDA的有限接触来看,利用率可能是关键。GT240是计算能力1.2,GTX480是2.0,因此后者有2倍的寄存器和3倍的共享内存。我猜OpenCL为第二个内核生成的代码无法在480上利用这些资源。例如,可能存在共享内存库冲突.

在您的代码中,线程
T
将访问
fCorrelationResult[T*iNumAngles+iAngle]
,这意味着您没有联合访问,也可能存在内存库冲突。内存库冲突可以解释您观察到的现象


你应该转置你的矩阵,访问
fCorrelationResult[T+iAngle*iNumBins]
。你肯定会得到很好的加速,而且可能会在两个GPU之间获得更规则的基准测试。

在你的代码中,线程
T
将访问
fCorrelationResult[T*iNumAngles+iAngle]
,这意味着您没有联合访问,也可能存在内存库冲突。内存库冲突可以解释您观察到的现象

你应该转置你的矩阵,然后访问
fCorrelationResult[T+iAngle*iNumBins]
。你肯定会得到一个不错的加速,而且可能会在两个GPU之间获得更常规的基准测试