用户
 找回密码
 立即注册
quanzhang100 该用户已被删除
发表于 2013-11-4 16:31:57
75784
我自己写的一个向量相加kernel,
__global__    void        vectorAdd(const double *A, const double *B, double *scale,double *C, int numElements)
{
        int i = blockDim.x * blockIdx.x + threadIdx.x;

        if (i < ROW*COL)
        {
                C[i] = A[i] + (*scale) * B[i];
        }
}

我的数据规模是65526,专门写的了对这个kernel的测试函数,测得执行时间10us左右,但是我把它加入我的项目之后,用cudaProfilerStart(),cudaProfilerStop测得时间竟然是1ms,同时nvidiA visual profiler分析的时候出现如下错误“Unable to collect metric and enent values.The order of kernel exectution does not match the timeline.To asssociate event and metrics with the correct kernel,the application must behave identically on each run.Discarding all collected events and metrics”  请问这是什么原因呢?
使用道具 举报 回复
发表于 2013-11-4 16:36:59
为了排除我的kernel 与我的项目上下文直接关系,我在调用的时候,采用的变量与我的项目完全没有关系,也就是说,在我项目中加入了一个没有起任何作用的kernel。
使用道具 举报 回复 支持 反对
发表于 2013-11-4 16:40:57
quanzhang100 发表于 2013-11-4 16:36
为了排除我的kernel 与我的项目上下文直接关系,我在调用的时候,采用的变量与我的项目完全没有关系,也就 ...

楼主你好:

请您确保一下三点:
(1)将您的kernel单独抽取出来,使用单独的测试项目。不要夹杂其他 kernel
(2)如果要多次运行你的kernel, 请确保每次启动的线程形状测试是一样的。
(3)请您在您的程序末尾加上:cudaDeviceSynchronize(); cudaDeviceReset();

如果您确信这三点的中文描述你能看懂,请立刻尝试。
使用道具 举报 回复 支持 反对
发表于 2013-11-4 17:06:35
玫瑰幻想 发表于 2013-11-4 16:40
楼主你好:

请您确保一下三点:

(1)我的独立测试程序就是sdk中的vectorAdd的例子修改来的,其中只有一个kernel 65536大小的向量加法耗时10us
(2)我的项目中有一个求最优解的循环,我把vectorAdd放在了我项目的循环中,我估计这也是nvpp出现上面错误原因,然后我把vectorAdd kernel调用的位置重新放在了我的项目的循环外面,也就是整个项目执行过程中vectorAdd 只调用一次,果然nvpp的错误没有了,但是这个kernel的执行时间还是1ms。
(3)我的项目的结尾加了cudaDeviceSynchronize(); cudaDeviceReset();
玫瑰版主帮我分析一下这是什么原因,我特别想不通的是,执行时间怎么差这么大?觉得矩阵相加不可能耗时1ms啊。
使用道具 举报 回复 支持 反对
发表于 2013-11-4 17:18:21
quanzhang100 发表于 2013-11-4 17:06
(1)我的独立测试程序就是sdk中的vectorAdd的例子修改来的,其中只有一个kernel 65536大小的向量加法耗 ...

你的时间不能以你的测试为准,因为你很可能测试错误。

在你确保了上述三点后(其中第二点可以执行多次的,但需要形状稳定),请以profiler报告的时间为准。
(profiler报告的时间,用鼠标点下你的kernel的颜色块就能看到)

如果profiler报告的就是1ms, 那么他的确执行了1ms. 这个谁都无法否认。

请您相信profiler.
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册