1

助けてください... opencl プログラムで、これらのエラーが発生します。「oclUtils.h」ヘッダー ファイルがありません。S0 プログラムに含めていません。これが私がこの問題を抱えている理由ですか?私もカーネルを送ります。これが理由である場合、oclUtils.h を使用せずにアトミック関数を使用するにはどうすればよいですか?

*"__kernel void BLAS_susdot_kernel(__global float *x,__global int *index,__global float        *y,const int n,__global float* dot_p)                    \n" \
"{                                                                                      \n" \
"    int block_x = get_group_id(0);                                                                     \n" \
"    int thread_x = get_local_id(0);                                                                    \n" \
"    int i = get_global_id(0);                                                                          \n" \
"    float dot_value, old = *dot_p;                                                                     \n" \
"    int warp_thread_id = i & (32-1);                                                                   \n" \
"    __local float tmp[512];                                                                                    \n" \
"    __local float share_dot_p;                                                                         \n" \
"    if(thread_x == 0)                          \n" \
"       share_dot_p = 0.0;                              \n" \
"    if (i < n)                                 \n" \
"   {                                        \n" \
"        tmp[i]= x[i]*y[index[i]];           \n" \
"        if(warp_thread_id <16 && (i+16)< n) \n" \
"            tmp[i]+=tmp[i+16];              \n" \
"        if(warp_thread_id <8 && (i+8)< n )  \n" \
"            tmp[i]+=tmp[i+8];               \n" \
"        if(warp_thread_id <4 && (i+4)< n )  \n" \
"            tmp[i]+=tmp[i+4];               \n" \
"        if(warp_thread_id <2 && (i+2)< n)   \n" \
"            tmp[i]+=tmp[i+2];               \n" \
"        if(warp_thread_id==0 && (i+1)< n)   \n" \
"        {                                   \n" \
"            tmp[i]+=tmp[i+1];               \n" \
"            do                              \n" \
"            {                               \n" \
"                dot_value = old;            \n" \
"                old = convert_int( atomic_cmpxchg((volatile __global unsigned int*)&share_dot_p, convert_int(dot_value), convert_int(tmp[i] + dot_value)));  \n" \
"            } while (dot_value != old);     \n" \
"            //share_dot_p +=tmp[i];         \n" \
"        }                                   \n" \
"        if(thread_x==0)                  \n" \
"        {                                   \n" \
"                                            \n" \
"            do                              \n" \
"            {                               \n" \
"                dot_value = old;            \n" \
"                old = convert_int(atomic_cmpxchg((volatile __global unsigned int *) dot_p, convert_int(dot_value), convert_int(share_dot_p+dot_value)));  \n" \
"            } while(dot_value != old);                                                 \n" \
"               // *dot_p += share_dot_p;                                               \n" \
"                                                                                       \n" \
"        }                                                                              \n" \
"   }                                                                                   \n" \
"}                                                                                      \n" \
"\n";*

私が得ているエラー:

Build Program Info: ptxas application ptx input, line 160; error   : Label expected for argument 0 of instruction 'call'
ptxas application ptx input, line 160; error   : Call target not recognized
ptxas application ptx input, line 160; error   : Function 'atomic_cmpxchg' not declared in this scope
ptxas application ptx input, line 160; error   : Call target not recognized
ptxas application ptx input, line 185; error   : Label expected for argument 0 of instruction 'call'
ptxas application ptx input, line 185; error   : Call target not recognized
ptxas application ptx input, line 185; error   : Function 'atomic_cmpxchg' not declared in this scope
ptxas application ptx input, line 185; error   : Call target not recognized
ptxas application ptx input, line 161; error   : Unknown symbol 'atomic_cmpxchg'
ptxas application ptx input, line 186; error   : Unknown symbol 'atomic_cmpxchg'
ptxas fatal   : Ptx assembly aborted due to errors
error   : Ptx compilation failed: gpu='sm_13', device code='cuModuleLoadDataEx_4'
: Considering profile 'compute_13' for gpu='sm_13' in 'cuModuleLoadDataEx_4'
: Retrieving binary for 'cuModuleLoadDataEx_4', for gpu='sm_13', usage mode='  '
: Considering profile 'compute_13' for gpu='sm_13' in 'cuModuleLoadDataEx_4'
: Control flags for 'cuModuleLoadDataEx_4' disable search path
: Ptx binary found for 'cuModuleLoadDataEx_4', architecture='compute_13'
: Ptx compilation for 'cuModuleLoadDataEx_4', for gpu='sm_13', ocg options='  '
4

1 に答える 1

2

atomic_cmpxchgOpenCL のオプションの拡張機能の一部である を使用しているため、デバイスがそれをサポートしていることを確認してから、カーネル コードで有効にする必要があります。

  1. cl_khr_global_int32_base_atomicsによって返される拡張機能にリストされていることを確認しますclGetDeviceInfo(..., CL_DEVICE_EXTENSIONS, ...)

  2. カーネル コードの先頭に次を追加します。

#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable

__local または 64 ビット オペランドでアトミック関数を使用している場合は、追加の拡張機能を有効にする必要がある場合があることに注意してください。

#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable
#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable
#pragma OPENCL EXTENSION cl_khr_int64_base_atomics : enable
#pragma OPENCL EXTENSION cl_khr_global_int32_extended_atomics : enable
#pragma OPENCL EXTENSION cl_khr_local_int32_extended_atomics : enable
#pragma OPENCL EXTENSION cl_khr_int64_extended_atomics : enable

さらに、OpenCL 1.0 ではアトミック関数の名前が異なるため、OpenCL 1.1 以降を使用していることを確認してください。たとえば、NVidia のnvccユーティリティを使用してオフラインでカーネルをコンパイルする場合は、-archコマンド ライン スイッチを指定していることを確認してください。

これらの特定のエラーは、oclUtils.h とは無関係です。これは、ホスト (カーネルではない) コードで ocl* 関数を呼び出す場合にのみ必要な NVidia ヘッダー ファイルです。

于 2012-11-11T19:56:07.980 に答える