新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

OpenCL Visutal Studio (その1)

手元の nVidia (k600) で OpenCL を試してみる。
まずは VS2013 もインストール。適当に Windows update しておく。CUDA のインストーラが VS を自動認識するので先に必要。
次に NVIDIA CUDA 6.5 のインストール。まぎらわしいのだが、OpenCL を試すにも CUDA にの環境が必要。むかしは SDK やら VisualStudio 用のプラグインなどなどを個別にインストールする必要があったが、いまは CUDA 6.5 をインストールすればよいらしい。Nsight (VisualStudio 用のプラグイン?) もこれではいる。NVIDIA の Web では NVDIA tool kit 6.5 という名前になっている。

CUDA Toolkit

でプロジェクトで Win32 のコンソールを選ぶ。

インクルードディレクトリを追加

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include

ライブラリディレクトリを追加

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\lib/Win32

lib を追加

OpenCL.lib

プログラムを書く

#include "stdafx.h"
#include <stdio.h>
#include <CL/cl.h>
#include <assert.h>

#pragma comment(lib, "OpenCL.lib")

#define BUF_SIZE 1024
static char buffer[BUF_SIZE + 1];

int _tmain(int argc, _TCHAR* argv[])
{
	cl_platform_id platforms[10];
	cl_uint num_platforms;
	cl_int status;

	status = clGetPlatformIDs(sizeof(platforms) / sizeof(*platforms), platforms, &num_platforms);
	assert(status == CL_SUCCESS);

	printf("Number of platform(s) : %d\n", num_platforms);
	for (int i = 0; i < (int)num_platforms; ++i) {
		cl_platform_id &id(platforms[i]);

		status = clGetPlatformInfo(id, CL_PLATFORM_PROFILE, BUF_SIZE, buffer, NULL);
		assert(status == CL_SUCCESS);
		printf("version :%s\n", buffer);

		status = clGetPlatformInfo(id, CL_PLATFORM_NAME, BUF_SIZE, buffer, NULL);
		assert(status == CL_SUCCESS);
		printf("name :%s\n", buffer);

		status = clGetPlatformInfo(id, CL_PLATFORM_VENDOR, BUF_SIZE, buffer, NULL);
		assert(status == CL_SUCCESS);
		printf("vendor :%s\n", buffer);

		status = clGetPlatformInfo(id, CL_PLATFORM_EXTENSIONS, BUF_SIZE, buffer, NULL);
		assert(status == CL_SUCCESS);
		printf("extensions :%s\n", buffer);
	}

	return 0;
}

コンパイル実行。

Number of platform(s) : 1
version :FULL_PROFILE
name :NVIDIA CUDA
vendor :NVIDIA Corporation
extensions :cl_khr_byte_addressable_store cl_khr_icd cl_khr_gl_sharing cl_nv_d3d
9_sharing cl_nv_d3d10_sharing cl_khr_d3d10_sharing cl_nv_d3d11_sharing cl_nv_com
piler_options cl_nv_device_attribute_query cl_nv_pragma_unroll

ここでは Win32 にしてしまった、あとで構成マネージャで x64 にした。これを間違えると _clGetPlatformInfo などが見つからないというエラーになる。(未解決のシンボル _clgetplatformInfo などのエラー)