در این مبحث قصد جمع دو بردار با سایز 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 ثانیه در این محاسبه اندازه گیری شد.