CUDA编程学习(三)

我们知道一个grid包含多个block,而一个block又包含多个thread,下面将是如何进行下thread中的并行。

/**** Splot a block into parallel threads****/

_global_ void add(int *a, int *b, int *c)
{
    c[threadIdx.x] = a[threadIdx.x] + b[threadIdx.x];
}

#define N 512

int main()
{
    int *a, *b, *c;            //host copies of a, b, c
    int *d_a, *d_b, *d_c;    //device copies of a, b, c
    int size = N * sizeof(int);

    //Alloc space for device copies of a, b, c
    cudaMalloc((void **)&d_a, size);
    cudaMalloc((void **)&d_b, size);
    cudaMalloc((void **)&d_c, size);

    //Alloc space for host copies of a, b, c and setup input values
    a = (int *)malloc(size); random_ints(a, N);
    b = (int *)malloc(size); random_ints(b, N);
    c = (int *)malloc(size); 

    //Copy the data into device
    cudeMemcpy(d_a, a, size, cudaMemcpyHostToDevice);
    cudaMemcpy(d_b, b, size, cudaMemcpyHostToDevice);

    //Launch add() kernel on GPU with N blocks
    add<<<1,N>>>(d_a, d_b, d_c);

    //Copy result back to host
    cudaMemcpy(c, d_c, size, cudaMemcpyDeviceToHost);

    //Cleanup
    free(a); free(b); free(c);
    cudeFree(d_a); cudaFree(d_b); cudaFree(d_c);
    return 0;

}

/**** What‘s the function of random_ints****/
void random_ints(int* a, int N)
{
 int i;
 for (i = 0; i < N; ++i)
 a[i] = rand();
}

重点语句变化: grid下的 add<<<1,1>>>(d_a, d_b, d_c)  到block下的 add<<<N,1>>>(d_a, d_b, d_c); 最后到 thread下   add<<<1,N>>>(d_a, d_b, d_c);

时间: 2024-10-09 04:32:49

CUDA编程学习(三)的相关文章

CUDA编程学习相关

1. CUDA编程之快速入门:https://www.cnblogs.com/skyfsm/p/9673960.html 2. CUDA编程入门极简教程:https://blog.csdn.net/xiaohu2022/article/details/79599947 原文地址:https://www.cnblogs.com/White-xzx/p/11984804.html

cuda编程学习6——点积dot

__shared__ float cache[threadPerBlock];//声明共享内存缓冲区,__shared__ __syncthreads();//对线程块中的线程进行同步,只有都完成前面的任务才可以进行后面的 代码: /* ============================================================================ Name : dot.cu Author : can Version : Copyright : Your

cuda编程学习3——VectorSum

这个程序是把两个向量相加 add<<<N,1>>>(dev_a,dev_b,dev_c);//<N,1>,第一个参数N代表block的数量,第二个参数1代表每个block中thread的数量 tid=blockIdx.x;//blockIdx是一个内置变量,blockIdx.x代表这是一个2维索引 代码: /* ==========================================================================

cuda编程学习1——hello world!

将c程序最简单的hello world用cuda编写在GPU上执行,以下为代码: #include<iostream>using namespace std;__global__ void kernel(void)//__global__:cpu调用GPU执行{}int main(void){ kernel<<<1,1>>>();//启动1block 1thread cout<<"hello world!"<<en

cuda编程学习5——波纹ripple

/共有DIM×DIM个像素,每个像素对应一个线程dim3 blocks(DIM/16,DIM/16);//2维dim3 threads(16,16);//2维kernel<<<blocks,threads>>>(d->dev_bitmap,ticks); 代码: /* ============================================================================ Name : ripple.cu Autho

cuda编程学习4——Julia

书上的例子编译会有错误,修改一下行即可. __device__ cuComplex(float a,float b):r(a),i(b){} /* ============================================================================ Name : Julia-CUDA.cu Author : can Version : Copyright : Your copyright notice Description : CUDA co

CUDA编程学习(一)

/****c code****/ #include<stdio.h> int main() { printf("Hello world!\n); return 0; } /****CUDA code****/ _global_ void mykernel(void) { } int main() { mykernel<<<1,1>>>(); printf("Hello world!\n"); return 0; } 1: _gl

多线程编程学习三(线程间通信)

一.概要 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线程间的通信就是成为整体的必用方案之一.可以说,使线程进行通信后,系统之间的交互性会更强大,在大大提高cpu利用率的同时还会使程序员对各线程任务在处理过程中进行有效的把控和监督. 二.等待/通知机制 1."wait/notify"机制:等待/通知机制,wait使线程暂停运行,而notify 使暂停的线程继续运行.用一个厨师和服务员的交互来说明: (1) 服务员取到菜的时间取决于厨师,所以服务员就有“

CUDA编程学习(二)

将数据加载到GPU后,如何在grid下的block进行并行计算(一个grid包含多个block) /****How do we run code in parallel on the device****/ /****Use block****/ _global_ void add(int *a, int *b, int *c) { c[blockIdx.x] = a[blockIdx.x] + b[blockIdx.x]; } #define N 512 int main() { int *a