Простая консольная программа не завершится, если вызывается cudaMalloc - PullRequest
6 голосов
/ 16 декабря 2011

Следующая простая программа никогда не завершается, если выполняется вызов cudaMalloc.Комментирование только cudaMalloc приводит к его нормальному завершению.

#include <iostream>
using std::cout;
using std::cin;

#include "cuda.h"
#include "cutil_inline.h"

void PrintCudaVersion(int version, const char *name)
{
    int versionMaj = version / 1000;
    int versionMin = (version - (versionMaj * 1000)) / 10;
    cout << "CUDA " << name << " version: " << versionMaj << "." << versionMin << "\n";
}

void ReportCudaVersions()
{
    int version = 0;
    cudaDriverGetVersion(&version);
    PrintCudaVersion(version, "Driver");

    cudaRuntimeGetVersion(&version);
    PrintCudaVersion(version, "Runtime");
}

int main(int argc, char **argv)
{
    //CUresult r = cuInit(0);                 << These two lines were in original post
    //cout << "Init result: " << r << "\n";   << but have no effect on the problem

    ReportCudaVersions();

    void *ptr = NULL;
    cudaError_t err = cudaSuccess;
    err = cudaMalloc(&ptr, 1024*1024);
    cout << "cudaMalloc returned: " << err << "  ptr: " << ptr << "\n";
    err = cudaFree(ptr);
    cout << "cudaFree returned: " << err << "\n";

    return(0);
 }

Это работает в Windows 7, драйвере CUDA 4.1, среде выполнения CUDA 3.2.Я проследил возврат из main через CRT в ExitProcess (), из которого он никогда не возвращается (как и ожидалось), но процесс также никогда не заканчивается.С VS2008 я могу прекратить отладку ОК.Из командной строки я должен закрыть окно консоли.

Вывод программы:

Init result: 0
CUDA Driver version: 4.1
CUDA Runtime version: 3.2
cudaMalloc returned: 0  ptr: 00210000
cudaFree returned: 0

Я попытался сделать объем выделения настолько большим, что cudaMalloc завершится ошибкой.Он сделал и сообщил об ошибке, но программа по-прежнему не будет выходить.Так что это, очевидно, связано с простым вызовом cudaMalloc, а не с наличием выделенной памяти.

Есть идеи относительно того, что здесь происходит?

РЕДАКТИРОВАТЬ: я был неправ во втором предложении -Я должен удалить и cudaMalloc, и cudaFree, чтобы заставить программу выйти.Оставление одного из них приводит к зависанию.

РЕДАКТИРОВАТЬ. Хотя существует много ссылок на тот факт, что версии драйверов CUDA имеют обратную совместимость, эта проблема исчезла, когда я вернул драйвер к V3.2.

1 Ответ

1 голос
/ 16 декабря 2011

Похоже, вы смешиваете API драйвера (cuInit) с API времени выполнения (cudaMalloc).

Я не знаю, происходит ли что-нибудь смешное (или должно произойти) засцен, но одну вещь, которую вы можете попробовать, это удалить cuInit и посмотреть, что произойдет.

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