我主要有一个2D矩阵.我想从主机转移到设备.你能告诉我如何为它分配内存并将其传输到设备内存吗?
#define N 5
__global__ void kernel(int a[N][N]){
}
int main(void){
int a[N][N];
cudaMalloc(?);
cudaMemcpy(?);
kernel<<<N,N>>>(?);
}
Run Code Online (Sandbox Code Playgroud)
也许这样的事情是你真正想到的:
#define N 5
__global__ void kernel(int *a)
{
// Thread indexing within Grid - note these are
// in column major order.
int tidx = threadIdx.x + blockIdx.x * blockDim.x;
int tidy = threadIdx.y + blockIdx.y * blockDim.y;
// a_ij = a[i][j], where a is in row major order
int a_ij = a[tidy + tidx*N];
}
int main(void)
{
int a[N][N], *a_device;
const size_t a_size = sizeof(int) * size_t(N*N);
cudaMalloc((void **)&a_device, a_size);
cudaMemcpy(a_device, a, a_size, cudaMemcpyHostToDevice);
kernel<<<N,N>>>(a_device);
}
Run Code Online (Sandbox Code Playgroud)
您可能错过的一点是,当您静态声明这样的数组时A[N][N],它实际上只是一行主要有序的线性内存.编译器在发出代码之间a[i][j]和a[j + i*N]发出代码时自动进行转换 .在GPU上,您必须使用第二种访问形式来读取从主机复制的内存.
| 归档时间: |
|
| 查看次数: |
5418 次 |
| 最近记录: |