相关疑难解决方法(0)

为什么cudaMalloc()使用指针指针?

例如, cudaMalloc((void**)&device_array, num_bytes);

之前已经过这个问题,回复是"因为cudaMalloc返回错误代码",但是我没有得到它 - 什么有双指针与返回错误代码有什么关系?为什么一个简单的指针不能完成这项工作?

如果我写

cudaError_t catch_status;
catch_status = cudaMalloc((void**)&device_array, num_bytes);
Run Code Online (Sandbox Code Playgroud)

错误代码将被放入catch_status,并返回一个指向分配的GPU内存的简单指针就足够了,不应该吗?

c c++ pointers cuda

43
推荐指数
3
解决办法
8676
查看次数

为什么此声明取消引用编译器特定的类型标记指针警告?

我已经阅读 有关Stack Overflow RE的各种文章 :取消引用类型标记的指针错误。我的理解是,该错误本质上是编译器警告,它警告通过不同类型的指针访问对象的危险(尽管似乎为产生了例外),这是可以理解且合理的警告。 char*

我的问题特定于以下代码:为什么将指针的地址强制转换void**为此警告的合格字符(通过导致错误-Werror)?

而且,此代码针对多个目标体系结构进行了编译,只有其中一种会生成警告/错误-这是否暗示它合法地是特定于编译器版本的缺陷?

// main.c
#include <stdlib.h>

typedef struct Foo
{
  int i;
} Foo;

void freeFunc( void** obj )
{
  if ( obj && * obj )
  {
    free( *obj );
    *obj = NULL;
  }
}

int main( int argc, char* argv[] )
{
  Foo* f = calloc( 1, sizeof( Foo ) );
  freeFunc( (void**)(&f) );

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果上述我的理解是正确的,a void**仍然只是一个指针,这应该是安全的。

没有不使用左值来解决此编译器特定警告/错误的解决方法?也就是说,我理解这以及为什么这可以解决问题,但是我想避免这种方法,因为我想利用 …

c pointers casting

34
推荐指数
3
解决办法
2342
查看次数

像(void**)和device_array这样的转换有什么问题?

关于使用的另一个问题有这个答案cudaMalloc((void**)&device_array, num_bytes),它void**用作输出参数而不是void*像标准那样传递一个返回值malloc.

它批评了NVIDIA的API并声明:

如(void**)和device_array中的转换是无效的C并导致未定义的行为.

并且已被多次投票(截至目前为8),所以我认为其中有一些道理.

我不明白在那里铸造有什么问题.

  • 什么是无效的C?
  • 在什么情况下会导致未定义的行为?

我所知道的是,它在没有警告的情况下进行编译,并按照预期的行为运行.但我对C达到标准规格水平并不了解.

c cuda

16
推荐指数
1
解决办法
330
查看次数

为什么有必要转换为void**(例如在cudaMalloc调用中)?

cudaMalloc()函数使用以下定义:

cudaMalloc ( 
  void ** devPtr, 
  size_t size)
Run Code Online (Sandbox Code Playgroud)

这里这里的响应很好地解释了为什么应该定义函数来接受指向指针的指针.

但是,我不太清楚为什么我们需要在调用函数类型为void**时输入我们提供的参数.例如,在函数调用中:

catch_status = cudaMalloc((void**)&device_array, num_bytes);
Run Code Online (Sandbox Code Playgroud)

呈现在这里.

据我了解,定义一个接受void类型的函数可以提供更大的灵活性.即看看cudaMalloc()函数的定义,我将其解释为它可以接受指向任何类型对象的指针.因此,为什么&device_array在调用函数时需要输入强制转换(在上面的例子中).(这种类型转换的语法在cudaMalloc()我在整个网络中看到的例子中似乎非常普遍).只要&device_array满足它是"指向任何类型数据的指针"的条件,就不足以(a)满足参数cudaMalloc()接受的函数定义和(b)完成我们的编程目标吗?

我在这里错过了什么?

c pointers cuda void-pointers

2
推荐指数
1
解决办法
1517
查看次数

第二个cudaMalloc之后的分段错误

我在第二个cudaMalloc之后获得了一个分段错误.

#include <cuda.h>
#include <cuda_runtime.h>

int main(){

  int n=16;

  float2* a;
  cudaMalloc((void **) a, n*sizeof(float2));
  float2* b;
  cudaMalloc((void **) b, n*sizeof(float2));

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我注释掉2个cudaMalloc中的任何一个,那么代码运行正常.

谢谢!

c cuda

0
推荐指数
1
解决办法
86
查看次数

标签 统计

c ×5

cuda ×4

pointers ×3

c++ ×1

casting ×1

void-pointers ×1