【发布时间】:2020-01-11 22:32:06
【问题描述】:
我正在尝试将源浮点数组(包含 1.0f)复制到 cuda 内核中的目标浮点数组(包含 2.0f)。我尝试了三种不同的使用方式:
- cudamemcpysync
- memcpy
- 直接复制 (dst[i] = src[i])
当我在内核执行后读取结果时,我发现当直接复制方法有效时,cudamemcpyasync 和 memcpy 都无法复制。
为什么 cudamemcpyasync 和 memcpy 方法失败了?
我正在使用 GTX TitanX(SM_52)。
编译使用:nvcc -arch=compute_52 main.cu
main.cu:
#include <stdio.h>
#include <iostream>
__global__
void cudamemcpy_inside_kernel(float *src, float *dst, int size)
{
int idx = blockIdx.x*blockDim.x + threadIdx.x;
if(idx < size){
// memcpy(dst +idx*sizeof(float), src + idx*sizeof(float), 1); // FAILS TO COPY
// cudaMemcpyAsync(dst +idx*sizeof(float), src + idx*sizeof(float), 1, cudaMemcpyDeviceToDevice); // FAILS TO COPY
// dst[idx] = src[idx]; // COPIES SUCCESSFULLY
}
}
int current = 0;
int UniqueNumber () { return ++current; }
int main(void)
{
int N = 1000;
float *x, *y, *d_x, *d_y;
x = (float*)malloc(N*sizeof(float));
y = (float*)malloc(N*sizeof(float));
cudaMalloc(&d_x, N*sizeof(float));
cudaMalloc(&d_y, N*sizeof(float));
for (int i = 0; i < N; i++) {
x[i] = 1.0f;
y[i] = 2.0f;
}
cudaMemcpy(d_x, x, N*sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(d_y, y, N*sizeof(float), cudaMemcpyHostToDevice);
// cudamemcpy_inside_kernel<<<(N+255)/256, 256>>>(d_x, d_y, N);
cudamemcpy_inside_kernel<<<2, 512>>>(d_x, d_y, N);
cudaDeviceSynchronize();
cudaMemcpy(y, d_y, N*sizeof(float), cudaMemcpyDeviceToHost);
cudaDeviceSynchronize();
for (int i = 0; i < N; i++)
printf(" %f\n", y[i]); // y[i] should have all 1.0f
}
【问题讨论】:
-
memcpy 和 cudaMemcpyAsync 的参数都不正确,这就是它们无法正常工作的原因