仮眠プログラマーのつぶやき

自分がプログラムやっていて、思いついたことをつぶやいていきます。

自作ゲームやツール、ソースなどを公開しております。
①ポンコツ自動車シュライシュラー
DOWNLOAD
②流体力学ソース付き
汚いほうDOWNLOAD
綺麗なほうDOWNLOAD
③ミニスタヲズ
DOWNLOAD
④地下鉄でGO
DOWNLOAD
⑤ババドン
DOWNLOAD
⑥圧縮拳(ツール)
DOWNLOAD
⑦複写拳
DOWNLOAD
⑧布シミュレーション
DOWNLOAD
⑨minecraft巨大電卓地形データ
DOWNLOAD
⑩フリュードランダー
デジゲー博頒布α版
DOWNLOAD
⑪パズドラルート解析GPGPU版
DOWNLOAD
⑫ゲーム「流体de月面着陸」
DOWNLOAD

PyOpenCL

PyOpneCLでデバイス情報取得

今度はデバイス情報取得
公開されているPyOpenCLサンプルを改変
# -*- coding: utf-8 -*-
# OpenCLで使用できるデバイスを列挙して、デバイス情報を取得&表示
import pyopencl as cl
from pyopencl import device_type
from pyopencl import device_local_mem_type


for platform in cl.get_platforms():
    for device in platform.get_devices():
        print('''
        PLATFORM                 = {}
        VENDOR                   = {}
        Name                     = {}
        Type                     = {}
        OPENCL_C_VERSION         = {}
        GLOBAL_MEM_SIZE          = {}
        Max Compute Units        = {}
        Max Work Group Size      = {}
        Max Work Item Dimensions = {}
        Max Work Item Size       = {}
        Local Mem Size           = {}
        Local Mem Type           = {}
        '''.format(
            device.platform,
            device.vendor,
            device.name,
            device_type.to_string(device.type),
            device.opencl_c_version,
            device.global_mem_size,
            device.max_compute_units,
            device.max_work_group_size,
            device.max_work_item_dimensions,
            device.max_work_item_sizes,
            device.local_mem_size,
            device_local_mem_type.to_string(device.local_mem_type)
        ))


自分の環境では

PC1
構成 CPU:core i7 3820、GPU:HD 7970、RX 480

認識プラットフォーム1つ
認識デバイスは3つ(上記3つ)

PC2
構成 CPU:core i7 4710MQ、GPU:intel(R) HD Graphics 4600、GTX 860M

認識プラットフォーム2つ
認識デバイスはプラットフォーム1でcore i7 4710MQとintel(R) HD Graphics 4600
プラットフォーム2でGTX 860Mを認識した。



環境によっては同じデバイスを複数のプラットフォームから認識される可能性もあると思う

PyOpenCLで1+1の計算

多分これがPyOpneCLで計算する一番最小構成
# -*- coding: utf-8 -*-
import numpy as np
import pyopencl as cl

ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)

cl_mem_a=cl.Buffer(ctx,cl.mem_flags.READ_WRITE,4)
cl_mem_b=cl.Buffer(ctx,cl.mem_flags.READ_WRITE,4)
cl_mem_c=cl.Buffer(ctx,cl.mem_flags.READ_WRITE,4)
a = np.array([1])
b = np.array([1])
c = np.empty(1, dtype = np.int32)

cl.enqueue_write_buffer(queue,mem=cl_mem_a,hostbuf=a)
cl.enqueue_write_buffer(queue,mem=cl_mem_b,hostbuf=b)

global_work_size=(1,1)
local_work_size=(1,1)

prg_string="""
__kernel void Onlyadd(__global int* A,__global int* B,__global int* C)
{
   C[0] = A[0] + B[0] ;
}
"""
program=cl.Program(ctx,prg_string).build()
kernel_Onlyadd=cl.Kernel(program,"Onlyadd")
kernel_Onlyadd.set_arg(0,cl_mem_a)
kernel_Onlyadd.set_arg(1,cl_mem_b)
kernel_Onlyadd.set_arg(2,cl_mem_c)

cl.enqueue_nd_range_kernel(queue,kernel_Onlyadd,global_work_size,local_work_size)
cl.enqueue_read_buffer(queue,mem=cl_mem_c,hostbuf=c)
print(c)


デバイス(GPU等)上に要素1の配列でA,B,Cを確保。
C=A+B
をやってホストに結果を戻して表示

PyOpenCLでHellow World

PyOpenCLはじめました
python 3でnumpy、PyOpenCLのインストールが最低必要

# -*- coding: utf-8 -*-
import numpy as np
import pyopencl as cl

ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)
data_mem=cl.Buffer(ctx,cl.mem_flags.READ_WRITE,32)
hostdata=np.empty(32, dtype = np.int8)
global_work_size=(1,1)
local_work_size=(1,1)

prg_string="""
__kernel void hello(__global char* string)
{
   string[0] = 'H';
   string[1] = 'e';
   string[2] = 'l';
   string[3] = 'l';
   string[4] = 'o';
   string[5] = ',';
   string[6] = ' ';
   string[7] = 'W';
   string[8] = 'o';
   string[9] = 'r';
   string[10] = 'l';
   string[11] = 'd';
   string[12] = '!';
}
"""
program=cl.Program(ctx,prg_string).build()
kernel_h=cl.Kernel(program,"hello")
kernel_h.set_arg(0,data_mem)
cl.enqueue_nd_range_kernel(queue,kernel_h,global_work_size,local_work_size)
cl.enqueue_read_buffer(queue,mem=data_mem,hostbuf=hostdata)
res_string=""
for i in range(len(hostdata)):
    res_string=res_string+(chr(hostdata[i]))
print(res_string)

はい
長過ぎる笑
むりくりOpenCLで文字列扱ってるから逆に難しくなってしまった
多分1+1=2の計算をやるほうが簡単
プロフィール

toropippi

記事検索
アクセスカウンター

    QRコード
    QRコード
    • ライブドアブログ