Skip to content

Instantly share code, notes, and snippets.

@genkuroki
Last active August 19, 2017 15:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save genkuroki/5a45a862a6cfcbc6a6f811ade90d66ec to your computer and use it in GitHub Desktop.
Save genkuroki/5a45a862a6cfcbc6a6f811ade90d66ec to your computer and use it in GitHub Desktop.
Julia/Test/minimal ccall example.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# http://perfectionatic.org/?p=470\n\nC_code= \"\"\"\n double mean(double a, double b) {\n return (a+b) / 2;\n }\n \"\"\"\n@show tmp=tempname()\nopen(`gcc -O3 -xc -shared -o $(tmp * \".\" * Libdl.dlext) -`, \"w\") do f\n print(f, C_code)\nend",
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": "tmp = tempname() = \"C:\\\\Users\\\\GENKUR~1\\\\AppData\\\\Local\\\\Temp\\\\jl_6581.tmp\"\n",
"name": "stdout"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "const Clib = tmp\nx=ccall((:mean,Clib),Float64,(Float64,Float64),2.0,5.0)",
"execution_count": 2,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 2,
"data": {
"text/plain": "3.5"
},
"metadata": {}
}
]
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "using BenchmarkTools",
"execution_count": 3,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "C_code= \"\"\"\n#include <time.h>\n#include <stdlib.h>\n\ndouble findpi(unsigned long n){\n double x,y;\n srand((unsigned)time(NULL));\n double R = (double) RAND_MAX;\n unsigned long count = 0;\n for(unsigned long j=0; j < n; j++){\n x = ((double) rand())/R;\n y = ((double) rand())/R;\n if(x*x + y*y <= 1){\n count++;\n }\n }\n return ((double) 4.0)*((double) count)/((double) n);\n}\n\"\"\"\n\n@show tmp=tempname()\n\nopen(`gcc -O3 -xc -shared -o $(tmp * \".\" * Libdl.dlext) -`, \"w\") do f\n print(f, C_code)\nend",
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"text": "tmp = tempname() = \"C:\\\\Users\\\\GENKUR~1\\\\AppData\\\\Local\\\\Temp\\\\jl_711A.tmp\"\n",
"name": "stdout"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "const findpi_gcc_rand_lib = tmp\nfindpi_gcc_rand(n::Int64) = ccall((:findpi, findpi_gcc_rand_lib), Float64, (Int64,), n)\nfindpi_gcc_rand(10^5)",
"execution_count": 5,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 5,
"data": {
"text/plain": "3.133"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "@btime findpi_gcc_rand(10^8)",
"execution_count": 6,
"outputs": [
{
"output_type": "stream",
"text": " 2.565 s (0 allocations: 0 bytes)\n",
"name": "stdout"
},
{
"output_type": "execute_result",
"execution_count": 6,
"data": {
"text/plain": "3.14169596"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "function findpi(n)\n s = 0.0\n for k in 1:n\n s += ifelse(rand()^2+rand()^2 ≤ 1, 1.0, 0.0)\n end\n return 4.0 * s / n\nend\nfindpi(10^5)",
"execution_count": 7,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 7,
"data": {
"text/plain": "3.14844"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "@btime findpi(10^8)",
"execution_count": 8,
"outputs": [
{
"output_type": "stream",
"text": " 391.461 ms (0 allocations: 0 bytes)\n",
"name": "stdout"
},
{
"output_type": "execute_result",
"execution_count": 8,
"data": {
"text/plain": "3.14135516"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "C_code= \"\"\"\n#include <time.h>\n#include <stdlib.h>\n\ndouble findpi(unsigned long n){\n unsigned long x,y;\n srand((unsigned)time(NULL));\n double RR = (unsigned long) RAND_MAX*RAND_MAX;\n unsigned long count = 0;\n for(unsigned long j=0; j < n; j++){\n x = (unsigned long) rand();\n y = (unsigned long) rand();\n if(x*x + y*y <= RR){\n count++;\n }\n }\n return ((double) 4.0)*((double) count)/((double) n);\n}\n\"\"\"\n\n@show tmp=tempname()\n\nopen(`gcc -O3 -xc -shared -o $(tmp * \".\" * Libdl.dlext) -`, \"w\") do f\n print(f, C_code)\nend",
"execution_count": 9,
"outputs": [
{
"output_type": "stream",
"text": "tmp = tempname() = \"C:\\\\Users\\\\GENKUR~1\\\\AppData\\\\Local\\\\Temp\\\\jl_F0CB.tmp\"\n",
"name": "stdout"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "const findpi_gcc_rand_int_lib = tmp\nfindpi_gcc_rand_int(n::Int64) = ccall((:findpi, findpi_gcc_rand_int_lib), Float64, (Int64,), n)\nfindpi_gcc_rand_int(10^5)",
"execution_count": 10,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 10,
"data": {
"text/plain": "3.14456"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "@btime findpi_gcc_rand_int(10^8)",
"execution_count": 11,
"outputs": [
{
"output_type": "stream",
"text": " 1.895 s (0 allocations: 0 bytes)\n",
"name": "stdout"
},
{
"output_type": "execute_result",
"execution_count": 11,
"data": {
"text/plain": "3.1414802"
},
"metadata": {}
}
]
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
}
],
"metadata": {
"kernelspec": {
"name": "julia-0.6",
"display_name": "Julia 0.6.0",
"language": "julia"
},
"language_info": {
"file_extension": ".jl",
"name": "julia",
"mimetype": "application/julia",
"version": "0.6.0"
},
"toc": {
"threshold": 4,
"number_sections": true,
"toc_cell": false,
"toc_window_display": false,
"toc_section_display": "block",
"sideBar": true,
"navigate_menu": true,
"moveMenuLeft": true,
"widenNotebook": false,
"colors": {
"hover_highlight": "#DAA520",
"selected_highlight": "#FFD700",
"running_highlight": "#FF0000",
"wrapper_background": "#FFFFFF",
"sidebar_border": "#EEEEEE",
"navigate_text": "#333333",
"navigate_num": "#000000"
},
"nav_menu": {
"height": "12px",
"width": "252px"
}
},
"gist": {
"id": "5a45a862a6cfcbc6a6f811ade90d66ec",
"data": {
"description": "Julia/Test/minimal ccall example.ipynb",
"public": true
}
},
"_draft": {
"nbviewer_url": "https://gist.github.com/5a45a862a6cfcbc6a6f811ade90d66ec"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment