【发布时间】: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 **)强制转换它,当然,您仍然需要获取基指针的地址,因为该函数需要一个指向指针的指针。