2014-06-09 12 views
7

tôi tự hỏi nếu có một sự khác biệt giữa:cublasSetVector() vs cudaMemcpy()

// cumalloc.c - Create a device on the device 
HOST float * cudamath_vector(const float * h_vector, const int m) 
{ 
    float *d_vector = NULL; 
    cudaError_t cudaStatus; 
    cublasStatus_t cublasStatus; 

    cudaStatus = cudaMalloc(&d_vector, sizeof(float) * m); 

    if(cudaStatus == cudaErrorMemoryAllocation) { 
    printf("ERROR: cumalloc.cu, cudamath_vector() : cudaErrorMemoryAllocation"); 
    return NULL; 
    } 


    /* THIS: */ cublasSetVector(m, sizeof(*d_vector), h_vector, 1, d_vector, 1); 

    /* OR THAT: */ cudaMemcpy(d_vector, h_vector, sizeof(float) * m, cudaMemcpyHostToDevice); 


    return d_vector; 
} 

cublasSetVector() có hai đối số incxincydocumentation says:

Khoảng cách lưu trữ giữa các yếu tố liên tiếp được đưa ra bởi incx cho vector nguồn x và cho vectơ đích y.

Trong NVIDIA forum ai đó nói:

iona_me: "incx và incy được những bước tiến đo bằng phao nổi."

Vì vậy, điều này có nghĩa là cho incx = incy = 1 tất cả các yếu tố của một float[] sẽ là sizeof(float) được thiết kế và cho incx = incy = 2 sẽ có một phần chèn sizeof(float) giữa mỗi phần tử?

  • Trừ những hai tham số và cublasHandle - không cublasSetVector() bất cứ điều gì khác những gì cudaMalloc() không làm gì?
  • Có thể lưu để chuyển một véc tơ/ma trận là không được tạo bằng chức năng cublas*() tương ứng của chúng cho các hàm CUBLAS khác để thao tác chúng không?
+2

Miễn là tôi biết, 'cublasSetVector()' sẽ gọi nội bộ 'cudaMemcpy' hoặc phiên bản 2D của nó cho các bản sao được quét. Vì vậy, tôi nghĩ rằng không có vấn đề ngay cả khi các mảng được thiết lập đã được tạo ra bởi một 'cudaMalloc'. Trên thực tế, tôi đã trao đổi hướng dẫn cuBLAS và không phải cuBLAS mà không có vấn đề gì trong quá khứ gần đây. – JackOLantern

Trả lời

4

Có một bình luận trong một thread of the NVIDIA Forum cung cấp bởi Massimiliano Fatica xác nhận tuyên bố của tôi trong những nhận xét ở trên (hoặc, nói rằng nó tốt hơn, nhận xét của tôi có nguồn gốc do thu hồi là đã đọc bài tôi liên kết với). Đặc biệt

cublasSetVector, cubblasGetVector, cublasSetMatrix, cublasGetMatrix là giấy gói mỏng xung quanh cudaMemcpycudaMemcpy2D. Do đó, không có sự khác biệt đáng kể về hiệu suất được mong đợi giữa hai bộ chức năng sao chép.

Theo đó, bạn có thể chuyển an toàn bất kỳ mảng nào được tạo bởi cudaMalloc làm đầu vào cho cublasSetVector.

Liên quan đến những bước tiến, có lẽ có một in lầm trong hướng dẫn (như của CUDA 6.0), trong đó nói rằng

Khoảng cách lưu trữ giữa các yếu tố liên tiếp được đưa ra bởi incx cho nguồn vector x và cho vector đích y.

nhưng lẽ cần được đọc như

Khoảng cách lưu trữ giữa các yếu tố liên tiếp được đưa ra bởi incx cho nguồn vector xincy cho vector điểm đến y.

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