gpt4 book ai didi

Qt 和 CUDA VIsual Profiler 内存传输大小错误

转载 作者:行者123 更新时间:2023-12-04 15:26:41 25 4
gpt4 key购买 nike

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

Error in profiler data file '/home/myusername/development/qtspace/bin/temp_compute_profiler_0_0.csv' at line number 6 for column 'memory transfer size.



main.cpp 文件很简单
#include <QtCore/QCoreApplication> 
extern "C"
void runCudaPart();

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
runCudaPart();
return 0;
}

事实是,如果我删除“QCoreApplication a(argc, argv);”行 CUDA Visual Profiler 作为异常(exception)工作并显示所有结果。

如果我导出 CUDA_PROFILE=1 环境变量,我已经检查过 cuda_profile.log 是从命令行生成的。如果我导出 COMPUTE_PROFILE_CSV=1 变量,也会生成逗号分隔的文件,但是当我尝试导入该文件时 CUDA Visual Profiler 崩溃。

关于这个问题的任何提示?似乎与 CUDA 可视化分析器应用程序相关,而不是代码。

如果你想知道为什么我用 Qt 做了一个如此简单的 main.cpp 但没有使用 Qt :P 是我想在 future 改进框架以添加一个 GUI。

//CUDA、GPU、OS、QT和编译器版本的详细信息
  Device"GeForce GTX 480"
CUDA Driver Version: 3.20
CUDA Runtime Version: 3.20
CUDA Capability Major/Minor version number: 2.0
OS: ubuntu 10.04 LTS
QT_VERSION: 263682
QT_VERSION_STR: 4.6.2
gcc version 4.4.3
nvcc compilation tool, release 3.2, V0.2.122

我注意到问题出在 QCoreApplication 构造 .它对参数做了一些事情。如果我将该行修改为:
QCoreApplication a();

Visual Profiler 正常工作。很难知道发生了什么,以及这种变化在 future 是否会成为问题。任何提示?

关于 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;
}

和一个 cudamain()包含这个:
#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)

生成一个可执行文件,它可以在我想使用 CUDA 3.2 版本分析器运行它时无错误地进行多次分析。

我只能建议尝试我的重现案例,看看它是否有效。如果失败,那么可能您的 CUDA 或 QT 安装已损坏。如果它没有失败(我怀疑它不会失败),那么你要么是构建 QT 项目的方式有问题,要么是你自己运行的实际 CUDA 代码有问题。

关于Qt 和 CUDA VIsual Profiler 内存传输大小错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5793600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com