核函数内动态分配的内存如何复制回host端?

  • 1 replies
  • 173 views
核函数内动态分配的内存如何复制回host端?
« 于: 六月 18, 2019, 04:55:17 pm »
请问一下各位,小弟初学cuda,现在想在cuda核函数内动态分配内存并添加元素,然后复制回host端,然后我写了一段代码进行测试,如
程序代码: [选择]
__global__ void test_image_kernel2(int* test_vector2)
{
unsigned int x = blockDim.x * blockIdx.x + threadIdx.x;
unsigned int y = blockDim.y * blockIdx.y + threadIdx.y;
test_vector2 = (int*)malloc(10 * sizeof(int));
if (x == 1 && y == 1)
{
for (int i = 0; i < 10; i++)
{
test_vector2[i] = i;
}
}
__syncthreads();
}

int *test_vector2=NULL;
test_image_kernel2 << <grid, block >> > (test_vector2);
int* h_vector = NULL;
h_vector = (int*)malloc(10 * sizeof(int));
cudaMemcpy(h_vector, test_vector2, 10 * sizeof(int), cudaMemcpyDeviceToHost);
for (int i = 0; i < 10; i++)
{
printf("diaonima is:%d\n", h_vector[i]);
}
可是我发现并没有正常复制数据到host端,是不是核函数里动态分配的内存并正常使用cudaMemcpy()来复制?另外有什么办法可以实现该功能,希望各位[名词2]不吝赐教!

Re: 核函数内动态分配的内存如何复制回host端?
« 回复 #1 于: 六月 18, 2019, 08:42:58 pm »
请问一下各位,小弟初学cuda,现在想在cuda核函数内动态分配内存并添加元素,然后复制回host端,然后我写了一段代码进行测试,如
程序代码: [选择]
__global__ void test_image_kernel2(int* test_vector2)
{
unsigned int x = blockDim.x * blockIdx.x + threadIdx.x;
unsigned int y = blockDim.y * blockIdx.y + threadIdx.y;
test_vector2 = (int*)malloc(10 * sizeof(int));
if (x == 1 && y == 1)
{
for (int i = 0; i < 10; i++)
{
test_vector2[i] = i;
}
}
__syncthreads();
}

int *test_vector2=NULL;
test_image_kernel2 << <grid, block >> > (test_vector2);
int* h_vector = NULL;
h_vector = (int*)malloc(10 * sizeof(int));
cudaMemcpy(h_vector, test_vector2, 10 * sizeof(int), cudaMemcpyDeviceToHost);
for (int i = 0; i < 10; i++)
{
printf("diaonima is:%d\n", h_vector[i]);
}
可是我发现并没有正常复制数据到host端,是不是核函数里动态分配的内存并正常使用cudaMemcpy()来复制?另外有什么办法可以实现该功能,希望各位[名词2]不吝赐教!

楼主你好,你的代码存在多处BUG:
(1)改变kernel的参数,并不会影响host上的对应变量。你在host的stack上定义的test_vector2,作为参数给了kernel,无论kernel是否改变它,均不会影响host上的同名的变量。

实际上,你可以将kernel参数改一个名字,你会(例如从test_vector2改名成test_vector3)发现同样会通过编译,这说明实际上并不是同一个东西。

(2)你试图在多个线程中分配,并试图写入到同名变量,则最多只有1个线程会成功(在不考虑刚才的1点的情况下,而考虑刚才的(1)点,没有线程会成功),此时其他的所有分配均将泄漏掉。

感谢来访。