aboutsummaryrefslogtreecommitdiff
path: root/bsmad_test/bsmad_test.cu
diff options
context:
space:
mode:
authorNegar <[email protected]>2017-11-12 19:03:27 -0800
committernegargoli93 <[email protected]>2017-11-12 19:34:51 -0800
commit7c9b838bca837a3ccea5ea30f53c1cbd8e35252c (patch)
treed3f41701c2e81c91daf1f5a5d3a3269455a31b67 /bsmad_test/bsmad_test.cu
parent8735428754d1bb944400922982f41f867f2f9b9c (diff)
Fix latency bug
Diffstat (limited to 'bsmad_test/bsmad_test.cu')
-rw-r--r--bsmad_test/bsmad_test.cu76
1 files changed, 76 insertions, 0 deletions
diff --git a/bsmad_test/bsmad_test.cu b/bsmad_test/bsmad_test.cu
new file mode 100644
index 0000000..9be6e74
--- /dev/null
+++ b/bsmad_test/bsmad_test.cu
@@ -0,0 +1,76 @@
+#include <stdio.h>
+#define SIZE 1024
+#define THREADS_PER_BLOCK 32
+#define PART_THREADS 1
+#define NUM_BLOCKS 1
+#define I_PREC 4
+#define O_PREC 4
+
+__global__ void vector_add(int* A, int* B, int* res)
+{
+ int tid = threadIdx.x + blockIdx.x * blockDim.x;
+ res[tid] = A[tid] + B[tid];
+}
+
+__global__ void digit_serial_mad(unsigned* i_buffer, unsigned* i_synapse, unsigned* result, unsigned* accum)
+{
+ unsigned tid = threadIdx.x + blockIdx.x * blockDim.x;
+ unsigned buffer;
+ unsigned synapse;
+ if (tid < PART_THREADS)
+ {
+ buffer = i_buffer[tid];
+ synapse = i_synapse[tid];
+ }
+
+ asm("/*");
+ asm("CPTX_BEGIN");
+ asm("bsmad.s32 %0, %1, %2, %3, %4, %5, %6, %7, %8;" : "=r"(result[tid]) :
+ "r"(I_PREC), "r"(O_PREC), "r"(buffer), "r"(0), "r"(0), "r"(0), "r"(synapse), "r"(accum[tid]));
+ asm("CPTX_END");
+ asm("*/");
+}
+
+int main()
+{
+ // host values
+ unsigned *buffer = (unsigned*)malloc(sizeof(unsigned));
+ unsigned *synapse = (unsigned*)malloc(sizeof(unsigned));
+ unsigned *result = (unsigned*)calloc(THREADS_PER_BLOCK, sizeof(unsigned));
+ unsigned *accum = (unsigned*)calloc(THREADS_PER_BLOCK, sizeof(unsigned));
+ // assign host values
+ *buffer = 0x5000003F;
+ *synapse = 0x00000002;
+ *accum = 0;
+ // device pointers
+ unsigned *d_buffer;
+ unsigned *d_synapse;
+ unsigned *d_result;
+ unsigned *d_accum;
+ // allocate device memory
+ cudaMalloc(&d_buffer, sizeof(unsigned));
+ cudaMalloc(&d_synapse, sizeof(unsigned));
+ cudaMalloc(&d_result, sizeof(unsigned));
+ cudaMalloc(&d_accum, sizeof(unsigned));
+ // copy data to device
+ cudaMemcpy(d_buffer, buffer, sizeof(unsigned), cudaMemcpyHostToDevice);
+ cudaMemcpy(d_synapse, synapse, sizeof(unsigned), cudaMemcpyHostToDevice);
+ cudaMemcpy(d_result, result, sizeof(unsigned) * THREADS_PER_BLOCK, cudaMemcpyHostToDevice);
+ cudaMemcpy(d_accum, accum, sizeof(unsigned) * THREADS_PER_BLOCK, cudaMemcpyHostToDevice);
+ // call kernel
+ digit_serial_mad<<<NUM_BLOCKS, THREADS_PER_BLOCK>>>(d_buffer, d_synapse, d_result, d_accum);
+ // copy data back to host
+ cudaMemcpy(result, d_result, sizeof(unsigned) * THREADS_PER_BLOCK, cudaMemcpyDeviceToHost);
+ // read out result
+ printf("Result: %#X\n", result[0]);
+ // clean up device memory
+ cudaFree(d_buffer);
+ cudaFree(d_synapse);
+ cudaFree(d_result);
+ cudaFree(d_accum);
+ // clean up host memory
+ free(buffer);
+ free(synapse);
+ free(result);
+ free(accum);
+}