目次: OpenCL
独自アクセラレータのテンプレート実装pocl/lib/CL/devices/accelはデバイスタイプがCUSTOMになっているのが最大の難関ですが、その他にも色々問題があります。
最初に遭遇する問題はデバイス数を取得する処理のエラー処理が間違っていることです。現状のコードだとちょっと特殊な環境変数を渡さないと動きません。
// pocl/lib/CL/devices/devices.c
static unsigned device_count[POCL_NUM_DEVICE_TYPES];
...
cl_int
pocl_init_devices ()
{
...
/* Init operations */
for (i = 0; i < POCL_NUM_DEVICE_TYPES; ++i)
{
...
/* Probe and add the result to the number of probed devices */
assert(pocl_device_ops[i].probe);
device_count[i] = pocl_device_ops[i].probe(&pocl_device_ops[i]); //★デバイス数を取得する★
pocl_num_devices += device_count[i];
}
...
dev_index = 0;
/* Init infos for each probed devices */
for (i = 0; i < POCL_NUM_DEVICE_TYPES; ++i)
{
if (pocl_devices_init_ops[i] == NULL)
continue;
str_toupper (dev_name, pocl_device_ops[i].device_name);
assert(pocl_device_ops[i].init);
for (j = 0; j < device_count[i]; ++j) //★デバイス数42億と誤解したまま処理しようとしてクラッシュする★
{
// pocl/lib/CL/devices/accel/accel.cc
unsigned int pocl_accel_probe(struct pocl_device_ops *ops) {
//★POCL_DEVICESという環境変数が見つからないとき、-1というエラー値を返す★
//★本来エラー値である -1だが、デバイス数として解釈され42億になってしまう★
int env_count = pocl_device_get_env_count(ops->device_name);
return env_count;
}
// pocl/lib/CL/devices/devices.c
/**
* Get the number of specified devices from environment
*/
int pocl_device_get_env_count(const char *dev_type)
{
const char *dev_env = getenv(POCL_DEVICES_ENV);
char *ptr, *saveptr = NULL, *tofree, *token;
unsigned int dev_count = 0;
if (dev_env == NULL)
{
return -1; //★ここにくる★
}
ptr = tofree = strdup(dev_env);
while ((token = strtok_r (ptr, " ", &saveptr)) != NULL)
{
if(strcmp(token, dev_type) == 0)
dev_count++;
ptr = NULL;
}
POCL_MEM_FREE(tofree);
return dev_count;
}
このような実装になっておりaccelのデバイス数が42億(!)と解釈されてしまい、42億回デバイスを列挙しようとしてクラッシュします。バグのような気がしますけど、サンプル実装ですのであまり文句を言っても仕方ありません。
環境変数POCL_DEVICES="pthread -1 CUDA -1 accel 1" のようにデバイス数を明示的に渡せば回避可能です。最終的にはpocl_accel_probe() が正しくデバイス数を返すような実装を追加する必要があるでしょうが、この場は環境変数で切り抜けます。
< | 2021 | > | ||||
<< | < | 06 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | - | - | - |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.15.
using GD bundled (2.1.0 compatible)(png support.)