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ố incx
và incy
và documentation 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ôngcublasSetVector()
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?
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