Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在cuda malloc中使用双指针?_C_Cuda_Nvidia - Fatal编程技术网

为什么在cuda malloc中使用双指针?

为什么在cuda malloc中使用双指针?,c,cuda,nvidia,C,Cuda,Nvidia,首先,我不明白,如果我们必须使用双指针,那么为什么要创建一个普通指针,然后使用void**强制转换它呢?为什么不首先创建一个双指针呢 其次,为什么我们必须传递一个指针来接受Cudamaloc返回的指针?为什么我们不能直接使用Cudamaloc返回的指针 我完全理解malloc的工作原理。我还了解到,与malloc不同,cuda返回错误代码,因此指针作为引用传递。但是除了这个我什么都没有 你能从头解释一下库达马洛克的一切吗 #include <iostream> #include "

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

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

我完全理解malloc的工作原理。我还了解到,与malloc不同,cuda返回错误代码,因此指针作为引用传递。但是除了这个我什么都没有

你能从头解释一下库达马洛克的一切吗

#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;
 } 
#包括
#包括“book.h”
全局无效添加(整数a、整数b、整数c)
{*c=a+b;}
内部主(空)
{
INTC;
国际发展中心;
Cudamaloc((void**)和dev_c,sizeof(int));
增加(2、7、发展委员会);
cudaMemcpy&c、dev_c、sizeof(int),
cudaMemcpyDeviceToHost);
printf(“2+7=%d\n”,c);
cudaFree(开发中心);
返回0;
} 

指针按引用传递示例:

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_函数
将取消对未初始化指针的引用,并具有未定义的行为

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

有点“图形化”地这样看:

+------------+ +--------------------------+ | ptr_to_ptr | --> | ptr in the main function | --> ... +------------+ +--------------------------+ +------------+ +--------------------------+ |ptr|u to|ptr|-->|ptr在主函数|-->中。。。 +------------+ +--------------------------+
通过取消对
ptr\u to_ptr
的引用,我们可以访问
ptr\u to_ptr
指向的位置(这是
main
函数中的变量
ptr
),并修改该位置中存储的内容。

您能在问题中举例吗?我以后再调查。备用:)因为通过引用传递。在C语言中,通过使用操作符的地址传递指向指针的指针,就可以模拟按引用传递。在CUDA的当前版本中,您不需要使用
(void**)
强制转换它,当然,您仍然需要获取基指针的地址,因为函数需要指向指针的指针。#include#include“book.h”全局void add(inta,intb,intc){*c=a+b;}intmain(void){intc;int*dev_c;HANDLE_错误(cudamaloc((void*)&dev_c,sizeof(int));add(2,7,dev_c);HANDLE_错误(cudaMemcpy(&c,dev_c,sizeof(int),cudaMemcpyDeviceToHost));printf(“2+7=%d\n”,c);cudaFree(dev_c);返回0;}@chetanraina如果你有你想知道的实际代码,那么很可能是重要的信息,应该在你的问题正文中,格式正确。所以请编辑你的问题。@chetanraina那么请耐心等待,直到你可以访问计算机。就是这样。现在你能一步一步地解释到底发生了什么吗当cudamaloc函数被执行时。我不担心其他部分。只是cudamaloc部分。