2012-11-14 27 views
8

Từ online tài liệu:cudaMemset() - nó có đặt byte hoặc số nguyên không?

cudaError_t cudaMemset (void * devPtr, int value, size_t count) 

Điền vào các ô các byte đếm đầu tiên của vùng nhớ được trỏ đến bởi devPtr với hằng số giá trị giá trị byte.

Tham số: devPtr - Con trỏ trỏ tới bộ nhớ điện thoại giá trị - giá trị để đặt cho mỗi byte của quy định bộ nhớ đếm - Kích thước trong byte thiết

Sự mô tả này không xuất hiện là đúng như:

int *dJunk; 
cudaMalloc((void**)&dJunk, 32*(sizeof(int)); 
cudaMemset(dJunk, 0x12, 32); 

sẽ đặt tất cả 32 số nguyên thành 0x12, không phải 0x12121212. (Int vs Byte)

Mô tả nói về việc thiết lập byte. Đếm và Giá trị được mô tả theo byte. Số lượng thông báo là loại size_t và giá trị là loại int. tức là Đặt kích thước byte thành giá trị int.

cudaMemset() không được đề cập trong hướng dẫn nâng cao. Tôi phải giả định hành vi mà tôi thấy là chính xác và tài liệu đó không tốt.

Có nguồn tài liệu nào tốt hơn không? (Ở đâu?)
Các loại khác có được hỗ trợ không? tức là float *dJunk; có hoạt động không? Khác?

Trả lời

13

Tài liệu chính xác và cách diễn giải của bạn về những gì cudaMemset không đúng. Hàm này thực sự thiết lập các giá trị byte. Ví dụ bạn đặt đầu tiên 32 byte-0x12, không phải tất cả 32 số nguyên để 0x12, tức là:

#include <cstdio> 

int main(void) 
{ 
    const int n = 32; 
    const size_t sz = size_t(n) * sizeof(int); 
    int *dJunk; 
    cudaMalloc((void**)&dJunk, sz); 
    cudaMemset(dJunk, 0, sz); 
    cudaMemset(dJunk, 0x12, 32); 

    int *Junk = new int[n]; 

    cudaMemcpy(Junk, dJunk, sz, cudaMemcpyDeviceToHost); 

    for(int i=0; i<n; i++) { 
     fprintf(stdout, "%d %x\n", i, Junk[i]); 
    } 

    cudaDeviceReset(); 
    return 0; 
} 

sản xuất

$ nvcc memset.cu 
$ ./a.out 

0 12121212 
1 12121212 
2 12121212 
3 12121212 
4 12121212 
5 12121212 
6 12121212 
7 12121212 
8 0 
9 0 
10 0 
11 0 
12 0 
13 0 
14 0 
15 0 
16 0 
17 0 
18 0 
19 0 
20 0 
21 0 
22 0 
23 0 
24 0 
25 0 
26 0 
27 0 
28 0 
29 0 
30 0 
31 0 

tức. tất cả 128 byte được đặt thành 0, sau đó 32 byte đầu tiên được đặt thành 0x12. Chính xác như được mô tả bằng tài liệu.

+0

Có, tôi đã xem kết quả của mình không chính xác. Hãy thử thay đổi cudaMemset (dJunk, 0x12, 32); tới cudaMemset (dJunk, 0x1234, 32); Nó xuất hiện cudaError_t cudaMemset (void * devPtr, int value, size_t count) nên là: cudaError_t cudaMemset (void * devPtr, giá trị char, size_t count) tức là VALUE là byte kích thước. Nó là một chút sai lầm để sử dụng kích thước int. (Chỉ cần chỉ ra điều đó.) – Doug

+0

@Doug: Tôi vẫn không chắc điểm của bạn là gì. Các tài liệu rất bạn trích dẫn trong câu hỏi của bạn rõ ràng nói rằng 'giá trị' được coi là một giá trị byte. Hàm này hoạt động giống với bộ nhớ C chuẩn, khác biệt duy nhất là giá trị byte được truyền trong LSB của từ 32 bit. Ngẫu nhiên, có một chức năng ghi nhớ 32 bit thực sự trong API trình điều khiển nếu đó là những gì bạn đang thực sự tìm kiếm. – talonmies

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