2011-12-15 25 views
6

Chương trình đơn giản sau đây không bao giờ thoát nếu cuộc gọi cudaMalloc được thực thi. Bình luận chỉ là cudaMalloc làm cho nó thoát ra bình thường.Chương trình điều khiển đơn giản sẽ không thoát nếu cudaMalloc được gọi là

#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); 
} 

Điều này đang chạy trên Windows 7, trình điều khiển CUDA 4.1, thời gian chạy CUDA 3.2. Tôi đã theo dõi sự trở lại từ chính thông qua CRT đến ExitProcess(), từ đó nó không bao giờ trả về (như mong đợi) nhưng quá trình không bao giờ kết thúc. Từ VS2008 tôi có thể ngừng gỡ lỗi OK. Từ dòng lệnh, tôi phải giết cửa sổ giao diện điều khiển.

đầu ra chương trình:

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

tôi đã cố gắng làm cho số lượng phân bổ quá lớn nên cudaMalloc sẽ thất bại. Nó đã làm và báo cáo một lỗi, nhưng chương trình vẫn sẽ không thoát. Vì vậy, nó dường như đã làm với chỉ đơn thuần là gọi cudaMalloc, không phải là sự tồn tại của bộ nhớ được phân bổ.

Mọi ý tưởng về những gì đang diễn ra ở đây?

EDIT: Tôi đã sai trong câu thứ hai - tôi phải loại bỏ cả cudaMalloc và cudaFree để có được chương trình để thoát. Rời một trong hai nguyên nhân gây treo máy.

EDIT: Mặc dù có nhiều tham chiếu đến thực tế là các phiên bản trình điều khiển CUDA tương thích ngược, sự cố này đã biến mất khi tôi hoàn nguyên trình điều khiển về V3.2.

+0

Bạn phải khớp với phiên bản trình điều khiển và thời gian chạy theo như tôi biết. – jmsu

+0

AFAIK, trình điều khiển thường tương thích ngược. Chúng tôi có một số lượng đáng kể mã phức tạp hơn hoạt động tốt. –

+0

Đó là lý do tại sao tôi không đặt câu trả lời là ... Tôi không chắc chắn về nó. Tôi sẽ nói rằng vấn đề là nếu cudaMalloc thất bại bạn không thể sử dụng cudaFree nhưng bạn nói rằng để lại hoặc là một trong những nguyên nhân treo lên. Tôi sẽ loại bỏ các cudaFree một trong hai cách hoặc thực hiện nó có điều kiện. Có thể thử một cudaDeviceReset() trước khi trở về? – jmsu

Trả lời

1

Dường như bạn đang trộn API trình điều khiển (cuInit) với API thời gian chạy (cudaMalloc).

Tôi không biết liệu có điều gì xảy ra hay không (hoặc xảy ra) phía sau hậu trường, nhưng một điều bạn có thể thử là xóa cuInit và xem điều gì sẽ xảy ra.

+0

Tôi đã nhận xét điều đó - không thay đổi. –

Các vấn đề liên quan