You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.6 KiB
60 lines
1.6 KiB
8 years ago
|
#include <cuda_runtime.h>
|
||
8 years ago
|
#include <stdio.h>
|
||
8 years ago
|
#include "gtest/gtest.h"
|
||
|
|
||
8 years ago
|
#define CHECK_ERR(x) \
|
||
|
if (x != cudaSuccess) { \
|
||
|
fprintf(stderr, \
|
||
|
"%s in %s at line %d\n", \
|
||
|
cudaGetErrorString(err), \
|
||
|
__FILE__, \
|
||
|
__LINE__); \
|
||
|
exit(-1); \
|
||
8 years ago
|
}
|
||
8 years ago
|
|
||
8 years ago
|
__global__ void vecAdd(float *d_A, float *d_B, float *d_C, int n) {
|
||
8 years ago
|
int i = blockDim.x * blockIdx.x + threadIdx.x;
|
||
|
if (i < n) {
|
||
|
d_C[i] = d_A[i] + d_B[i];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TEST(Cuda, Equality) {
|
||
|
int n = 10;
|
||
|
// Memory allocation for h_A, h_B and h_C (in the host)
|
||
8 years ago
|
float h_A[10] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 0.0};
|
||
|
float h_B[10] = {0.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0};
|
||
8 years ago
|
float h_C[10];
|
||
|
float *d_A, *d_B, *d_C;
|
||
8 years ago
|
cudaError_t err;
|
||
8 years ago
|
// Memory allocation for d_A, d_B and d_C (in the device)
|
||
8 years ago
|
err = cudaMalloc((void **)&d_A, sizeof(float) * n);
|
||
8 years ago
|
CHECK_ERR(err);
|
||
|
|
||
8 years ago
|
err = cudaMalloc((void **)&d_B, sizeof(float) * n);
|
||
8 years ago
|
CHECK_ERR(err);
|
||
|
|
||
8 years ago
|
err = cudaMalloc((void **)&d_C, sizeof(float) * n);
|
||
8 years ago
|
CHECK_ERR(err);
|
||
8 years ago
|
|
||
8 years ago
|
// Copying memory to device
|
||
8 years ago
|
err = cudaMemcpy(d_A, h_A, sizeof(float) * n, cudaMemcpyHostToDevice);
|
||
8 years ago
|
CHECK_ERR(err);
|
||
|
|
||
8 years ago
|
err = cudaMemcpy(d_B, h_B, sizeof(float) * n, cudaMemcpyHostToDevice);
|
||
8 years ago
|
CHECK_ERR(err);
|
||
|
|
||
|
// Calling the kernel
|
||
8 years ago
|
vecAdd<<<ceil(n / 256.0), 256>>>(d_A, d_B, d_C, n);
|
||
8 years ago
|
|
||
|
// Copying results back to host
|
||
8 years ago
|
err = cudaMemcpy(h_C, d_C, sizeof(float) * n, cudaMemcpyDeviceToHost);
|
||
8 years ago
|
CHECK_ERR(err);
|
||
8 years ago
|
|
||
8 years ago
|
EXPECT_EQ(h_C[0], 1.0);
|
||
|
for (int i = 1; i < n - 1; ++i) {
|
||
8 years ago
|
EXPECT_EQ(h_C[i], 11.0);
|
||
|
}
|
||
8 years ago
|
EXPECT_EQ(h_C[9], 1.0);
|
||
8 years ago
|
}
|