Arrays cuda固定大小全局阵列
我认为可以在gpu上分配一个数组,例如Arrays cuda固定大小全局阵列,arrays,memory-management,cuda,Arrays,Memory Management,Cuda,我认为可以在gpu上分配一个数组,例如\uuuuuuu设备\uuuuuuuu设备\uuu数组[100]不使用Cudamaloc作为已知长度。但是当我运行下面的代码时,会显示一些不相关的数字。我检查了一本关于cuda的畅销书,书中的所有例子都使用了cudaMalloc。一个固定大小的数组可以这样使用,或者它必须与cudamaloc一起分配 __device__ int device_array[100]; __global__ void kernel() { device_array[
\uuuuuuu设备\uuuuuuuu设备\uuu数组[100]代码>不使用Cudamaloc作为已知长度。但是当我运行下面的代码时,会显示一些不相关的数字。我检查了一本关于cuda的畅销书,书中的所有例子都使用了cudaMalloc。一个固定大小的数组可以这样使用,或者它必须与cudamaloc一起分配
__device__ int device_array[100];
__global__ void kernel() {
device_array[blockIdx.x] = blockIdx.x;
}
void call_kernel( int *host_array ) {
kernel<<<100,1>>>();
cudaMemcpy( host_array, device_array, 100 * sizeof( int ), cudaMemcpyDeviceToHost );
}
int main() {
int host_array[100];
call_kernel( host_array );
for ( int i = 0; i < 100; i++ )
cout << host_array[i] << endl;
}
\uuuuu设备\uuuuuu内部设备\u阵列[100];
__全局无效内核(){
设备_数组[blockIdx.x]=blockIdx.x;
}
无效调用内核(int*主机数组){
内核();
cudaMemcpy(主机阵列、设备阵列、100*sizeof(int)、cudaMemcpyDeviceToHost);
}
int main(){
int主机_数组[100];
调用内核(主机数组);
对于(int i=0;i<100;i++)
正如Robert在评论中提到的,当访问主机上的\uuu设备\uuuu
符号时,必须使用cudaMemcpy
。因此,当前形式的cudaMemcpy
调用应该会给出一个“无效参数”的错误。如果要查看此内容,请尝试将cudaMemcpy
行更改为:
cudaError_t cuda_status = cudaMemcpy(...);
std::cout << cudaGetErrorString(cuda_status) << std::endl;
cudaMemcpyFromSymbol的签名为:
cudaError_t cudaMemcpyFromSymbol ( void* dst, const void* symbol, size_t count, size_t offset = 0, cudaMemcpyKind kind = cudaMemcpyDeviceToHost )
偏移量默认为0,内存复制方向默认为cudaMemcpyDeviceToHost
,因此在您的情况下,这些在技术上是可选的。所有这一切的主要好处是始终检查cuda调用的返回值,因为它们通常会引导您正确的方向。您的代码没有错误检查。很可能cudaMemcpy
调用失败,但您只是不知道,因为您没有检查返回状态。一旦您确认在运行时发生错误,问题的根源就会变得明显。此外,我们还很好地讨论了如何执行错误检查。如果您想以相同的方式从主机复制到设备,那么您将无法执行此操作函数“cudaMemcpyToSymbol”会更好地为您服务。我建议您在
cudaError_t cudaMemcpyFromSymbol ( void* dst, const void* symbol, size_t count, size_t offset = 0, cudaMemcpyKind kind = cudaMemcpyDeviceToHost )