Я работаю в Julia, и мне нужно вызвать некоторые настраиваемые функции C, которые используют библиотеку ArraFire, когда я использую такой код:
void copy(const af::array &A, af::array &B,size_t length) {
// 2.Obtain the device, context, and queue used by ArrayFire
// 3.Obtain cl_mem references to af::array objects
cl_mem * d_A = A.device<cl_mem>();
cl_mem * d_B = B.device<cl_mem>();
// 4. Load, build, and use your kernels.
// Set arguments and launch your kernels
//kernel is the function build in step 4
clSetKernelArg(kernel, 0, sizeof(cl_mem), d_A);
clSetKernelArg(kernel, 1, sizeof(cl_mem), d_B);
clEnqueueNDRangeKernel(af_queue, kernel, 1, NULL, &length, NULL, 0, NULL, NULL);
// 5. Return control of af::array memory to ArrayFire
A.unlock();
B.unlock();
}
Я использовал в качестве ссылки пример, приведенный в: Взаимодействие с OpenCL
Я вызываю эту функцию в Юлии следующим образом:
ccall((:copy,"path/to/dll"),Cvoid(Ref{af_array},Ref{af_array}),Af.arr,Bf.arr)
Af
и Bf
- массивы ArrayFire, вызов работает, как и ожидалось, проблема заключается в том, чтокогда я использую B=A
только для проверки, т. е.
void copy(const af::array &A, af::array &B,size_t length) {
B=A;//only to test
}
, остановка вызова работает в Джулии, это заставило меня усомниться, что я использую правильный способ написания и вызова этой функции.
Некоторые из функций Arrayfire, включенных в Julia, которые я видел, вызывают функции, у которых af_array
являются аргументами, отличными от аргументов af :: array
.Ну, я хочу изменить аргументы, затем я делаю это:
void copy(const af_array &dA, af_array &dB,size_t length) {
//this to be able to use A.device and B.device
array A=array(dA);
array B=array(dB);
//steps 2 to 5 in the original code
}
Это не работает в C или в Джулии, вопрос в том, хочу ли я использовать af_array в качестве аргументов, как я получаю указатель устройства?или как правильно использовать эти функции, чтобы избежать проблем, когда я вызываю их у Джулии?
заранее спасибо.
UPD
Я изменил B=A;
внутри функции:
void copy(const af::array &A, af::array &B,size_t length) {
size_t len = A.dims(0);
seq idx(0, len - 1, 1);
af::copy(B, A, idx);
}
И работает!Тем не менее, я все еще сомневаюсь, что это правильный путь, так как этот код очень прост.Я буду работать с более сложным кодом, который может перестать работать аналогичным образом.