Ошибка Qt и CUDA VIsual Profiler в размере передаваемой памяти - PullRequest
6 голосов
/ 26 апреля 2011

Я подготовил файл .pro для использования Qt и CUDA на Linux-машине (64 бита).Когда я запускаю приложение в профилировщике CUDA, приложение запускается 12 раз, но перед тем, как представить результаты, я получаю следующую ошибку:

Ошибка в файле данных профилировщика '/ home / myusername / development / qtspace /bin / temp_compute_profiler_0_0.csv 'в строке номер 6 для столбца' объем передачи памяти.

Файл 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 работает как исключение и показывает все результаты.

Я проверил, что cuda_profile.log генерируется из командной строки, если я экспортирую переменную среды CUDA_PROFILE = 1.Файл, разделенный запятыми, также создается, если я экспортирую переменную COMPUTE_PROFILE_CSV = 1 , но происходит сбой визуального профилировщика CUDA при попытке импортировать этот файл.

Есть ли какие-либо подсказки по этой проблеме?Кажется, что-то связано с приложением CUDA visual Profiler, а не с кодом.

Если вам интересно, почему я сделал такой простой main.cpp с Qt, но без использования Qt: P, я хотел бы улучшить фреймворкв будущем, чтобы добавить графический интерфейс.

// подробности о версиях 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 будет работать как исключение.Трудно понять, что происходит, и будет ли это изменение проблемой в будущем.Любые подсказки?

Что касается конструкции QCoreApplication, пример также работает, если я вызываю часть cuda перед QCoreApplication.

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

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 01 июля 2011

@ PQB Привет, я Рамеш из NVIDIA. Мы не могли воспроизвести эту проблему локально здесь. Этот тип ошибки возникает, когда значение для этого столбца является пустым или недействительным. В вашем случае (ошибка в файле данных профилировщика '/home/myusername/development/qtspace/bin/temp_compute_profiler_0_0.csv' в строке номер 6 для столбца «размер передачи памяти») значение для столбца «размер передачи памяти» либо пустое, либо недействительное для строки № 6 в CSV-файле.

Можете ли вы отправить «temp_compute_profiler_0_0.csv», если он присутствует в вашем рабочем каталоге и csv, сгенерированный профилировщиком командной строки. Если это невозможно, проверьте, какое значение вы получаете для этого столбца (объем памяти) в строке №. 6.

Запускаете ли вы приложение с настройками по умолчанию в Visual Profiler? Можете ли вы попробовать запустить приложение, отключив параметр «объем памяти»? Чтобы отключить эту опцию, нажмите меню «Сеанс-> Настройки сеанса…», в ​​диалоговом окне настроек сеанса нажмите вкладку «Другие параметры», снимите флажок «Объем передачи памяти»

2 голосов
/ 29 июня 2011

Я не могу воспроизвести это с CUDA 3.2 и QT4 в 64-битной системе Ubuntu 10.04LTS. Я взял это главное:

#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, который вы запускаете сами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...