【问题标题】:Why use double pointer in cuda malloc? [duplicate]为什么在 cuda malloc 中使用双指针? [复制]
【发布时间】:2017-08-09 19:50:11
【问题描述】:

首先我不明白如果我们必须使用双指针,那么为什么要创建一个普通指针然后使用 void** 强制转换它?为什么不首先创建一个双指针?

其次为什么我们必须传递一个指针来接受cudamalloc返回的指针?为什么我们不能直接使用 cudamalloc 返回的指针呢?

我完全理解 malloc 的工作原理。我还知道,与 malloc 不同,cuda 返回错误代码,因此指针作为引用传递。但除此之外我没有得到任何东西?

能否请您从头开始解释有关 cudamalloc 的所有内容?

#include <iostream> 
#include "book.h" 

global void add( int a, int b, int c ) 
{ *c = a + b; } 

int main( void ) 
{
int c; 
int *dev_c; 

cudaMalloc( (void**)&dev_c, sizeof(int)); 

add<<<1,1>>>( 2, 7, dev_c ); 

cudaMemcpy( &c, dev_c, sizeof(int), 
cudaMemcpyDeviceToHost );

printf( "2 + 7 = %d\n", c ); 

cudaFree( dev_c ); 

return 0;
 } 

【问题讨论】:

  • 你能在你的问题中举出例子吗?)?
  • 我稍后会调查。待命:)
  • 因为通过引用传递。这就是在 C 中通过引用传递模拟的方式,通过使用 address-of 运算符将指针传递给指针。
  • 在当前版本的 CUDA 中,您不需要使用 (void **) 强制转换它,当然,您仍然需要获取基指针的地址,因为该函数需要一个指向指针的指针。

标签: c cuda nvidia


【解决方案1】:

指针引用传递示例:

void my_allocate_function(void **ptr_to_ptr, size_t size)
{
    *ptr_to_ptr = malloc(size);
}

int main(void)
{
    int *ptr;
    my_allocate_function(&ptr, sizeof *ptr);  // Allocate space for a single int
}

如果您将ptr(在main 函数中)声明为“双指针”(即int **ptr)并在没有地址运算符的情况下传递它,那么my_allocate_function 将取消引用未初始化的指针并有未定义的行为

如果my_allocate_function 没有“通过引用”获取指针,那么它将修改一个局部变量,并且当函数返回时局部变量超出范围并且对它们的所有更改都将丢失。

有点“图形化”地看待它:

+------------+ +--------------+ | ptr_to_ptr | --> |主函数中的 ptr | --> ... +------------+ +--------------+

通过取消引用ptr_to_ptr,我们可以访问ptr_to_ptr 指向的位置(这是main 函数中的变量ptr),并修改存储在该位置的内容。

【讨论】:

  • #include #include "book.h" global void add( int a, int b, int c ) { *c = a + b ; } int main( void ) {int c;诠释 *dev_c; HANDLE_ERROR( cudaMalloc( (void*)&dev_c, sizeof(int) ) );添加>>( 2, 7, dev_c ); HANDLE_ERROR(cudaMemcpy(&c,dev_c,sizeof(int),cudaMemcpyDeviceToHost)); printf("2 + 7 = %d\n", c); cudaFree(dev_c);返回0; }
  • @chetanraina 如果您有实际的代码想知道,那么它可能是重要信息,应该在您的问题正文中,格式正确。所以请编辑你的问题。
  • @chetanraina 那么请耐心等待,直到您可以使用计算机。
  • 就是这样。现在你能不能一步一步地解释一下执行cudamalloc函数时到底发生了什么。我不担心另一部分。只是 cudamalloc 部分。
猜你喜欢
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 2011-12-20
  • 1970-01-01
  • 2020-12-10
  • 2013-09-18
  • 1970-01-01
相关资源
最近更新 更多