首页 > 解决方案 > OpenCL 在 AMD 平台上无法正常运行

问题描述

我猜随机结果的问题可能来自同步。所以我使用一些事件来同步命令队列。

cl::Event evtWriteBufferFinished;
errNum = queues[0].enqueueWriteBuffer(buffers[0], CL_FALSE, 0, sizeof(cl_int)*NUM_BUFFER_ELEMENTS*devices.size(), inputOutput, NULL, &evtWriteBufferFinished);

std::vector<cl::Event> events;

for (size_t i = 0; i < queues.size(); i++)
{
    cl::Event evt;

    std::vector<cl::Event> waitEvts(1, evtWriteBufferFinished);

    errNum = queues[i].enqueueNDRangeKernel(kernels[i], 
        cl::NullRange, 
        cl::NDRange(NUM_BUFFER_ELEMENTS),
        cl::NDRange(1), &waitEvts, &evt);

    events.push_back(evt);
}

cl::Event evtReadBufferFinished;
errNum = queues[0].enqueueReadBuffer(buffers[0], CL_FALSE, 0, sizeof(cl_int)*NUM_BUFFER_ELEMENTS*devices.size(), inputOutput, &events, &evtReadBufferFinished);
evtReadBufferFinished.wait();

又没有随机结果了!

但是出现了新的问题:

CL_DEVICE_TYPE: 4
CL_DEVICE_TYPE: 2
 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521 1600 1681 1764 1849 1936 2025 2116 2209 2304 2401 2500 2601 2704 2809 2916 3025 3136 3249 3364 3481 3600 3721 3844 3969 4096 4225 4356 4489 4624 4761 4900 5041 5184 5329 5476 5625 5776 5929 6084 6241 6400 6561 6724 6889 7056 7225 7396 7569 7744 7921 8100 8281 8464 8649 8836 9025 9216 9409 9604 9801 10000 10201 10404 10609 10816 11025 11236 11449 11664 11881 12100 12321 12544 12769 12996 13225 13456 13689 13924 14161 14400 14641 14884 15129 15376 15625 15876 16129
 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255

CPU上的内核无论如何都没有运行。

我检查代码并测试:

std::vector<cl::Platform> platforms;
cl_int errNum = cl::Platform::get(&platforms);
if (errNum != CL_SUCCESS || platforms.empty())
{
    std::cerr << "Failed to find any OpenCL platforms." << std::endl;
    return 1;
}

auto platform = platforms[0];

如果我使用平台 [0],则会返回错误的结果。如果我使用平台[1],没有问题!

在我的笔记本电脑中:platforms[0] 是“AMD Accelerated Parallel Processing”平台[1] 是“Intel(R) OpenCL”

为什么?

我怎么解决这个问题?谢谢

标签: openclamd

解决方案


推荐阅读