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