将单个变量的值从主机复制到设备变量
Copying value of single variable from Host to Device variable
我想知道如何正确地将主机变量的值直接复制到设备变量
我尝试使用 cudaMemcpy 但没有任何特殊结果。我得到的只是垃圾或什么都没有。
Pixel_GPU* Device_Array{};
//__device__ size_t size{};
size_t size{};
cudaMalloc((void**)& Device_Array, global_size * sizeof(Pixel_GPU));
cudaMalloc((void**) size, sizeof(size_t));
cudaMemset(&size, 0, sizeof(size_t));
cudaMemcpy(Device_Array, Host_Array, global_size * sizeof(Pixel_GPU), HostToDevice);
cudaMemcpy(&size, &global_size, sizeof(size_t), HostToDevice);
_STD cout << global_size << NEW_LINE;
Show_Device_Variables <<<2, 1>>>(&size);
cudaFree(&size);
cudaFree(Device_Array);
free(Host_Array);
例如:global_size 的大小可能达到 1 000 000 。 Size_t可以接上,但是"size"的大小(设备数组大小)还未初始化
您传递的 size
的(不确定)值被重新解释为指向 cudaMalloc
的指针。
这不是一个好主意; CUDA 可能会在任意位置写入其新分配的设备内存的地址。
如果你幸运的话,它会崩溃,但如果你不幸运,它可能就像什么都没发生一样。
所有 cudaMalloc
调用都遵循相同的模式:
T* p; // This is going to be a device pointer.
cudaMalloc((void**) &p, ... // Pass the address of the pointer.
所以你应该
size_t* size{};
cudaMalloc((void**) &size, sizeof(size_t));
cudaMemset(size, 0, sizeof(size_t));
// ...
cudaMemcpy(size, &global_size, sizeof(size_t), HostToDevice);
Show_Device_Variables <<<2, 1>>>(size);
cudaFree(size);
我想知道如何正确地将主机变量的值直接复制到设备变量
我尝试使用 cudaMemcpy 但没有任何特殊结果。我得到的只是垃圾或什么都没有。
Pixel_GPU* Device_Array{};
//__device__ size_t size{};
size_t size{};
cudaMalloc((void**)& Device_Array, global_size * sizeof(Pixel_GPU));
cudaMalloc((void**) size, sizeof(size_t));
cudaMemset(&size, 0, sizeof(size_t));
cudaMemcpy(Device_Array, Host_Array, global_size * sizeof(Pixel_GPU), HostToDevice);
cudaMemcpy(&size, &global_size, sizeof(size_t), HostToDevice);
_STD cout << global_size << NEW_LINE;
Show_Device_Variables <<<2, 1>>>(&size);
cudaFree(&size);
cudaFree(Device_Array);
free(Host_Array);
例如:global_size 的大小可能达到 1 000 000 。 Size_t可以接上,但是"size"的大小(设备数组大小)还未初始化
您传递的 size
的(不确定)值被重新解释为指向 cudaMalloc
的指针。
这不是一个好主意; CUDA 可能会在任意位置写入其新分配的设备内存的地址。
如果你幸运的话,它会崩溃,但如果你不幸运,它可能就像什么都没发生一样。
所有 cudaMalloc
调用都遵循相同的模式:
T* p; // This is going to be a device pointer.
cudaMalloc((void**) &p, ... // Pass the address of the pointer.
所以你应该
size_t* size{};
cudaMalloc((void**) &size, sizeof(size_t));
cudaMemset(size, 0, sizeof(size_t));
// ...
cudaMemcpy(size, &global_size, sizeof(size_t), HostToDevice);
Show_Device_Variables <<<2, 1>>>(size);
cudaFree(size);