Qt和CUDA可视探查器内存传输大小错误

Qt和CUDA可视探查器内存传输大小错误,qt,profiling,cuda,Qt,Profiling,Cuda,我准备了一个.pro文件,用于在linux机器(64位)中使用Qt和CUDA。当我将应用程序运行到CUDA profiler中时,应用程序执行12次,但在显示结果之前,我得到下一个错误: “内存传输大小”列第6行的探查器数据文件“/home/myusername/development/qtspace/bin/temp_compute_profiler_0_0.csv”中出错 main.cpp文件如下所示 #include <QtCore/QCoreApplication> ext

我准备了一个.pro文件,用于在linux机器(64位)中使用Qt和CUDA。当我将应用程序运行到CUDA profiler中时,应用程序执行12次,但在显示结果之前,我得到下一个错误:

“内存传输大小”列第6行的探查器数据文件“/home/myusername/development/qtspace/bin/temp_compute_profiler_0_0.csv”中出错

main.cpp文件如下所示

#include <QtCore/QCoreApplication> 
extern "C"
void runCudaPart();

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    runCudaPart();
    return 0;
}
我注意到问题出在QCoreApplication构造上。它与参数有关。如果我将行修改为:

QCoreApplication a();
可视探查器可以正常工作。很难知道正在发生什么,以及这种变化在未来是否会成为一个问题。有什么提示吗

关于QCoreApplication构造,如果我在QCoreApplication之前调用cuda部分,那么这个示例也可以工作

// this way the example works.
runCudaPart();
QCoreApplication a(argc, argv);

提前感谢。

在64位Ubuntu 10.04LTS系统上,我无法用CUDA 3.2和QT4重现这一点。我采取了以下主要措施:

#include <QtCore/QCoreApplication>

extern float cudamain();

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    float gflops = cudamain();

    return 0;
}
(除了执行内存事务和运行内核之外,不要关注实际的代码,否则就是胡说八道)

按如下方式编译代码:

cuda:~$ nvcc -arch=sm_20 -c -o cudamain.o cudamain.cu 
cuda:~$ g++ -o qtprob -I/usr/include/qt4 qtprob.cc cudamain.o -L $CUDA_INSTALL_PATH/lib64 -lQtCore -lcuda -lcudart
cuda:~$ ldd qtprob
        linux-vdso.so.1 =>  (0x00007fff242c8000)
        libQtCore.so.4 => /opt/cuda-3.2/computeprof/bin/libQtCore.so.4 (0x00007fbe62344000)
        libcuda.so.1 => /usr/lib/libcuda.so.1 (0x00007fbe61a3d000)
        libcudart.so.3 => /opt/cuda-3.2/lib64/libcudart.so.3 (0x00007fbe617ef000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fbe614db000)
        libm.so.6 => /lib/libm.so.6 (0x00007fbe61258000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fbe61040000)
        libc.so.6 => /lib/libc.so.6 (0x00007fbe60cbd000)
        libz.so.1 => /lib/libz.so.1 (0x00007fbe60aa6000)
        libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0x00007fbe608a0000)
        libglib-2.0.so.0 => /lib/libglib-2.0.so.0 (0x00007fbe605c2000)
        librt.so.1 => /lib/librt.so.1 (0x00007fbe603ba000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x00007fbe6019c000)
        libdl.so.2 => /lib/libdl.so.2 (0x00007fbe5ff98000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fbe626c0000)
        libpcre.so.3 => /lib/libpcre.so.3 (0x00007fbe5fd69000)
生成一个可执行文件,在CUDA 3.2版本探查器中运行该文件的次数不会出现错误

我所能建议的就是试试我的Repo案例,看看它是否有效。如果失败,那么可能是CUDA或QT安装失败。如果它没有失败(我怀疑不会失败),那么您要么在构建QT项目的方式上有问题,要么在运行自己的实际CUDA代码时有问题。

@pQB 你好,我是来自英伟达的拉梅什。我们无法在本地复制此问题。当该列的值为空或无效时,就会出现这种错误。在您的情况下(“内存传输大小”列第6行的探查器数据文件“/home/myusername/development/qtspace/bin/temp_compute_profiler_0_0.csv”中出现错误),csv文件第6行的“内存传输大小”列的值为空或无效

如果您的工作目录中有“temp_compute_profiler_0_0.csv”以及命令行探查器生成的csv,您是否可以发送它。如果不可能,请检查第6行中该列的值(内存传输大小)


您是否使用Visual Profiler中的默认设置运行应用程序?你能试着运行你的应用程序禁用“内存传输大小”选项吗?要禁用此选项,请单击菜单“会话->会话设置…”,在会话设置对话框中单击“其他选项”选项卡,取消选中“内存传输大小”

应用程序将调用内核启动和内存传输。应用程序释放所有资源。应用程序正常退出(返回cudaThreadExit()。任何提示。谢谢你检查过csv文件了吗?它是正确的还是损坏的?您可以尝试在Excel或类似的工具中打开它。@Bart csv文件很好。我可以用OpenOffice Calc或任何文本编辑器打开它。谢谢值得注意的是,CUDA可视分析器是基于Qt构建的。是否可以尝试使用CUDA 4.0来验证这种情况是否仍然存在?如果是这样,我建议您提交一份NVIDIA错误报告(您需要加入CUDA)。我已向CUDA visual profiler团队发送了一个指向此问题的链接,以便他们可以进行调查。感谢您的回答,但遗憾的是,它不起作用:(.CUDA Visual Profiler会生成相同的错误。好的,这说明您的QT安装或CUDA安装有问题。您能用CUDA、GPU、OS、QT和编译器版本的确切细节更新您的问题吗?只有通过排除过程才能找到根本原因。关于QT版本,Qt Creator基于Qt 4.7.1(64位)。无论如何,我在控制台中尝试了你的示例。感谢你的努力!我昨晚在家里用8500GT尝试了你的示例,也用linux 64位和CUDA 3.2(我现在不记得驱动程序版本了)。CUDA Visual Profiler再次失败,但如果我从命令行生成csv文件,我可以将其导入Visual Profiler(这在GTX480计算机上不起作用)。我已在家中将CUDA更新为4.0,但您的示例仍然失败:(我不知道为什么,但是libcuda.so.1指向/usr/lib/nvidia current/libcuda.so.1,而不是/usr/lib.Any thists?。谢谢。我在Visual Profiler中使用默认设置运行所有测试。Visual Profiler在错误消息后删除文件temp_compute_Profiler_0.csv。只有从1_0.csv到11_0.csv的文件在运行后保留在工作目录中。)错误。禁用“内存传输大小”选项仍会生成错误。我可以在“接受”错误消息之前保护该文件:).memtransfersize列为empry,是一种方法:memcpyHtoA。从命令行生成的文件比Visual Profiler文件简单。我可以使用什么电子邮件向您发送Visual Profiler和命令行文件?@pQB您可以使用'rgunjal@nvidia.com'以共享您的文件
#include <assert.h>

#define blocksize 16
#define HM (4096) 
#define WM (4096) 
#define WN (4096)
#define HN WM 
#define WP WN   
#define HP HM  
#define PTH WM
#define PTW HM

__global__ void nonsquare(float*M, float*N, float*P, int uWM,int uWN)
{
    __shared__ float MS[blocksize][blocksize];
    __shared__ float NS[blocksize][blocksize];

    int tx=threadIdx.x, ty=threadIdx.y, bx=blockIdx.x, by=blockIdx.y;
    int rowM=ty+by*blocksize;
    int colN=tx+bx*blocksize;
    float Pvalue=0;

    for(int m=0; m<uWM; m+=blocksize){
        MS[ty][tx]=M[rowM*uWM+(m+tx)] ;
        NS[ty][tx]=M[colN + uWN*(m+ty)];
        __syncthreads();
        for(int k=0;k<blocksize;k++)
            Pvalue+=MS[ty][k]*NS[k][tx];
        __syncthreads();
    }
    P[rowM*WP+colN]=Pvalue;
}

inline void gpuerrorchk(cudaError_t state)
{
    assert(state == cudaSuccess);
}

float cudamain(){

    cudaEvent_t evstart, evstop;
    cudaEventCreate(&evstart);
    cudaEventCreate(&evstop);

    float*M=(float*)malloc(sizeof(float)*HM*WM);
    float*N=(float*)malloc(sizeof(float)*HN*WN);

    for(int i=0;i<WM*HM;i++)
        M[i]=(float)i;
    for(int i=0;i<WN*HN;i++)
        N[i]=(float)i;

    float*P=(float*)malloc(sizeof(float)*HP*WP);

    float *Md,*Nd,*Pd;
    gpuerrorchk( cudaMalloc((void**)&Md,HM*WM*sizeof(float)) );
    gpuerrorchk( cudaMalloc((void**)&Nd,HN*WN*sizeof(float)) );
    gpuerrorchk( cudaMalloc((void**)&Pd,HP*WP*sizeof(float)) );

    gpuerrorchk( cudaMemcpy(Md,M,HM*WM*sizeof(float),cudaMemcpyHostToDevice) );
    gpuerrorchk( cudaMemcpy(Nd,N,HN*WN*sizeof(float),cudaMemcpyHostToDevice) );

    dim3 dimBlock(blocksize,blocksize);//(tile_width , tile_width);
    dim3 dimGrid(WN/dimBlock.x,HM/dimBlock.y);//(width/tile_width , width/tile_witdh);

    gpuerrorchk( cudaEventRecord(evstart,0) );

    nonsquare<<<dimGrid,dimBlock>>>(Md,Nd,Pd,WM, WN);
    gpuerrorchk( cudaPeekAtLastError() );

    gpuerrorchk( cudaEventRecord(evstop,0) );
    gpuerrorchk( cudaEventSynchronize(evstop) );
    float time;
    cudaEventElapsedTime(&time,evstart,evstop);

    gpuerrorchk( cudaMemcpy(P,Pd,WP*HP*sizeof(float),cudaMemcpyDeviceToHost) );

    cudaFree(Md);
    cudaFree(Nd);
    cudaFree(Pd);

    float gflops=(2.e-6*WM*WM*WM)/(time);

    cudaThreadExit();

    return gflops;

}
cuda:~$ nvcc -arch=sm_20 -c -o cudamain.o cudamain.cu 
cuda:~$ g++ -o qtprob -I/usr/include/qt4 qtprob.cc cudamain.o -L $CUDA_INSTALL_PATH/lib64 -lQtCore -lcuda -lcudart
cuda:~$ ldd qtprob
        linux-vdso.so.1 =>  (0x00007fff242c8000)
        libQtCore.so.4 => /opt/cuda-3.2/computeprof/bin/libQtCore.so.4 (0x00007fbe62344000)
        libcuda.so.1 => /usr/lib/libcuda.so.1 (0x00007fbe61a3d000)
        libcudart.so.3 => /opt/cuda-3.2/lib64/libcudart.so.3 (0x00007fbe617ef000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fbe614db000)
        libm.so.6 => /lib/libm.so.6 (0x00007fbe61258000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fbe61040000)
        libc.so.6 => /lib/libc.so.6 (0x00007fbe60cbd000)
        libz.so.1 => /lib/libz.so.1 (0x00007fbe60aa6000)
        libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0x00007fbe608a0000)
        libglib-2.0.so.0 => /lib/libglib-2.0.so.0 (0x00007fbe605c2000)
        librt.so.1 => /lib/librt.so.1 (0x00007fbe603ba000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x00007fbe6019c000)
        libdl.so.2 => /lib/libdl.so.2 (0x00007fbe5ff98000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fbe626c0000)
        libpcre.so.3 => /lib/libpcre.so.3 (0x00007fbe5fd69000)