ScmObj Scm_TLSAccept(ScmTLS* t, int fd) { #if defined(GAUCHE_USE_AXTLS) context_check(t, "accept"); if (t->conn) Scm_SysError("attempt to connect already-connected TLS %S", t); t->conn = ssl_server_new(t->ctx, fd); #endif /*GAUCHE_USE_AXTLS*/ return SCM_OBJ(t); }
ScmObj Scm_TLSConnect(ScmTLS* t, int fd) { #if defined(GAUCHE_USE_AXTLS) context_check(t, "connect"); if (t->conn) Scm_SysError("attempt to connect already-connected TLS %S", t); t->conn = ssl_client_new(t->ctx, fd, 0, 0); if (SSL_OK != ssl_handshake_status(t->conn)) { Scm_SysError("TLS handshake failed"); } #endif /*GAUCHE_USE_AXTLS*/ return SCM_OBJ(t); }
ScmObj Scm_TLSRead(ScmTLS* t) { #if defined(GAUCHE_USE_AXTLS) context_check(t, "read"); close_check(t, "read"); int r; uint8_t* buf; while ((r = ssl_read(t->conn, &buf)) == SSL_OK); if (r < 0) Scm_SysError("ssl_read() failed"); return Scm_MakeString((char*) buf, r, r, SCM_STRING_INCOMPLETE); #else /*!GAUCHE_USE_AXTLS*/ return SCM_FALSE; #endif /*!GAUCHE_USE_AXTLS*/ }
ScmObj Scm_TLSWrite(ScmTLS* t, ScmObj msg) { #if defined(GAUCHE_USE_AXTLS) context_check(t, "write"); close_check(t, "write"); int r; u_int size; const uint8_t* cmsg = get_message_body(msg, &size); if ((r = ssl_write(t->conn, cmsg, size)) < 0) { Scm_SysError("ssl_write() failed"); } return SCM_MAKE_INT(r); #else /*!GAUCHE_USE_AXTLS*/ return SCM_FALSE; #endif /*!GAUCHE_USE_AXTLS*/ }
int main (int argc, char **argv) { cublasStatus_t s; cublasHandle_t h; CUcontext pctx; CUresult r; int i; const int N = 256; float *h_X, *h_Y1, *h_Y2; float *d_X,*d_Y; float alpha = 2.0f; float error_norm; float ref_norm; /* Test 4 - OpenACC creates, cuBLAS shares. */ acc_set_device_num (0, acc_device_nvidia); r = cuCtxGetCurrent (&pctx); if (r != CUDA_SUCCESS) { fprintf (stderr, "cuCtxGetCurrent failed: %d\n", r); exit (EXIT_FAILURE); } h_X = (float *) malloc (N * sizeof (float)); if (h_X == 0) { fprintf (stderr, "malloc failed: for h_X\n"); exit (EXIT_FAILURE); } h_Y1 = (float *) malloc (N * sizeof (float)); if (h_Y1 == 0) { fprintf (stderr, "malloc failed: for h_Y1\n"); exit (EXIT_FAILURE); } h_Y2 = (float *) malloc (N * sizeof (float)); if (h_Y2 == 0) { fprintf (stderr, "malloc failed: for h_Y2\n"); exit (EXIT_FAILURE); } for (i = 0; i < N; i++) { h_X[i] = rand () / (float) RAND_MAX; h_Y2[i] = h_Y1[i] = rand () / (float) RAND_MAX; } #pragma acc parallel copyin (h_X[0:N]), copy (h_Y2[0:N]) copy (alpha) { int i; for (i = 0; i < N; i++) { h_Y2[i] = alpha * h_X[i] + h_Y2[i]; } } r = cuCtxGetCurrent (&pctx); if (r != CUDA_SUCCESS) { fprintf (stderr, "cuCtxGetCurrent failed: %d\n", r); exit (EXIT_FAILURE); } d_X = (float *) acc_copyin (&h_X[0], N * sizeof (float)); if (d_X == NULL) { fprintf (stderr, "copyin error h_Y1\n"); exit (EXIT_FAILURE); } d_Y = (float *) acc_copyin (&h_Y1[0], N * sizeof (float)); if (d_Y == NULL) { fprintf (stderr, "copyin error h_Y1\n"); exit (EXIT_FAILURE); } s = cublasCreate (&h); if (s != CUBLAS_STATUS_SUCCESS) { fprintf (stderr, "cublasCreate failed: %d\n", s); exit (EXIT_FAILURE); } context_check (pctx); s = cublasSaxpy (h, N, &alpha, d_X, 1, d_Y, 1); if (s != CUBLAS_STATUS_SUCCESS) { fprintf (stderr, "cublasSaxpy failed: %d\n", s); exit (EXIT_FAILURE); } context_check (pctx); acc_memcpy_from_device (&h_Y1[0], d_Y, N * sizeof (float)); context_check (pctx); error_norm = 0; ref_norm = 0; for (i = 0; i < N; ++i) { float diff; diff = h_Y1[i] - h_Y2[i]; error_norm += diff * diff; ref_norm += h_Y2[i] * h_Y2[i]; } error_norm = (float) sqrt ((double) error_norm); ref_norm = (float) sqrt ((double) ref_norm); if ((fabs (ref_norm) < 1e-7) || ((error_norm / ref_norm) >= 1e-6f)) { fprintf (stderr, "math error\n"); exit (EXIT_FAILURE); } free (h_X); free (h_Y1); free (h_Y2); acc_free (d_X); acc_free (d_Y); context_check (pctx); s = cublasDestroy (h); if (s != CUBLAS_STATUS_SUCCESS) { fprintf (stderr, "cublasDestroy failed: %d\n", s); exit (EXIT_FAILURE); } context_check (pctx); acc_shutdown (acc_device_nvidia); r = cuCtxGetCurrent (&pctx); if (r != CUDA_SUCCESS) { fprintf (stderr, "cuCtxGetCurrent failed: %d\n", r); exit (EXIT_FAILURE); } if (pctx) { fprintf (stderr, "Unexpected context\n"); exit (EXIT_FAILURE); } return EXIT_SUCCESS; }