CUDA Programming Applications

وبلاگ آموزشی کودا

CUDA Programming Applications

وبلاگ آموزشی کودا

جمع دوبردار با برنامه نویسی cuda و زمان گیری

در این مبحث قصد جمع دو بردار با سایز 10240 و محاسبه ی زمان آن  را  داریم.  در این جا از 10 بلاک به ترد 1024 در هربلاک  استفاده شده است.

در ادامه مطلب کد برنامه اورده شده است:

  

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>
#include <chrono>
#include <iostream>


__global__ void addArray(int* a, int* b, int* c)
{
    int i = threadIdx.x + blockIdx.x*blockDim.x;

    c[i] = a[i] + b[i];

}

int main()
{
    using namespace std;
    using namespace std::chrono;
    auto StartTime = steady_clock::now();

    const int count = 10240;
    const int size = count * sizeof(int);
    int ha[count];
    int hb[count];
    int hc[count];

    for (int i = 0; i < count; i++){
        ha[i] = rand();
    }

    for (int i = 0; i < count; i++){
        hb[i] = rand();
    }

    int *da, *db, *dc;
    cudaMalloc(&da, size);
    cudaMalloc(&db, size);
    cudaMalloc(&dc, size);
    cudaMemcpy(da, ha, size, cudaMemcpyHostToDevice);
    cudaMemcpy(db, hb, size, cudaMemcpyHostToDevice);


    dim3 blockpergrid(ceil(size / 1024));// (6, 1);
    dim3 threadperblock = 1024;

    addArray << <blockpergrid, threadperblock >> > (da, db, dc);
    //auto DurationTime = std::chrono::duration_cast<std::chrono::nanoseconds>(steady_clock::now() - StartTime);
    cudaMemcpy(hc, dc, size, cudaMemcpyDeviceToHost);


    int co = 0;
    for (int i = 0; i < count; ++i){
        printf("%d\n", hc[i]);

        if (hc[i] != 0){
            co++;
        }
    }
    printf("\nCount is:   %d", co);

    auto DurationTime = std::chrono::duration_cast<std::chrono::microseconds>(steady_clock::now() - StartTime);
    std::cout << "\n sum: " << DurationTime.count() << "    NanoS \n";



    getchar();
    return 0;
}


خروجی برنامه بالا در شکل زیر آمده است:




زمان محاسبه 4.6 ثانیه در این محاسبه اندازه گیری شد.

نظرات 0 + ارسال نظر
امکان ثبت نظر جدید برای این مطلب وجود ندارد.