Я пытаюсь перекрывать передачу данных и выполнение ядра, используя CUDA C ++.
I создал массив, разделите его на 8 кусков, а затем назначьте каждый из чанков в соответствующий поток CUDA, используя следующее для цикла: < /p>
memset(a, 0, bytes);
for (int i = 0; i < nStreams; ++i) {
int offset = i * streamSize;
cudaMemcpyAsync(&d_a[offset], &a[offset],
streamBytes, cudaMemcpyHostToDevice,
stream[i]);
kernel(d_a, offset);
cudaMemcpyAsync(&a[offset], &d_a[offset],
streamBytes, cudaMemcpyDeviceToHost,
stream[i]);
}
< /code>
Поскольку мой графический процессор имеет только один асинхронный двигатель, теоретически, заказ передачи данных должен быть:
H2D[0] -> D2H[0] -> H2D[1] -> D2H[1] -> ...
Однако, используя систему NSIGHT для профилирования моей программы, результат подобен следующему:
Мы можем видеть, что второй h2 не заблокированным. Переводы идеально следуют теории. < /p>
Мне интересно, почему такой результат произойдет. Может ли кто -нибудь придумать значимое объяснение тому, что происходит под капюшоном? Спасибо большое!#include
__global__ void kernel(float *a, int offset)
{
int i = offset + threadIdx.x + blockIdx.x*blockDim.x;
float x = (float)i;
float s = sinf(x);
float c = cosf(x);
a = a + sqrtf(s*s+c*c);
}
int main(int argc, char **argv)
{
const int blockSize = 256, nStreams = 8;
const int n = 160 * 1024 * blockSize * nStreams;
const int streamSize = n / nStreams;
const int streamBytes = streamSize * sizeof(float);
const int bytes = n * sizeof(float);
int devId = 0;
if (argc > 1) devId = atoi(argv[1]);
Я пытаюсь перекрывать передачу данных и выполнение ядра, используя CUDA C ++. I создал массив, разделите его на 8 кусков, а затем назначьте каждый из чанков в соответствующий поток CUDA, используя следующее для цикла: < /p> [code]memset(a, 0, bytes); for (int i = 0; i < nStreams; ++i) { int offset = i * streamSize; cudaMemcpyAsync(&d_a[offset], &a[offset], streamBytes, cudaMemcpyHostToDevice, stream[i]); kernel(d_a, offset); cudaMemcpyAsync(&a[offset], &d_a[offset], streamBytes, cudaMemcpyDeviceToHost, stream[i]); } < /code> Поскольку мой графический процессор имеет только один асинхронный двигатель, теоретически, заказ передачи данных должен быть: H2D[0] -> D2H[0] -> H2D[1] -> D2H[1] -> ...[/code] Однако, используя систему NSIGHT для профилирования моей программы, результат подобен следующему:
Мы можем видеть, что второй h2 не заблокированным. Переводы идеально следуют теории. < /p> Мне интересно, почему такой результат произойдет. Может ли кто -нибудь придумать значимое объяснение тому, что происходит под капюшоном? Спасибо большое!#include
__global__ void kernel(float *a, int offset) { int i = offset + threadIdx.x + blockIdx.x*blockDim.x; float x = (float)i; float s = sinf(x); float c = cosf(x); a[i] = a[i] + sqrtf(s*s+c*c); }
int main(int argc, char **argv) { const int blockSize = 256, nStreams = 8; const int n = 160 * 1024 * blockSize * nStreams; const int streamSize = n / nStreams; const int streamBytes = streamSize * sizeof(float); const int bytes = n * sizeof(float);
int devId = 0; if (argc > 1) devId = atoi(argv[1]);
Я пытаюсь перекрывать передачу данных и выполнение ядра, используя CUDA C ++.
I создал массив, разделите его на 8 кусков, а затем назначьте каждый из чанков в соответствующий поток CUDA, используя следующее для цикла:
memset(a, 0, bytes);
for (int...
Я пытаюсь перекрывать передачу данных и выполнение ядра, используя CUDA C ++.
I создал массив, разделите его на 8 кусков, а затем назначьте каждый из чанков в соответствующий поток CUDA, используя следующее для цикла:
memset(a, 0, bytes);
for (int...
Я реализую свою систему микросервисов с помощью eureka и шлюза с весенней загрузкой Java.
В настоящее время у меня есть 2 сервиса: продукт и пользователь. В таблице продуктов в службе продуктов поле CreateBy — это идентификатор пользователя в...
Я использую загрузочную карусель, но ее элементы работают неправильно. Индикаторы не отображаются, а стрелки не перемещают карусель. Также возникают проблемы, когда я меняю анимацию со слайда на затухание. Я пробовал экспериментировать с источниками...
Я следил за блогами, онлайн-статьями, видео для GCD и наткнулся на очередь целевых терминов (в некоторых блогах). Я думал, что понял GCD, но потом эта терминология целевой очереди меня очень смутила.