Ich versuche zu lernen, wie OpenCL mit diesem Tutorial https://anteru.net/blog/2012/11/04/2016/index.html zu verwenden, aber ich glaube nicht, dass die Werte in den Float-Puffer auf nichts festgelegt werden. und wenn ich den Puffer am Ende lese, ist es alles 0s mit einer Ansicht Dezimalzahlen in wissenschaftlicher Notation wie es voller Zufallsspeicher ist. Ich werde den Code unten posten. Was der Kernel macht, ist in 3 Parameter zu nehmen, float buffer x, float buffer y und float a. const int i = get_global_id(0)
und y[i] += a * x[i];
das Problem ist (ich denke), dass ich nie irgendwelche Zahlen in aBuffer oder bBuffer setzen, so dass die Multiplikationen und die Addition nichts bedeuten. aber eine seltsame Sache ist, dass, wenn ich den Kernel machen dies tun y[i] += a;
es immer noch die gleiche Leistung gibt, wenn ich denke, es wäre 2.OpenCL-Puffer ist leer
main.cpp geben würde:
#include <iostream>
#include <vector>
#ifdef __APPLE__
#include "OpenCL/opencl.h"
#else
#include "CL/cl.h"
#endif
using namespace std;
int main(int argc, const char * argv[]) {
cl_uint platformIdCount = 0;
clGetPlatformIDs(0, nullptr, &platformIdCount);
vector<cl_platform_id> platformIds(platformIdCount);
clGetPlatformIDs(platformIdCount, platformIds.data(), nullptr);
cout << "Platforms " << platformIdCount << endl;
cl_uint deviceIdCount = 0;
clGetDeviceIDs(platformIds[0], CL_DEVICE_TYPE_GPU, 0, nullptr, &deviceIdCount);
cout << "Devices " << deviceIdCount << endl;
vector<cl_device_id> deviceIds(deviceIdCount);
clGetDeviceIDs(platformIds[0], CL_DEVICE_TYPE_GPU, deviceIdCount, deviceIds.data(), nullptr);
const cl_context_properties contextProperties[] = {
CL_CONTEXT_PLATFORM,
reinterpret_cast<cl_context_properties>(platformIds[0]),
0,0
};
cl_int error = 0;
cl_context context = clCreateContext(contextProperties, deviceIdCount, deviceIds.data(), nullptr, nullptr, &error);
error = 0;
cl_mem aBuffer = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float) * (64), nullptr, &error);
cl_mem bBuffer = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float) * (64), nullptr, &error);
cl_program program;
clBuildProgram(program, deviceIdCount, deviceIds.data(), nullptr, nullptr, nullptr);
cl_kernel kernel1 = clCreateKernel(program, "SAXPY", &error);
clSetKernelArg(kernel1, 0, sizeof(cl_mem), aBuffer);
clSetKernelArg(kernel1, 1, sizeof(cl_mem), bBuffer);
static const float two = 2.0f;
clSetKernelArg(kernel1, 2, sizeof(float),&two);
const size_t globalWorkSize [] = {64,0,0};
cl_command_queue queue;
clEnqueueNDRangeKernel(queue, kernel1, 1, nullptr, globalWorkSize, nullptr, 0, nullptr, nullptr);
float done[64];
clEnqueueReadBuffer(queue, bBuffer, CL_TRUE, 0, sizeof(float)*64, done, 0, nullptr, nullptr);
for (int a = 0; a < 64; a++) {
cout << done[a] << endl;
}
clReleaseContext(context);
return 0;
}
.cl Datei:
kernel void SAXPY(__global float* x,__global float* y, float a){
const int i = get_global_id(0);
//y[i] = 2.0f;
y[i] += a * x[i];
}
Versuchen Aufruf 'clFinish (Warteschlange);' nach 'clEnqueueNDRangeKernel (Queue, kernel1, 1, nullptr, globalWorkSize, nullptr, 0, nullptr, nullptr); '. – sarasvati
was macht das? –
Es blockiert den aktuellen CPU-Thread und wartet, bis alle Befehle in der 'Warteschlange' vom OpenCL-Gerät (d. H. GPU) verarbeitet wurden. Es ist möglich, dass Ihr 'kernel1' die Berechnung nicht abgeschlossen hat, als Sie versucht haben, die Werte des Puffers zu lesen. – sarasvati