Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.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指针/阵列内存分配和使用 我上周开始CUDA,因为我必须将现有的C++程序转换成CUDA来进行研究。p>_C++_Cuda - Fatal编程技术网

基本CUDA指针/阵列内存分配和使用 我上周开始CUDA,因为我必须将现有的C++程序转换成CUDA来进行研究。p>

基本CUDA指针/阵列内存分配和使用 我上周开始CUDA,因为我必须将现有的C++程序转换成CUDA来进行研究。p>,c++,cuda,C++,Cuda,这是一个基本的例子从CUDA的例子书,我推荐给任何人谁想要学习CUDA 有人能解释一下如何用“dev_c”(一个空指针)分配GPU内存吗 HANDLE_ERROR( cudaMalloc( (void**)&dev_c, N * sizeof(int) ) ); 然后,在调用函数“add”时不传递任何“dev_c”值,而是将*c作为全局函数中的数组处理,并从函数中写入?当它没有被定义为数组时,为什么这是可能的 add<<<N,1>>>( dev_a,

这是一个基本的例子从CUDA的例子书,我推荐给任何人谁想要学习CUDA

有人能解释一下如何用“dev_c”(一个空指针)分配GPU内存吗

HANDLE_ERROR( cudaMalloc( (void**)&dev_c, N * sizeof(int) ) );
然后,在调用函数“add”时不传递任何“dev_c”值,而是将*c作为全局函数中的数组处理,并从函数中写入?当它没有被定义为数组时,为什么这是可能的

add<<<N,1>>>( dev_a, dev_b, dev_c );
我希望我能很好地解释我自己,但请随时提出任何后续问题。C和CUDA都是新手,所以要友善:D

完整代码如下:

#include "book.h"

#define N   1000

__global__ void add( int *a, int *b, int *c ) {
    int tid = blockIdx.x;    // this thread handles the data at its thread id
    if (tid < N)
        c[tid] = a[tid] + b[tid];
}

int main( void ) {
    int a[N], b[N], c[N];
    int *dev_a, *dev_b, *dev_c;

    // allocate the memory on the GPU
    HANDLE_ERROR( cudaMalloc( (void**)&dev_a, N * sizeof(int) ) );
    HANDLE_ERROR( cudaMalloc( (void**)&dev_b, N * sizeof(int) ) );
    HANDLE_ERROR( cudaMalloc( (void**)&dev_c, N * sizeof(int) ) );

    // fill the arrays 'a' and 'b' on the CPU
    for (int i=0; i<N; i++) {
        a[i] = -i;
        b[i] = i * i;
    }

    // copy the arrays 'a' and 'b' to the GPU
    HANDLE_ERROR( cudaMemcpy( dev_a, a, N * sizeof(int),
                                cudaMemcpyHostToDevice ) );
    HANDLE_ERROR( cudaMemcpy( dev_b, b, N * sizeof(int),
                                cudaMemcpyHostToDevice ) );

    add<<<N,1>>>( dev_a, dev_b, dev_c );

    // copy the array 'c' back from the GPU to the CPU
    HANDLE_ERROR( cudaMemcpy( c, dev_c, N * sizeof(int),
                                cudaMemcpyDeviceToHost ) );

    // display the results
    for (int i=0; i<N; i++) {
        printf( "%d + %d = %d\n", a[i], b[i], c[i] );
    }

    // free the memory allocated on the GPU
    HANDLE_ERROR( cudaFree( dev_a ) );
    HANDLE_ERROR( cudaFree( dev_b ) );
    HANDLE_ERROR( cudaFree( dev_c ) );

    return 0;
}
#包括“book.h”
#定义N 1000
__全局无效添加(int*a、int*b、int*c){
int tid=blockIdx.x;//此线程在其线程id处处理数据
如果(tid对于(int i=0;i<p>)在一个问题的空间里不可能教CUDA。我会尝试回答你的问题,但是你应该利用一些资源。如果你不知道C或C++,这将特别困难,因为典型的CUDA编程依赖于这些。
您可能需要参加一些介绍性网络研讨会,例如:

使用CUDA C的GPU计算–简介(2010) 介绍使用CUDA C进行GPU计算的基础知识。概念将通过代码示例演练进行说明。无需具备GPU计算经验

使用CUDA C的GPU计算–高级1(2010) 一级优化技术,如全局内存优化和处理器利用率。将使用实际代码示例说明这些概念

现在回答你的问题:

有人能解释一下如何用“dev_c”(一个空指针)分配GPU内存吗

HANDLE_ERROR( cudaMalloc( (void**)&dev_c, N * sizeof(int) ) );
dev_c
一开始是一个空指针。但是
cudamaloc
函数根据传递给它的大小,建立一个指向该分配的指针,并将该指针存储到
dev_c
指针中。它可以这样做,因为我们是
dev_c
,而不是实际的指针本身

然后,在调用函数“add”时不传递任何“dev_c”值,而是将*c视为全局函数中的一个数组,并从函数中写入它?如果它在任何地方都没有定义为数组,为什么会这样呢

add<<<N,1>>>( dev_a, dev_b, dev_c );
在C语言中,一个指针(即
dev_C
是什么)可以指向单个值或值数组。指针本身不包含有关它指向的数据量的信息。由于
dev_c
正在存储结果,并且它已经由前面的
cudamaloc
函数正确初始化,因此我们可以使用它将操作结果存储在内核中l、
dev_c
实际上指的是
int
的(一个数组)存储区域,其大小由传递给前面的
cudamaloc
函数的
N*sizeof(int)
给出

最后,在执行以下加法时,术语c[0]、c[1]等究竟保存在哪里

c[tid] = a[tid] + b[tid];
在c中,当我们有这样一个函数定义时:

void my_function(int *c){...}
这意味着函数中的语句可以引用名为
c
的变量,就像它是指向一个或多个
int
值(单个值或值数组,从
c
指向的位置开始存储)的指针一样

当我们调用该函数时,我们可以使用另一个名为参数的变量,用于名为
c
的函数参数,如下所示:

int my_ints[32];
my_function(my_ints);
现在,在
my_函数
中,只要引用参数
c
,它就会使用(指针)
my_ints
给出的参数值


同样的概念也适用于cuda函数(内核)及其参数和参数。

谢谢,这现在更有意义了!那么这是否意味着(数组)c中的值会保存在GPU全局内存中,而GPU全局内存是在Cudamaloc((void**)和dev_c,N*sizeof(int))中分配的?是的。
c
的内核用法存储在为
c
参数传递的参数中,在本例中为
dev_c
。并且
dev_c
之前已使用设备全局内存中分配的大小设置。这本质上是c行为,与CUDA几乎没有任何关系。明白了!再次感谢您的支持详细的回复,非常感谢!